轉自: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 Plugin,Git plugin,Git 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寫的語法不是很好,很多不會,有點亂,高手勿噴)
- #!/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 2 |tee ${dir}/tagList.log #生成所有tag
- #刪除版本資訊檔案
- rm -rf ${dir}/update.json
- #定義生成的版本個數
- i=1
- versionNumber=10
- 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+1))
- done
- break
- done
- 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,謝謝前輩的貢獻。