基于Jenkins+Gitlab的自動化部署實戰

故事背景

  一個中小型企業,是典型的互聯網公司,當初期的時候可能運維只能標配到2~3人,此時隨著公司的發展,項目會逐漸增多。前期部署項目可能都是手動的,

俗稱“人肉部署”,這簡直是無比的痛苦,不能忍受的。這樣開發的時間也會耽誤,運維的時間也會耽誤,全都浪費在這些重復性的工作上面,毫無價值可言,

這時候運維終于忍受不了,上了腳本。但是慢慢的發現項目依舊在增長,腳本每次還要更改給開發,效率低下,后來測試環境以及開發環境直接上了jeknins,

每臺開發機器是jeknins agent端,自此,開發環境運維終于解脫了出去。但是線上上線運維依舊、所以得定制一套線上上線的流程標準,然后上jenkins自動化。

前提標準

? ? 想要實現自動化的前提是標準化,例如程序的日志目錄、程序目錄、程序目錄命名、代碼分支、代碼命名規則、程序高可用. 針對以上內容我們給開發做了

嚴格的標準并落地執行。

在此我會以Java程序為例子,因為我見到的最多的就是java程序比較麻煩,而php或者python可能只需要在服務器上git pull更新一下代碼就可以了。

  tomcat規則: 每臺服務器放置一個tomcat,tomcat使用ROOT.war,并配置日志切割

  程序目錄:統一使用tomcat進行管理,所有的項目統一打出war包,放置tomcat下面命名為ROOT.war

  程序日志:統一放置在規定的目錄,例如: /apps/logs/$app.log

  代碼分支:不同的環境使用不同的分支,開發 dev分支, 測試 test 分支, 預發布 pre分支, 生產線上 master分支。分支隔離,不同環境取不同環境的配置

  代碼打包: 因為是java的代碼,我們選擇的是使用maven進行打包,開發只需要關心代碼層即可

  高可用: 每個程序必須支持多節點部署,不可出現單點故障的情況,否則不予上線.

自動化部署系統

  因為中型公司不可能配置運維開發,而開發只管開發的,所以運維只能是通過使用開源工具的方式來搭建自動化部署系統,組件如下圖:

?

上圖的Jenkins服務器即自己是自己的agent,gitlab服務器是代碼倉庫服務器,Jenkins服務器會調用腳本,腳本做一些響應的動作進行自動化上線。

自動化上線流程:?

?

下面進行步驟的分解:

?1. 運維人員登錄jeknins,在jenkins界面點擊響應的job,每個job是更新一個主機,job以服務名+ip組成,點擊后jeknins會調用Shell發布腳本,下面這些都是腳本完成

?2. 發布腳本所做的第一步就是獲取此項目的最新的代碼版本

?3. 發布腳本所做的第二部是使用maven進行打包,每個maven打包的參數都統一

?4. 將打包好的war包拷貝到目標服務器上面

?5. 將需要上線的主機在前端負載haproxy上面進行下線(針對核心業務,建議這么做,比較優雅,不太暴力)

? ? ? 方法參考:?http://www.cnblogs.com/topicjie/p/7106860.html

?6.重啟目標主機的tomcat服務

?7.測試url訪問,返回是否正常

?8.在haproxy上線該主機

?

腳本實例

?下面是一個線上使用的上線腳本,scp是通過ssh免密的方式,并且部署tomcat是java用戶. tomcat路徑是/usr/loca/tomcat,每臺主機一個tomcat

腳本必須指定要更新的主機,上線代碼路徑

分支線上默認master ,mvn配置為product參數

?注意: 此腳本中不包含 5,7,8 步驟,如果需要,請自行補充。

