jenkins+gitlab鉤子+shell指令碼基於git的tag實現App增量更新

劍握在手發表於2017-06-26

轉自:http://blog.csdn.net/kingboyworld/article/details/54175330

 

環境安裝

jdk1.8

1.安裝jenkins

首先到https://jenkins.io/index.html下載jenkins的war包。上傳到自己的伺服器,放在自己對應的目錄下,執行nohup Java -jar jenkins.war --httpPort=8081,(nohup後臺執行),開啟IP:8081即可訪問到jenkins的頁面。第一次訪問需要設定密碼,務必要記住。之後跳轉到安裝外掛介面,建議選擇安裝推薦的外掛,其他需要的外掛在之後進行手動安裝。外掛安裝根據網路可能耗費較長時間。靜靜的等待安裝完成,之後輸入使用者名稱和密碼進入到jenkins的主頁面。

然後安裝我們接下來需要用到的外掛,選擇系統管理---管理外掛---可選外掛,將Gitlab Hook PluginGit pluginGit client plugin,已經安裝了則略過。

2.安裝gitlab

 

sudo yum install curl openssh-server openssh-clients postfix cronie
sudo service postfix start
sudo chkconfig postfix on
sudo lokkit -s http -s ssh
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo yum install gitlab-ce

執行上述命令即可通過yum安裝gitlab,摘自gitlab官網

 

 

配置並啟動GitLab
開啟/etc/gitlab/gitlab.rb,將external_url = 'http://Git.example.com'修改為自己的IP地址:http://xxx.xx.xxx.xx:8082,然後執行下面的命令,對GitLab進行編譯並執行。

sudo gitlab-ctl reconfigure

 

gitlab就安裝好了,預設的使用者名稱是root(我的是root)

3.配置webhook(鉤子)

在gitlab上新建一個專案,上傳不同的內容,並打上對應的tag,我的tag明明規則是大版本v1,v2,小版本的話v1.1,v1.2 (ps:在指令碼中會安裝一定規則對tag進行處理,所以命名要符合一定的規範)。

以最大許可權的gitlab賬戶登入gitlab,選擇建立的專案,點選右上角的設定,有個選項webhooks,點選進入。

新增url,新增的是jenkins的訪問地址例如http://0.0.0.0:8081/gitlab/build_now(我的jenkins在8081埠),接下來選擇的是觸發的機制,我選擇的是Tag push events,在前面勾選就可以。之後Add  webhook即可。可以點選測試,看看是否正常。

4.進入jenkins構建一個job

選擇新建,一、輸入一個job的名字,我的叫updateVersion,接下來選擇“構建一個自由風格的軟體專案”,點選ok對這個job進行具體的配置。

原始碼管理:選擇git,Repository URL輸入你的專案的地址,Credentials就是你gitlab的認證使用者名稱和密碼,點選Add新增後然後選擇就可以了。

