背景
我們在使用 Jenkins 做自動發佈平臺的時候遇到一個需求,即根據不同的版本分支,選擇不同的主機環境,同時還需傳入相應的程序版本號。最終實現 Nexus OSS
倉庫下載對應版本的程序包,自動化實現整個程序的發佈。
Active Choices Plugin
經過查找,發現 Jenkins 的 Active Choices Plugin
是支持實現這個功能的。
簡介
Active Choices 插件提供了其他 Jenkins 參數類型,可以將其呈現爲作業表單中的用戶界面(UI)控件。它支持使用系統環境變量,全局節點屬性,並且在 Groovy 上下文中支持自由作業的 Jenkins 項目。
安裝插件後,將提供三種新的參數類型:
- 主動選擇參數
- 主動選擇反應參數
- Active Choices反應參考參數
Active Choices 參數允許用戶選擇作業參數的值。參數值可以是:
- 動態生成的(使用Groovy或Scriptler腳本)
- 根據其他UI參數動態更新
- 多值(可以有多個值)
- 使用各種UI控件(包括動態HTML)呈現
主動選擇參數
Active Choices 參數使用 Groovy 腳本或 Scriptler 目錄中的腳本爲生成參數動態生成值選項列表。
示意圖:
- Active Choices 參數可以呈現爲標準選擇列表,複選框和單選按鈕。
- 可以選擇顯示一個文本框過濾器,以幫助過濾值選項。
主動選擇反應式和反應式參考參數
參數使用 Groovy 腳本或 Scriptler 腳本動態生成構建參數的值選項,其他作業UI控件的值更改時,可以動態更新(主動選擇)“反應式”和“反應式參考”參數(級聯更新)
示意圖:
- “Gender”參數更改時,"Professions”參數的值選項得到更新。
- 此外,當更新“Gender”參數時,也會動態更新顯示爲圖片的反應性參考參數“ Gender_Balance”。
具體設置
安裝插件
參數級聯更新
勾選參數化構建,選擇 Active Choices Parameter
設置代碼分支參數:
- Name:設置參數 “Brach”
- Script:設置值腳本
- Description:設置參數描述信息
- ChoiceType:設置按鈕形式
設置主機參數:
- Name:設置參數 “Hosts”
- Script:設置值腳本
- Description:設置參數描述信息
- ChoiceType:設置按鈕形式
- Referenced parameters:關聯參數,此處設置爲上面的 “Branch”
Groovy Script:
dev = ["Dev_ALL","Dev_AutoTest","Dev_FunctionTest","Dev_Develop"]
release = ["Release_ALL","Release_AutoTest","Release_FunctionTest","Release_Develop"]
if(Branch.equals("dev")){
return dev
}else if (Branch.equals("release")){
return release
}else {
return ["Unknown Hosts"]
}
設置版本參數:
- Name:設置參數 “Package_Name”
- Script:設置
Groovy Script
從文件中獲取變量值 - Description:設置參數描述信息
- ChoiceType:設置按鈕形式
- Referenced parameters:關聯參數,此處設置爲上面的 “Branch”
Groovy Script:
if(Branch.equals("dev")){
lineList = new File("D:\\Jenkins-workspace\\Jenkins\\workspace\\V3C-WEBAPP-Dev\\package_history.txt").readLines()
lineList.sort{it}
Collections.reverse(lineList)
lineList.each {
return it;
}
}else if (Branch.equals("release")){
lineList = new File("D:\\Jenkins-workspace\\Jenkins\\workspace\\V3C-WEBAPP-Release\\package_history.txt").readLines()
lineList.sort{it}
Collections.reverse(lineList)
lineList.each {
return it;
}
}else {
return ["Unknown Hosts"]
}
package_history.txt 內容參考:
在集成編譯的時候,通過 Python 腳本把對應程序包名寫入 package_history.txt
:
# coding=utf-8
# 獲取Jenkins變量
WORKSPACE = os.getenv("WORKSPACE")
def packagehistory(zipname):
Path = WORKSPACE+"\\package_history.txt"
f = open(Path,'a',encoding='utf-8')
f.write(zipname)
f.write("\n")
f.close()
實現效果
那麼後續怎麼接受參數呢?可以參考圖中 shell 腳本設置:
#!/usr/bin/env bash
echo '版本類型:'$Branch
echo '環境類型:'$Hosts
echo '文件名稱:'$Package_Name
ansible-playbook /home/ansible/playbooks/v3c-deploy.yaml --extra-vars "package_name=$Package_Name branch=$Branch target=$Hosts"
小結
本文簡要帶着大家快速學習 Jenkins 中一個動態級聯傳參的小技巧,希望對大家有所幫助。
參考資源:
[1]:https://wiki.jenkins.io/display/JENKINS/Active+Choices+Plugin