(后期添加:
這篇博客是在剛研究並發構建時寫的,所以方法比較老套,采用的時流水線(pipeline)的方式,實現時通過如果job的用戶配置來創建多個新的執行任務的job,並且將執行日志回收到入口job,任務執行結束后刪除job,基本上是采用jenkins api來創建job-->執行job-->刪除job,這樣的方法比較麻煩,並且不直觀。但是如果你想了解jenkins api如何實現流水線來仿照並發構建過程,你可以參考下這篇博客~~
后面資料看多了,也手動操作多了,發現並發構建有更加簡單的辦法,請參考我的另外一篇博客:https://www.cnblogs.com/zndxall/p/8516189.html
)
可以參考對應的API,下面是關於我的任務場景的不同jenkins內置命令的使用。
任務1:實現多用戶同時觸發任務
分析:常見情況是我們只需要一個人觸發jenkins出包給其它人用,但是如果想結合個人構建,那么明顯一個任務多個人觸發時,必須要等上一次構建結束,才能開始下一次的構建,因為只有一個任務入口,舉個例子,比如一個餐廳,只有一個服務員一張餐桌,只能容下一個客人,那么其它客人就必須排隊,等這個客人吃完了,多用戶的模式就是有一個點單員和多個服務員和多張桌子,客人只要告訴點單員,接下來就有其它服務員來一對一服務你,不會像第一種情況那樣,完全卡在一個人。
方法:還是要保持有一個job做入口,但是這個job的用時要盡量控制到最短,然后下發任務到其它下游job執行,下游job的特點就是要跟用戶相關,能夠標識用戶。我的步驟:
1.入口job主要的任務是獲取當前是哪個用戶觸發的,以及該次觸發的num是多少,並保存用的配置;
需要的插件'user build vars plugin' 在任務配置中勾選如下:
然后使用如下命令就可以獲取到user和num
echo jenkins var as follow:
echo build_num=$BUILD_NUMBER
echo build_user=$BUILD_USER
2.創建一個模板任務,根據自己的需要做好設置,目的主要是為了獲取一個簡單標准的config.xml文件,后面要用到,我的模板任務設置如下:
處理上面1的設置,還有就是執行腳本的設置,其中上面的“sh /usr/local/scripts/build_scripts/build_mode.sh build_branch push_action build_channel build_tvar build_code build_job ”這一竄隨便寫,里面對應的build_mode.sh實際也是不存在的,這串會被記錄在job的config.xml中,后面我會用自己實際的腳本名來替換,馬上你就可以看到了。
3.(1)在入口job,比如mul_user作為入口job,在mul_user的job調用curl -u admin:123456 $jenkins_url/job/Build_Template/config.xml -o config.xml -v 獲取模板Build_Template的config.xml,(-o 后面的是下載到本地的文件名)參考我上面的模板配置,這個config.xml文件如下,我只截取了我需要改動的部分,就是構建部分,就是步驟2的那段字符串sh /usr/local/scripts/build_scripts/build_mode.sh build_branch push_action build_channel build_tvar build_code build_job,然后根據自己的需要修改這個本地的這個config.xml中的構建字段,我的修改如下:
sed -i 's/build_mode/push_tag/g' config.xml
sed -i s/build_branch/$1/g config.xml
sed -i s/push_action/$2/g config.xml
sed -i s/build_channel/$3/g config.xml
sed -i s/build_tvar/$4/g config.xml
sed -i s/build_code/$build_module/g config.xml
sed -i s/build_job/$build_name/g config.xml
(2)使用curl -u admin:123456 -X POST $jenkins_url/createItem?name=$build_name -d @config.xml -H "Content-Type: text/xml" 創建一個新的任務,其中build_name,我使用的是$user_$name_模塊的組合,能夠唯一表示是哪個用戶的哪次的哪個模塊的構建,再看@config.xml 說明我們需要依賴這個配置文件,才能生成新的job,由於這個config.xml文件是來自於我們事先設置的模板的模板文件,所以這個新的job和模板job的結構是一樣的,除了那串構建被替換成了我們需要的腳本。
(3)使用curl -u admin:123456 -X POST $jenkins_url/job/$build_name/build 來觸發新的job的構建,到此,入口job mul_user的任務就完成了,我自己的設置發現,十幾秒這個入口job就結束了,觸發構建后,下游job會自己跑起來。
4.在下游job跑完以后,調用curl -u admin:123456 -X POST $jenkins_url/job/$6/doDelete 來刪除剛才新建的job,這個動作可以在新建job中調用腳本是實現。
由於任務刪除后,新建的job構建日志就看不到了,所以建議將步驟2的模板job的構建階段修改為sh /usr/local/scripts/build_scripts/build_mode.sh build_branch push_action build_channel build_tvar build_code build_job |tee console_log,使用tee 命令 將log保存下來,然后存放到其它位置,方便出錯時檢查問題。
任務2:修改job的config.xm后不重啟服務生效
描述:有時候,我們的構建是帶參數構建的,但是參數內容會經常有變化,就需要手動去修改參數,比如某一個模塊的代碼經常會遷分支,也會合入主線,每次有新的分支增加的時候就需要去界面配置,有分支合入的時候,又要去界面刪除,這樣很麻煩。
分析:既然界面的配置都會被保存在任務的$jenkins_path/jobs/$job/config.xml文件中,那么只要修改這個config.xml文件就可以了。
難點:發現,修改了這個文件以后,再去刷jenkins界面,修改並沒有生效,查資料說,需要重啟服務器才能生效,重啟后果然生效了,但是這並不使用,有沒什么方法不需要重啟就能生效呢。
解決:使用jenkins的內置命令reload即可,命令為:curl -u admin:1234456 -X POST $jenkins_url/$job_name/reload 。
這樣,不需要重啟就能生效。