jenkins 入門教程(中)
接上回繼續,本文以我託管在bitbucket上的一個開源項目spring-boot-rest-framework做爲演示,講解如何創建自動化部署。
一、創建item
點擊ok繼續,item的詳情頁面很長,我們分成一段段來講解,最上面這部分,除了名字要填寫外,其它全留空即可
然後是源代碼管理部分,這是一個git項目,先在Repository URL這裏填寫上項目的git地址(即:紅字1的位置),bitbucket是需要用戶名密碼才能訪問的,所以Credentials這裏要選擇相應的用 戶名、密碼(即:紅字2的部分),紅字3的部分爲git獲取的源代碼分支名稱,一般爲master主分支,也可以改成自己希望的分支。
可能有同學會問,紅字1處的git地址怎麼得到? 這個很簡單,bitbucket網站項目右上角里就有,見下圖:
另外,紅字2處對應的下拉框,首次進來時,應該是空的,可點擊右側的Add,添加用戶名,密碼,見下圖:
然後在Build的部分,點擊Add Build Step下拉框
本文中的這個項目是maven項目,所以我們選擇Invoke Maven3
然後輸入maven構建必要的參數,參考下圖:
然後保存,創建完成。
二、開始構建
保存後,系統會返回首頁,每個項目旁邊有一個小三角箭頭,選擇Build Now
稍等片刻,左側就會出現一個進度條,表示正在Building...
點擊這個進度條上的鏈接,會看到構建詳情
繼續點擊進度條前的#x的序號,會看到左側有一個Console Output
點擊output,可以實時看到構建過程中的所有輸出,內容大致如下:
從輸出內容可以看出構建的整個過程:先從git上拉取源碼,然後調用maven命令進行構建。只不過這一切是在UI界面完成的,以後項目的Build工作就可以交由運維甚至測試人員直接來做了,程序員只管提交代碼即可。
三、遠程分發
編譯成功只是第一步,接下來要將編譯後的文件打包上傳到遠程服務器,通常在上傳前會壓縮一下,即節省帶寬,也方便傳輸。
參考剛纔添加maven參數的做法,再次點擊Add build step,只不過這次選擇Execute shell,即執行腳本,腳本內容如下:
即:進入工作目錄下的target目錄,然後將編譯後的jar包壓縮成.tar.gz包,大家可以參考圖中的命令自行調整。
接下來要上傳到遠程服務器,理論上講,應該繼續在上面的腳本里追加一行scp deploy.tar.gz
user@remote_server:/remote_path之類的命令,大家可以嘗試一下,最後執行時多半會報沒有權限,原因是jenkins當前
運行的賬號通常不是root賬號,權限不夠。更好的做法是利用scp插件,以證書方式連接到遠程服務器(具體配置請參考上節SSH相關的部分),參考下圖:
在post-build actions下拉框裏,選擇Publish articifacts to SCP Repository
然後參考下圖填寫相應參數
然後保存,再次build,觀察Console Output
1 2 3 4 5 6 7 8 9 | ... Build step 'Invoke Maven 3' changed build result to SUCCESS [spring-boot-rest-framework] $ /bin/bash -xe /var/folders/sk/2f7knc1518g57382y5s4zxsr0000gn/T/hudson5867298139164607521 .sh + cd /Users/yjmyzz/ .jenkins /workspace/spring-boot-rest-framework + cd target + tar zcf deploy. tar .gz spring-boot-rest-framework-1.0.0.jar [SCP] Connecting to deploy [SCP] uploading file : '/opt/deploy/deploy.tar.gz' Finished: SUCCESS |
從輸出看,上傳文件已經ok
四、遠程應用重啓
最後就是遠程將上傳文件解壓,並啓動應用,我們可以事先寫一個shell腳本,放在服務器上(或者參考上一步的做法,用scp插件上傳到服務器),腳本內容參考下面這樣:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/bin/bash export JAVA_HOME= /opt/app/jdk1 .8.0_65 echo ${JAVA_HOME} dir_base= /opt/deploy cd ${dir_base} echo 'deploying...' if [ -r 'deploy.tar.gz' ]; then tar -zxvf deploy. tar .gz fi rm -rf *.gz rm -rf ${dir_base} /logs jar_name= 'spring-boot-rest-framework-1.0.0.jar' if [ $(pgrep -f ${jar_name} | wc -l) -gt 0 ]; then pkill -9 -f ${jar_name} fi echo ${dir_base}/${jar_name} nohup ${JAVA_HOME} /bin/java -jar ${dir_base}/${jar_name} > /dev/null 2>&1 & sleep 2 echo 'ok!' |
這段腳本的大概意思是,先檢測指定目錄下有無deploy.tar.gz文件,有的話就解壓,本文中的項目是一個spring-boot的項目,解
壓開後就是一個可獨立運行的jar包,然後先檢測當前進程中是否已經在運行,如果有,則先kill掉進程,最後用nohup以後臺方式運行jar包。假設
該腳本文件名爲deploy.sh,具備執行權限,我們可以在jenkins中通過插件遠程調用它,參考下圖的配置:
最後build下,還是觀察console output的變化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | Build step 'Invoke Maven 3' changed build result to SUCCESS [spring-boot-rest-framework] $ /bin/bash -xe /var/folders/sk/2f7knc1518g57382y5s4zxsr0000gn/T/hudson3712003549124736229 .sh + cd /Users/yjmyzz/ .jenkins /workspace/spring-boot-rest-framework + cd target + tar zcf deploy. tar .gz spring-boot-rest-framework-1.0.0.jar [SCP] Connecting to deploy [SCP] uploading file : '/opt/deploy/deploy.tar.gz' SSH: Connecting from host [yangjunmingdeMacBook-Pro. local ] SSH: Connecting with configuration [deploy] ... SSH: EXEC: STDOUT /STDERR from command [ /opt/deploy/deploy .sh] ... /opt/app/jdk1 .8.0_65 deploying... spring-boot-rest-framework-1.0.0.jar tar : spring-boot-rest-framework-1.0.0.jar: time stamp 2016-01-20 22:52:15 is 143461.67416312 s in the future /opt/deploy/spring-boot-rest-framework-1 .0.0.jar ok! SSH: EXEC: completed after 2,230 ms SSH: Disconnecting configuration [deploy] ... SSH: Transferred 0 file (s) Finished: SUCCESS |
從第16行輸出的ok來看,遠程部署已經成功。
最後上一張圖,大致描述了整個流程: