一、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對應的project裡選在Push events,在URL裡填寫jenkins對應jab的url,并在前面附上“使用者名:密碼@”,後面加上/job/$projectname/build
對應的jenkins裡也有相應工程任務
jenkins方面:
在配置裡配置上Push Events然後回到gitlab裡點選“TestHooks”測試效果。