#!/bin/bash
################################################################## 
#
# Date :  2016/07/15
# Email:  gengjie@outlook.com
# Proj :  xx java項目
#
# 主要功能是更新線上tomcat服務使用.
# 使用此腳本必須配置java用戶免密碼登錄 
# 第一次必須手動將代碼clone到BASE_CODE_PATH目錄
################################################################## 
. /etc/profile# 定義此項目所包含的主機,以空格隔開,必須嚴格遵守
inc_host=("192.168.24.50" "192.168.24.51")##### *** 定義項目代碼存放目錄,必須定義正確 ***  ####
CODE_PATH="/app/code/xxxxxx"# 定義tomcat實例目錄
Tomcat_PATH="/usr/local/tomcat"# 定義git分支,默認是master分支
CODE_BRANCH='master'# 定義編譯配置文件,生產環境默認應是product,此處是pom.xml文件中定義
MVN_CONF="product"# 獲取需要更新的主機IP
U_host="$1"# Define help
usage() {echoecho -e "   Usage : sh ./`basename $0` ipaddress"echo
}code_pull() {echo "[Info] --->>> 項目開始更新代碼... <<<---"cd $CODE_PATHgit checkout $CODE_BRANCHgit pull -u origin master:master if [ $? -ne 0 ];thenecho "Git Pull Code Error"exit 1fiecho "[Succ] --->>> 項目代碼更新完成... <<<---"echo 
}# Define build war
mvn_build() {cd $CODE_PATHecho "[Info] --->>> 項目開始編譯... <<<---"mvn clean package -P $MVN_CONFif [ $? -ne 0 ];thenecho "[Error] Compile Error,Please Check Your Code."exit 1fiecho "[Succ] --->>> 項目編譯完成... <<<---"echo
}# Define publish 
push_remote() {echo "[Info] --->>> 開始發布主機: $U_host  <<<---"ssh $U_host "/bin/rm -rf ${Tomcat_PATH}/webapps/ROOT*"scp ${CODE_PATH}/target/*.war $U_host:$Tomcat_PATH/webapps/ROOT.warssh $U_host "/bin/sh /app/scripts/stop_tomcat.sh"sleep 3ssh $U_host "source /etc/profile;/bin/sh ${Tomcat_PATH}/bin/catalina.sh start"  echo "[Succ] --->>> 主機: $U_host 發布完成. <<<---"echo}# check host
check_host() {for host in  ${inc_host[@]};doif [[ "$U_host" == "$host" ]];thenreturn 0fidonereturn 1
}# Check user
check_user() {if [ `whoami` != 'java' ]; thenecho "---------------------------------------------------"echo "You must use the Java user to run this script !!!"echo "---------------------------------------------------"exit 3fi
}check_user#check args
if [ $# -ne 1 ];thenusage;exit 1
fi
if [ $1 == "-h" -o $1 == "--help" ];thenusage;exit 1
ficheck_host
if [ $? != 0 ];thenecho "Please check the server ip address to be updated !"exit 64
ficode_pull
mvn_build
push_remote    

  

?自此,以上可以實現在jenkins點擊一下,服務一會自己就上好了,雖然說還有很多地方需要改進,但是一般中小型公司采用這種方式則是足夠了,

只能持續的進行優化,當然,再厲害一點的公司可以自己開發運維平臺。

  

轉載于:https://www.cnblogs.com/topicjie/p/7107895.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371803.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371803.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371803.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

cmd如何刷新MySQL數據庫_怎樣在cmd中用命令操作MySQL數據庫 需要技巧

用命令來操作MySQL是工作必備的&#xff0c;今天我就來分享一下cmd命令操作MySQL數據庫的方法&#xff0c;希望有幫助。工具/材料電腦xampp操作方法01首先&#xff0c;啟動MySQL服務才行哦。這里我是用xampp集成的數據庫&#xff0c;方便&#xff0c;點擊‘start’。02如圖&…

Java順序IO性能

許多應用程序將一系列事件記錄到基于文件的存儲中&#xff0c;以供以后使用。 從日志記錄和審核&#xff0c;直到在事件源設計或其緊密相關的CQRS中保留事務重做日志&#xff0c;這都可以是任何東西。 Java具有多種方法&#xff0c;可以通過這些方法將文件順序寫入或重新讀取。…

text段,data段,bss段,堆和棧

.bss段和.data段的區別 text段,data段,bss段,堆和棧轉載于:https://www.cnblogs.com/jingzhishen/p/6203107.html

[BZOJ3529][Sdoi2014]數表

[BZOJ3529][Sdoi2014]數表 試題描述 有一張Nm的數表&#xff0c;其第i行第j列&#xff08;1 < i < n&#xff0c;1 < j < m&#xff09;的數值為能同時整除i和j的所有自然數之和。給定a&#xff0c;計算數表中不大于a的數之和。輸入 輸入包含多組數據。輸入的第一行…

ZK的實際應用:MVVM –表單綁定

這是我們從頭開始構建ZK應用程序的第二集。 上一篇文章涉及使用MVVM將數據加載和呈現到表中。 在本文中&#xff0c;我們將向您介紹ZK MVVM的表單綁定。 目的 我們將構建一個“添加”功能&#xff0c;使我們能夠將新條目保存到清單中。 單擊“添加”時出現表格 單擊“保存”…

群暉按裝mysql_如何連接群暉里的MYSQL數據庫

匿名用戶1級2018-08-27 回答一、連接遠程數據庫&#xff1a;1、顯示密碼如&#xff1a;MySQL 連接遠程數據庫(192.168.5.116)&#xff0c;端口“3306”&#xff0c;用戶名為“root”&#xff0c;密碼“123456”C:/>mysql -h 192.168.5.116 -P 3306 -u root -p1234562、隱藏密…

ZK的實際應用:MVVM –以編程方式更新視圖

在前兩篇文章中&#xff0c;我們使用ZK的MVVM功能來&#xff1a; 將數據加載到表中 使用表單綁定保存數據 我們已經看到&#xff0c;用注解NotifyChange&#xff08;&#xff09;裝飾方法時&#xff0c;在執行完成后&#xff0c;將向Binder通知VM屬性的更改&#xff0c;以便B…

給你一個笑臉

今日冬至&#xff0c;愿你笑靨如初 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" /> <title>Document</title> </head> <body> <canvas id"mycanvas" width"800px&qu…

mysql安裝與配置的截圖_windows下MySQL5.6版本安裝及配置過程附有截圖和詳細說明...

隨著MYSQL版本的更新以及電腦系統的變化&#xff0c;我們給大家整理了各種電腦環境下安裝MYSQL的圖解過程&#xff0c;希望我們整理的內容能夠幫助到大家&#xff1a;mysql安裝圖解總結https://www.jb51.net/article/142398.htm編輯者&#xff1a;Vocabulary下面詳細介紹5.6版本…

mysql 更新日的數據類型_[每日更新-MySQL基礎]5.常用的數據類型-整數和字符串

1. 數據類型在學習PHP的時候我們已經講過數據類型了&#xff0c;所謂數據類型就是數據的格式。每一種數據類型在計算機中存儲的方式會有差異&#xff0c;占用的存儲容量也有區別&#xff0c;所以選擇合適的數據類型可以節約我們的存儲成本&#xff0c;也方便我們的程序運行和…

Hello World with Spring 3 MVC

在2005年&#xff0c;我對Martin Fowler的這篇文章對Spring進行了介紹。從那時起&#xff0c;我就修改了許多IoC框架&#xff0c;包括Guice &#xff0c; PicoContainer &#xff0c; NanoContainer等。雖然我很喜歡與IoC一起工作&#xff0c;但我必須說Spring在過去的5年中&am…

ansible 安裝

1、簡介 ansible是新出現的自動化運維工具&#xff0c;基于Python開發&#xff0c;集合了眾多運維工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的優點&#xff0c;實現了批量系統配置、批量程序部署、批量運行命令等功能。ansible是基于模塊工作的&#…

JS原型詳解

參考的別人家的博客http://www.cnblogs.com/ljchow/archive/2010/06/08/1753526.html ###JS原型####JS原型&#xff0c;就是原型對象&#xff0c;簡稱原型。不僅構造函數有&#xff0c;普通函數也有* 普通函數&#xff1a;javascript function puTong(){ }; alert(puTong.proto…

c# mysql 插入 和 查詢_C#對數據庫的操作(增刪改查)

1、【在web.config文件中配置】2、【連接字符串】private static readonly string StrCon ConfigurationManager.ConnectionStrings["sqlConnection"].ToString();3、【查詢數據方法】/// /// 查詢數據/// /// 查詢語句/// 參數/// public static DataTable QueryDa…

利用docker在window7下安裝TensorFlow

安裝過程下碰了不少坑&#xff0c;記錄一下安裝過程&#xff0c;方便以后有需要時復用。 1、安裝docker 下載最新版本的docker并且默認安裝即可&#xff0c;安裝后打開Docker Quickstart Terminal&#xff0c;初次進去需要一段時間。 下載網址&#xff1a;https://www.docker.c…

哈希長度擴展攻擊

在這篇文章中&#xff0c;我將盡力避免夏季的低迷&#xff0c;而將重點放在比抱怨天氣更有趣的事情上-哈希長度擴展攻擊。 散列長度擴展攻擊沒什么復雜或復雜的&#xff0c;說實話&#xff0c;這只是關于如何使用散列函數。 正如我以前的一篇文章中所討論的那樣&#xff0c;哈希…

2017年07月03號課堂筆記

2017年07月03號 星期一 多云 空氣質量&#xff1a;輕度污染~中度污染 內容&#xff1a;MySQL第四節課 in和not in&#xff1b;兩個表的內連接&#xff1b;exists和not exsits的使用&#xff1b;all,any和some&#xff1b; 使用子查詢的注意事項&#xff1b;sql優化&#xff08…

excel文件被寫保護怎么解除_u盤被寫保護怎么解除,看完你就知道了

在平常我們使用U盤存儲資料過程中&#xff0c;有時會發現U盤出現無法正常讀寫的現象&#xff0c;具備表現為U盤被寫保護&#xff0c;無法正常執行讀寫操作。對于小編給大家提供以下解決方法&#xff0c;希望對大家能有所幫助。對U盤執行重置操作01上網搜索并下載“USBOOT”程序…

新建MAVEN項目--pom.xml報錯

使用集成了maven的Eclipse版本新建maven項目后&#xff0c;配置文件pom.xml會在project以及引用的xsd文件處出現錯誤&#xff08;第一、二行報錯&#xff09; 其中一個報錯例子&#xff1a; Multiple annotations found at this line:- Plugin execution not covered by lifecy…

OSGi案例研究:模塊化vert.x

OSGi使Java代碼可以清晰地劃分為多個模塊&#xff0c;這些模塊稱為捆綁軟件 &#xff0c;可以訪問由每個捆綁軟件的類加載器控制的代碼和資源。 OSGi 服務提供了一種附加的分離機制&#xff1a;接口的用戶不需要依賴于實現類&#xff0c;工廠等。 以下案例研究旨在使OSGi捆綁包…