jenkins配置记录(2)--代码发布流程
?
在我們的日常運維工作中,使用jenkins來完成業務代碼發版上線是至關重要的一環。
前面已經提到在jenkins上添加用戶權限的操作,今天重點說下如何在jenkins下構建項目工程進行代碼發布?
在此簡單介紹下jenkins進行代碼發布的流程(根據本人的經歷而述)。
1)代碼上線要經歷四個場景:Dev開發環境-->Test測試環境-->Beta驗收環境-->Online線上環境
Dev開發環境:開發人員在開發機上自行開發,開發后將代碼上傳到svn/git版本控制系統里。
Test測試環境:將代碼從svn下載并同步到測試機(Test環境發版),通知測試同事進行上線前的業務測試。
Beta驗收環境:測試同事測試ok后,將代碼同步到Beta機上(Beta環境發版),然后通知產品/運營同事進行上線前的驗收。
Online線上環境:待Beta驗收ok后,再將代碼同步到線上機器上,最終完成Online發版。
2)Test測試環境下的發版,沒有放到jenkins上操作(當然也是可以放到kenins上構建測試項目工程的),直接是在服務器上寫的發版腳本進行的。
3)Beta驗收環境和Online線上環境的發版是放在jenkins上構建項目工程完成的,上線發版分為全量發版(全部同步)和增量發版(個別文件同步)。
發版是根據svn的tag標記,由release區分版本號進行的。具體情況如下:
? ?
?
全量發布流程:
第一步:構建FH_Diff_Release項目,構建時會提示選擇一個release版本號。根據上線人員要求的release版本號(一般是最新的release號)進行構建。將代碼從svn下載到jenkins本地(即放到對應項目的workspace目錄下,也就是放在/usr/local/tomcat7/webapps/jenkins/jobs/FH_Diff_Release下)。構建后
發布日志里會留有一個版本號(比如20161028183745)
第二步:構建FH_Beta項目,構建時會提示輸入VERSION版本號。使用FH_Diff_Release最近一次構建后的版本號(如上面的20161028183745)構建FH_Beta。構建后發布日志里同樣也會留有一個版本號(也是20161028183745)。到這里完成Beta環境的驗收工作,驗收完成后
才可以進行代碼上線工作。
第三步:構建FH_Online項目,構建時會提示輸入VERSION版本號。使用FH_Beta最近一次構建后的版本號(也就是上面的20161028183745)構建FH_Online。至此完成代碼全量上線。
增量發布流程:
重復上面的第一步和第二部,將代碼發布到Beta環境進行驗收,驗收通過后,就可以進行代碼上線了。
第三步:構建FH_Diff_Beta,構建時會提示輸入FILE_LIST(一般不會是文件的全路徑,是文件的部分路徑,具體參考shell腳本里對此參數的引用設置)。輸入要同步的個別文件進行構建即可。構建后發布日志里也會留有一個版本號(比如20161014371145).
第四部:構建FH_Online項目,構建時會提示輸入VERSION版本號。使用FH_Diff_Beta最近一次構建后的版本號(也就是上面的20161014371145)構建FH_Online。至此完成代碼增量上線。
?
另外:
上面在構建工程項目時要求輸入的參數VERSION和FILE_LIST都是在項目配置里定義的(具體下面會提到),并且這兩個參數在對應項目配置里的shell腳本里都會被引用。
同時,針對FH_Online項目,還可以創建FH_Rollback(使用ROLLBACK_VERSION參數),即Online環境的回滾方案(當然Test和Beta環境也可以創建回滾項目。一般會寫一個回滾腳本,同步前都會做一次備份,回滾腳本可依據自己的情況而定義)。
?
-------------------------------------------------------------------------------
廢話不多說,下面記錄下jenkins創建工程,構建項目發版的具體流程:
首先新建一個工程任務:
按照上面總結的上線發版流程,這里舉出一個業務線的代碼發版的項目,依次列出全量、增量發版的工程:
FF_Diff_Release
FF_Beta
FF_Diff_Beta
FF_Online
FF_Rollback?
1)FF_Diff_Release項目配置
接下來對這個項目進行配置
首選”啟用項目安全“,選擇對該項目具有操作權限的用戶。一般而言,除了運維人員(管理員)具有所有項目操作的權限外,一般只給開發人員(通常是項目組的負責人)Beta環境下的項目操作權限。如下,只給caogaokui和yuxiaogang這兩個用戶(提前在“管理用戶”里創建好的用戶)設置下面三個權限,說明他們對該項目由構建的權限。
?
在“參數化構建過程”中選擇“List Subversion tags(and more)”,填寫相應業務svn的url;這里在對應項目的svn(如下面的svn://192.168.9.120/fangfull_new)下特意創建了一個release目錄,在該目錄下建立易于區分的版本號目錄(如rel_20161031,里面存放業務代碼)用于jenkins發布版本。這樣在構建此工程的時候,就會出現提示選擇一個release版本號(下面會演示到);
下面填寫的svn://192.168.9.120/fangfull_new/releases最好提前在jenkins本機用svn co測試執行一下(用對應的的svn賬號和密碼,執行一會兒就ctrl+c結束就行),看看能否正常通過svn下載,不然可能會有報錯。 ?如下:即將svn://192.168.9.120/fangfull_new/releases下的版本目錄作為參數SVN_releases,用于構建工程時的提示
?
下面的提示不用在意,不影響。?
?
最后,調用shell同步的腳本(腳本在jenkins本機上定義的,這里填寫腳本的執行命令就行)
?
?
-----------------------------------------------------------------------------------------------------------
這里列舉下jenkins內置的環境變量(可以在jenkins構建的項目配置中直接引用,如上圖Shell腳本中引用的${JOB_NAME})
BUILD_NUMBER, 唯一標識一次build,例如23;
BUILD_ID,基本上等同于BUILD_NUMBER,但是是字符串,例如2011-11-15_16-06-21;
JOB_NAME, job的名字,例如JavaHelloWorld;
BUILD_TAG, 作用同BUILD_ID,BUILD_NUMBER,用來全局地唯一標識一此build,例如jenkins-JavaHelloWorld-23;
EXECUTOR_NUMBER, 例如0;
NODE_NAME,slave的名字,例如MyServer01;
NODE_LABELS,slave的label,標識slave的用處,例如JavaHelloWorld MyServer01;
JAVA_HOME, java的home目錄
WORKSPACE,job的當前工作目錄
HUDSON_URL = JENKINS_URL, jenkins的url,例如http://localhost:8000/ ;
BUILD_URL,build的url 例如http://localhost:8000/job/JavaHelloWorld/23/;
JOB_URL, job的url,例如http://localhost:8000/job/JavaHelloWorld/;
SVN_REVISION,svn 的revison
-----------------------------------------------------------------------------------------------------------
下面貼出該項目配置中調用的shell腳本(腳本中的192.168.1.106是其中的一臺線上服務器):
先從線上機器拷貝一份代碼下來,放到腳本中的${CODE_DIR}目錄下
接著將代碼從svn下載到腳本中的${WORKSPACE}中,然后再同步到腳本中的${FILE_DIR}/${VERSION}目錄下,已等待后續發往beta環境中。
然后執行這個工程的構建,如下,構建時會提示你選擇一個SVN_release的版本號。
上面的rel_*版本目錄作為SVN_releases參數,是開發人員上傳到svn://192.168.9.120/fangfull_new/releases下的,通過svn能看到:
?
?
----------------------------------------------------------------------------------------------------------------------------------------
另一種形式:
上面的FF_Diff_Release項目配置中采用了“發版時選擇release版本號”的配置(如上截圖中)
也可以不采用上面這種方式:
直接配置一個svn的url(分支或主干)就行,不啟動上面的“參數化構建過程”
這樣,點擊“構建”的時候就直接執行項目構建了,沒有上面的選擇版本號的提示了
如下的一個項目,就跟上面的FF_Diff_Release項目配置不一樣,具體采用哪種方式,根據自己的情況而定。
?
最簡單的做法還可以是:在jenkins本機提前編寫好代碼同步的腳本(svn操作在腳本中定義),然后在jenkins界面里的項目構建配置中只引用shell腳本構建即可。
----------------------------------------------------------------------------------------------------------------------------------------
2)FF_Beta項目配置
啟用“參數化構建過程”,選擇“String Parameter”,里面填寫“VERSION”。這樣構建這個工程時就會出現提示你輸入版本號,也就是輸入上面的FF_Diff_Release項目構建后打印的版本號(在Consloe Output日志里最底部可以看到)構建。
接下來不需要再設置“源碼管理”了,直接引用shell腳本即可。
?下面貼出該項目配置中調用的shell腳本(腳本中的192.168.1.25是beta服務器),可以看出,上面設置的VERSION參數,在腳本里已經被引用到了。
[root@jenkins-server Shell]# cat FF_Beta.sh #!/bin/bash FILE_DIR="/var/lib/jenkins/file_list/www.wangshibo.com" BETA_SERVER="192.168.1.25" BETA_DIR="/var/www/vhosts/www.wangshibo.com"### define check_return ### check_return() {if [[ $? != "0" ]]; then/bin/echo $1exit 255fi }### check syntax errors ### /bin/echo "check syntax errors" for line in `/bin/find ${FILE_DIR}/${VERSION} -type f -name "*.php"`; do/Data/app/php5.5.1/bin/php -l "${line}" >/dev/null 2>&1check_return "syntax errors,please check ${line}" done### release to beta server ### /usr/bin/rsync -av -e "ssh -p25791" ${FILE_DIR}/${VERSION}/ root@${BETA_SERVER}:${BETA_DIR}/ check_return "release to beta server failed"### change directory permission ### /usr/bin/ssh -p25791 -t -q -o 'StrictHostKeyChecking no' root@${BETA_SERVER} "/bin/chown -R nobody:nobody /var/www/vhosts/www.wangshibo.com; /bin/chmod -R 755 /var/www/vhosts/www.wangshibo.com/main/protected/runtime /var/www/vhosts/www.wangshibo.com/main/protected/themes /Data/logs/www/fangfull.com" ### purge memcache ### #/usr/bin/ssh -t -q -o 'StrictHostKeyChecking no' root@${BETA_SERVER} "echo flush_all | nc 127.0.0.1 11221 ; echo flush_all | nc 127.0.0.1 11222" >/dev/null 2>&1### print version ### /bin/echo "Version : ${VERSION}"點擊構建腳本,就會出現輸入版本號的提示(注意上面Beta的shell腳本中有/Data/app/php5.5.1/bin/php進程,把這個php服務啟動起來;按照以上腳本中的意思是在代碼發布前,將代碼中的php文件搜索出來,然后用php執行下這些php腳本文件,如果有報錯,則終止這次構建,如果沒有報錯,則繼續進行代碼發布;具體按照自己的實際情況對腳本進行調試)
3)FF_Diff_Beta項目配置
?如下:參數名填寫為FILE_LIST,在構建該項目的時候會有這個參數的提示,即輸入要發布的文件,這是增量發版用到的(具體上面已經總結)。
?
接著直接引用shell腳本即可:
下面貼出該項目配置中調用的shell腳本(腳本中的192.168.1.25是beta服務器):
從腳本中可以看出:
上面“參數化構建”中定義的FILE_LIST在腳本中被引用到了。
同步前先從beta機器上將代碼備份一份到本機,然后再根據FILE_LIST進行增量同步。
點擊構建腳本,就會出現輸入文件的提示(多個文件之間用空格隔開),如下,輸入文件的格式路徑可以根據shell腳本中(注意上面腳本中的dirname命令,即取一個路徑的目錄部分(即去掉一個路徑最后一級后的部分路徑))
?
4)FF_Online項目配置
下面貼出該項目構建配置中引用的腳本(腳本中的192.168.1.106和192.168.1.220是線上服務器):
[root@jenkins-server Shell]# cat FF_Online.sh #!/bin/bash FILE_DIR="/var/lib/jenkins/file_list/www.wangshibo.com" CODE_DIR="/var/lib/jenkins/code_online/www.wangshibo.com" EXCLUDE_FILE="/var/lib/jenkins/code_online/www.wangshibo.com.exclude" ROLLBACK_DIR="/var/lib/jenkins/rollback/www.wangshibo.com" ONLINE_SERVER="192.168.1.106 192.168.1.220" REMOTE_SERVER="192.168.1.106" ONLINE_DIR="/var/www/vhosts/www.wangshibo.com"### define check_return ### check_return() {if [[ $? != "0" ]]; then/bin/echo $1exit 255fi }### check version ### if [[ ! -d ${FILE_DIR}/${VERSION} ]]; then/bin/echo "版本無效,請確認."exit 255 fi### update code ### /bin/echo "update online code" /usr/bin/rsync -a -e ssh --exclude-from ${EXCLUDE_FILE} root@${REMOTE_SERVER}:/var/www/vhosts/www.wangshibo.com/ ${CODE_DIR}/ check_return "update code failed"### backup code ### /bin/echo "backup online code" cd ${CODE_DIR} && /usr/bin/rsync -aR * ${ROLLBACK_DIR}/${VERSION}/ check_return "backup code failed"### release to online server ### for SERVER in ${ONLINE_SERVER}; do/bin/echo "release to ${SERVER}"/usr/bin/rsync -av -e "ssh -o 'StrictHostKeyChecking no'" ${FILE_DIR}/${VERSION}/ root@${SERVER}:${ONLINE_DIR}//usr/bin/ssh -t -q -o 'StrictHostKeyChecking no' root@${SERVER} "/bin/chown -R nobody:nobody /var/www/vhosts/www.wangshibo.com ; /bin/chmod -R 755 /var/www/vhosts/www.wangshibo.com/main/protected/runtime /var/www/vhosts/www.wangshibo.com/main/protected/themes /Data/logs/www/fangfull.com" >/dev/null 2>&1 done### print rollback version ### /bin/echo "Rollback Version : ${VERSION}"點擊構建腳本,就會出現輸入版本號的提示
5)FF_Rollback項目配置,即FF_Online的回滾方案,就是說上線如若出現問題,構建這個FF_Rollback工程就會自動回滾到上線前的狀態
?
?
?
下面是該回滾項目的shell腳本
[root@jenkins-server Shell]# cat FF_Rollback.sh #!/bin/bash FILE_DIR="/var/lib/jenkins/file_list/www.wangshibo.com" CODE_DIR="/var/lib/jenkins/code_online/www.wangshibo.com" EXCLUDE_FILE="/var/lib/jenkins/code_online/www.wangshibo.com.exclude" ROLLBACK_DIR="/var/lib/jenkins/rollback/www.wangshibo.com" ROLLBACK_VERSION=`/bin/ls -l /var/lib/jenkins/rollback/www.wangshibo.com|tail -1|awk '{print $9}'` ONLINE_SERVER="192.168.1.106 192.168.1.220" ONLINE_DIR="/var/www/vhosts/www.wangshibo.com"### define check_return ### check_return() {if [[ $? != "0" ]]; then/bin/echo $1exit 255fi }### release to online server ### for SERVER in ${ONLINE_SERVER}; do/bin/echo "release to ${SERVER}"/usr/bin/rsync -av -e "ssh -o 'StrictHostKeyChecking no'" ${ROLLBACK_DIR}/${ROLLBACK_VERSION}/ root@${SERVER}:${ONLINE_DIR}//usr/bin/ssh -t -q -o 'StrictHostKeyChecking no' root@${SERVER} "/bin/chown -R nobody:nobody /var/www/vhosts/www.wangshibo.com ; /bin/chmod -R 755 /var/www/vhosts/www.wangshibo.com/main/protected/runtime /var/www/vhosts/www.wangshibo.com/main/protected/themes /Data/logs/www/fangfull.com ; cd /var/www/vhosts/www.wangshibo.com/main/qmjjrwap/themes/ntpl; /bin/rm -rf /var/www/vhosts/www.wangshibo.com/main/qmjjrwap/themes/ntpl/*; /bin/ln -s /var/www/vhosts/www.wangshibo.com/main/qmjjrwap/dist/themes/ntpl/qmjjrwap ./; /bin/chown -R nobody:nobody /var/www/vhosts/www.wangshibo.com/main/qmjjrwap/themes/ntpl/qmjjrwap" >/dev/null 2>&1 done### print rollback version ### /bin/echo "Rollback Version : ${VERSION}"回滾即是用最近一次的備份覆蓋到線上,腳本中的“ROLLBACK_VERSION”參數實際上取的就是最近一次的備份
[root@jenkins-server Shell]# ll /var/lib/jenkins/rollback/www.wangshibo.com total 72 drwxr-xr-x 9 root root 4096 Aug 10 12:24 20160810122352 drwxr-xr-x 9 root root 4096 Aug 12 18:05 20160812180522 drwxr-xr-x 9 root root 4096 Aug 19 17:59 20160819175910 drwxr-xr-x 9 root root 4096 Aug 29 10:41 20160826170848 drwxr-xr-x 9 root root 4096 Sep 8 19:52 20160908195214 drwxr-xr-x 9 root root 4096 Sep 14 19:40 20160914193917 drwxr-xr-x 9 root root 4096 Sep 20 18:33 20160920171701 drwxr-xr-x 9 root root 4096 Sep 22 13:41 20160922110959 drwxr-xr-x 9 root root 4096 Sep 22 16:19 20160922161415 drwxr-xr-x 9 root root 4096 Sep 23 20:30 20160923201543 drwxr-xr-x 9 root root 4096 Sep 23 21:57 20160923213311 drwxr-xr-x 9 root root 4096 Sep 23 22:12 20160923220941 drwxr-xr-x 9 root root 4096 Sep 29 21:24 20160929210300 drwxr-xr-x 9 root root 4096 Oct 17 16:13 20161017161120 drwxr-xr-x 9 root root 4096 Oct 17 19:51 20161017192718 drwxr-xr-x 9 root root 4096 Oct 26 17:17 20161025173337 drwxr-xr-x 9 root root 4096 Oct 28 18:58 20161028185753 drwxr-xr-x 9 root root 4096 Nov 2 17:03 20161102145159 [root@jenkins-server Shell]# /bin/ls -l /var/lib/jenkins/rollback/www.wangshibo.com|tail -1|awk '{print $9}' 20161102145159點擊這個回滾項目的構建,同樣會出現讓你輸入版本號的提示
?
?
******************************************************************************************************
擴展小提示:
截取目錄的方法,有以下兩種:
1)dirname命令:用于取給定路徑的目錄部分。這個命令很少直接在shell命令行中使用,一般把它用在shell腳本中,用于取得腳本文件所在目錄,然后將當前目錄切換過去。
其實就是取所給路徑的倒數第二級及其之前的路徑部分,如下:
[root@jenkins-server Shell]# dirname main/protected/xqsjmob/themes/tpl2/common/page_statistics.tpl
main/protected/xqsjmob/themes/tpl2/common
[root@jenkins-server Shell]# dirname /usr/local/tomcat7/webapps/jenkins/scripts/Shell
/usr/local/tomcat7/webapps/jenkins/scripts
[root@jenkins-server Shell]# dirname FF_Online.sh ? ? ? ? ? ?#取的結果既是當前路徑目錄下
.
2)可以用${pathname%/*}截取掉pathname后面的文件部分。
下面比較下這兩種方法的效果:即dirname取的是倒數第二級及其以上級的路徑,而${pathname%/*}取的是"刪除最后一個/符號后的路徑部分"
[root@jenkins-server Shell]# pathname=/usr/bin/sort; echo $(dirname $pathname) ${pathname%/*}
/usr/bin /usr/bin
You have new mail in /var/spool/mail/root
[root@jenkins-server Shell]# pathname=/usr/bin/sort/; echo $(dirname $pathname) ${pathname%/*}
/usr/bin /usr/bin/sort
[root@jenkins-server Shell]# pathname=/usr/; echo $(dirname $pathname) ${pathname%/*}
/ /usr
[root@jenkins-server Shell]# pathname=/usr; echo $(dirname $pathname) ${pathname%/*}
/
---------------------------------------------------------------------------------------------------
以上的項目在構建后,可以通過構建日志查看代碼發布情況:
如下:點擊“Console Output"查看日志
?
?通過查看Parameter參數得到本次構建動作所用到的VERSION版本號或FILE_LIST文件
?
?
?
?
?
待項目構建完成后,還可以創建視圖,將相關業務(應用)構建的工程放到同一個視圖下,有多少個應用就創建多少個視圖。如下創建視圖:
?
然后將相應的構建工程拉到這個視圖下進行管理
?
至此,一個完整項目的jenkins發版流程已經配置完成,后續上線發版只需要在這里一鍵構建執行即可。這僅僅是依據本人使用jenkins的經歷而梳理的,如有誤述,敬請指出,以待改正!
?
轉載于:https://www.cnblogs.com/kevingrace/p/6022447.html
總結
以上是生活随笔為你收集整理的jenkins配置记录(2)--代码发布流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle中start with...
- 下一篇: sed 解释正则表达式