Branch Specifier (blank for 'any‘)這個地方填寫你要針對哪個分支的變化觸發這個job。預設master,自己修改成相對應的分支即可。

在構建步驟中選擇execute shell執行shell指令碼。

我的shell貼出來(剛學一天shell寫的語法不是很好,很多不會,有點亂,高手勿噴)

 

[java] view plain copy
 
  1. #!/bin/bash  
  2. #author kingboy  
  3. #description: create tag list for update  
  4. #獲取當前專案的配置名稱  
  5. gitdir=$(less json.txt|awk -F"[:]" '/dir/{print$2}')  
  6. #要輸出的目錄路徑  
  7. dir="/Users/kingboy/Desktop/$gitdir"  
  8. #當前操作目錄  
  9. pwdPath=$(pwd)  
  10. #判斷是否有該目錄沒有則建立  
  11. if test -e ${dir}  
  12. then   
  13.     echo -e "${dir} exists!"  
  14. else   
  15.     mkdir $dir  
  16.     echo -e "${dir} create success!"  
  17. fi  
  18. #判斷兩個tag間的檔案變動列表並打包  
  19. zipDiffFiles(){  
  20.     tag1=$1  
  21.     tag2=$2  
  22.     git diff ${tag1} ${tag2} --name-only > ${dir}/${tag1}-${tag2}.log  
  23.     #git diff v8 v1 --name-only  
  24.     #shell將變化的檔案copy到專案目錄下的對應資料夾  
  25.     #先建立對應的資料夾  
  26.     if test -e ${dir}/${tag1}-${tag2}.tar  
  27.     then   
  28.         echo -e "${dir}/${tag1}-${tag2}.tar exists!"  
  29.     else  
  30.         mkdir ${dir}/${tag1}-${tag2}  
  31.         echo -e "${dir}/${tag1}-${tag2} create success!"  
  32.         #讀取變化的檔案列表並複製到對應的目錄下面,  
  33.         echo -e "----------------copy file---------------------"  
  34.         cat ${dir}/${tag1}-${tag2}.log | while read LINE  
  35.         do  
  36.             if test -e ${LINE}  
  37.             then  
  38.                 #同步檔案到nginx目錄下,同時複製目錄結構  
  39.                 #cp --parents -rf ${LINE} ${dir}/${tag1}-${tag2}/  
  40.                 #  
  41.                 rsync -arR  ${LINE} ${dir}/${tag1}-${tag2}/  
  42.             fi  
  43.         done  
  44.         #打包對應的目錄  
  45.         cd ${dir}  
  46.         zip  -rq ${tag1}-${tag2}.zip ${tag1}-${tag2}  
  47.         echo "zip ${tag1}-${tag2}.tar success!"  
  48.         cd $pwdPath  
  49.         #刪除資料夾  
  50.         rm -rf ${dir}/${tag1}-${tag2}  
  51.         #是否刪除log日誌檔案列表  
  52.         rm -rf ${dir}/*-*.log  
  53.     fi  
  54. }  
  55. #生成全量更新包  
  56. zip -r ${dir}/last.zip *  
  57. #生成不同版本間的更新包     
  58. #-n按照數字排序   -r 翻轉排序  -t 分隔符  -k以第幾列排序  
  59. echo -e "----------------tag list---------------------"  
  60. git tag | sort -n -r -t 'v' -k 2 |tee ${dir}/tagList.log #生成所有tag  
  61. #刪除版本資訊檔案  
  62. rm -rf ${dir}/update.json  
  63. #定義生成的版本個數  
  64. i=1  
  65. versionNumber=10  
  66. cat ${dir}/tagList.log | while read one  
  67. do  
  68.     cat ${dir}/tagList.log | while read two  
  69.     do  
  70.         #去掉自身和自身進行比較  
  71.         if test ${one} = ${two}  
  72.         then  
  73.             continue  
  74.         fi  
  75.         #-------------------------------  
  76.         #去掉重複的包   當新版不夠10個的時候,會生成 v7-v6  v6-v7   ,加上之後就不會了  
  77.         #外層只要一個迴圈,所以不需要了  
  78.         #if test ${two:1:${#two}} -gt ${one:1:${#one}}  
  79.         #then  
  80.         #   continue  
  81.         #fi  
  82.         #---------------------------------------  
  83.         #生成版本包  
  84.         if test $[i] -le $[versionNumber]  
  85.         then  
  86.             zipDiffFiles "$one" "$two"  
  87.             #刪除版本資訊檔案  已經放在上面進行處理了  
  88.             #重建版本資訊檔案  
  89.             echo "{\"$two\":\"${one}-${two}.zip\"}," >> $dir/update.json  
  90.         fi  
  91.         i=$(($i+1))  
  92.     done  
  93.     break  
  94. done  
  95. exit 0  


點選儲存,之後在gitlab上提交幾個修改,打個tag上傳到gitlab上,就會自動觸發構建任務。

 

說明一下:

jenkins還有很多用途,可以自動釋出專案,自動打包,自動測試等

 

 

json.txt是專案的規定名稱資訊,放在專案檔案中的json.txt中,內容如

{
 dir:newProject
}

目的是為不同專案生成的更新包,放在不同的nginx目錄下

update.json是當前所有更新包的資訊。app端請求該檔案,自行判斷是否需要更新,請求對應包的地址即可下載更新包,例如當前為v10,最新為v11,

則請求http://ip/newProject/v11-v10.zip即可。

參考來源:http://www.codesec.NET/view/428631.html,謝謝前輩的貢獻。

相關文章