天天看點

gitlab webhooks+jenkins+shell自動釋出一、Tag push events二、push events方式

一、Tag push events

環境安裝jdk1.81.

安裝jenkins

首先到https://jenkins.io/index.html下載下傳jenkins的war包。

上傳到自己的伺服器,放在自己對應的目錄下,執行nohupJava -jar jenkins.war –httpPort=8081,(nohup背景運作),打開IP:8081即可通路到jenkins的頁面。第一次通路需要設定密碼,務必要記住。

之後跳轉到安裝插件界面,建議選擇安裝推薦的插件,其他需要的插件在之後進行手動安裝。插件安裝根據網絡可能耗費較長時間。靜靜的等待安裝完成,之後輸入使用者名和密碼進入到jenkins的首頁面。

然後安裝我們接下來需要用到的插件,選擇系統管理—管理插件—可選插件,将Gitlab Hook Plugin,Git plugin,Git client plugin,已經安裝了則略過。

2.安裝gitlabsudo

執行上述指令即可通過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 reconfiguregitlab就安裝好了,預設的使用者名是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腳本。

. #!/bin/bash  
    . #author kingboy  
    . #description: create tag list for update  
    . #擷取目前項目的配置名稱  
    . gitdir=$(less json.txt|awk -F"[:]" '/dir/{print$2}')  
    . #要輸出的目錄路徑  
    . dir="/Users/kingboy/Desktop/$gitdir"  
    . #目前操作目錄  
    . pwdPath=$(pwd)  
    . #判斷是否有該目錄沒有則建立  
    . if test -e ${dir}  
    . then   
    .     echo -e "${dir} exists!"  
    . else   
    .     mkdir $dir  
    .     echo -e "${dir} create success!"  
    . fi  
    . #判斷兩個tag間的檔案變動清單并打包  
    . zipDiffFiles(){  
    .     tag1=$1  
    .     tag2=$2  
    .     git diff ${tag1} ${tag2} --name-only > ${dir}/${tag1}-${tag2}.log  
    .     #git diff v8 v1 --name-only  
    .     #shell将變化的檔案copy到項目目錄下的對應檔案夾  
    .     #先建立對應的檔案夾  
    .     if test -e ${dir}/${tag1}-${tag2}.tar  
    .     then   
    .         echo -e "${dir}/${tag1}-${tag2}.tar exists!"  
    .     else  
    .         mkdir ${dir}/${tag1}-${tag2}  
    .         echo -e "${dir}/${tag1}-${tag2} create success!"  
    .         #讀取變化的檔案清單并複制到對應的目錄下面,  
    .         echo -e "----------------copy file---------------------"  
    .         cat ${dir}/${tag1}-${tag2}.log | while read LINE  
    .         do  
    .             if test -e ${LINE}  
    .             then  
    .                 #同步檔案到nginx目錄下,同時複制目錄結構  
    .                 #cp --parents -rf ${LINE} ${dir}/${tag1}-${tag2}/  
    .                 #  
    .                 rsync -arR  ${LINE} ${dir}/${tag1}-${tag2}/  
    .             fi  
    .         done  
    .         #打包對應的目錄  
    .         cd ${dir}  
    .         zip  -rq ${tag1}-${tag2}.zip ${tag1}-${tag2}  
    .         echo "zip ${tag1}-${tag2}.tar success!"  
    .         cd $pwdPath  
    .         #删除檔案夾  
    .         rm -rf ${dir}/${tag1}-${tag2}  
    .         #是否删除log日志檔案清單  
    .         rm -rf ${dir}/*-*.log  
    .     fi  
    . }  
    . #生成全量更新包  
    . zip -r ${dir}/last.zip *  
    . #生成不同版本間的更新包     
    . #-n按照數字排序   -r 翻轉排序  -t 分隔符  -k以第幾列排序  
    . echo -e "----------------tag list---------------------"  
    . git tag | sort -n -r -t 'v' -k  |tee ${dir}/tagList.log #生成所有tag  
    . #删除版本資訊檔案  
    . rm -rf ${dir}/update.json  
    . #定義生成的版本個數  
    . i=  
    . versionNumber=  
    . cat ${dir}/tagList.log | while read one  
    . do  
    .     cat ${dir}/tagList.log | while read two  
    .     do  
    .         #去掉自身和自身進行比較  
    .         if test ${one} = ${two}  
    .         then  
    .             continue  
    .         fi  
    .         #-------------------------------  
    .         #去掉重複的包   當新版不夠10個的時候,會生成 v7-v6  v6-v7   ,加上之後就不會了  
    .         #外層隻要一個循環,是以不需要了  
    .         #if test ${two:1:${#two}} -gt ${one:1:${#one}}  
    .         #then  
    .         #   continue  
    .         #fi  
    .         #---------------------------------------  
    .         #生成版本包  
    .         if test $[i] -le $[versionNumber]  
    .         then  
    .             zipDiffFiles "$one" "$two"  
    .             #删除版本資訊檔案  已經放在上面進行處理了  
    .             #重建版本資訊檔案  
    .             echo "{\"$two\":\"${one}-${two}.zip\"}," >> $dir/update.json  
    .         fi  
    .         i=$(($i+))  
    .     done  
    .     break  
    . done  
    . exit   
           

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

說明一下:

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

json.txt是項目的規定名稱資訊,放在項目檔案中的json.txt中,内容如

{

dir:newProject

}

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

update.json是目前所有更新包的資訊。

app端請求該檔案,自行判斷是否需要更新,請求對應包的位址即可下載下傳更新包。

例如目前為v10,最新為v11,則請求http://ip/newProject/v11-v10.zip即可。

二、push events方式

“配置鈎子”之前都一緻,

差別在于之後:

gitlab方面:

gitlab webhooks+jenkins+shell自動釋出一、Tag push events二、push events方式

在gitlab對應的project裡選在Push events,在URL裡填寫jenkins對應jab的url,并在前面附上“使用者名:密碼@”,後面加上/job/$projectname/build

對應的jenkins裡也有相應工程任務

jenkins方面:

gitlab webhooks+jenkins+shell自動釋出一、Tag push events二、push events方式

在配置裡配置上Push Events然後回到gitlab裡點選“TestHooks”測試效果。

繼續閱讀