最近,要搭建多套測試環境,需要把 Jenkins 中 dev 視圖下的所有任務批量復制到 sit 等視圖下。
說明
Jenkins 任務名稱規則為:[測試環境標識]-[工程名稱],如:dev-daodaotest,sit-daodaotest
。
視圖中顯示任務的正則表達式:[測試環境標識]-.* ,如:dev-.*,sit-.*
。
第一種:目錄下批量復制
Jenkins 的任務都是以 xml
文件方式存儲的,所有可以通過復制 xml
的方式來批量創建。
# 進入 jobs 目錄下
$ cd ~/.jenkins/jobs
# 創建批量復制 shell 腳本
$ vi copyViewJobs.sh
#!/bin/bash
# 視圖名稱
viewName=$1
# 新視圖名稱
newViewName=$2
cd /home/jenkins/.jenkins/jobs/
# 循環復制任務
for jobName in `ls /home/jenkins/.jenkins/jobs/`
do
# 判斷文件存在並且是目錄
if test -d $jobName
then
# 目錄為 $viewName 開頭,則進行復制
if [[ $jobName == $viewName-* ]]; then
# 截取工程名稱
name=`echo $jobName|awk 'BEGIN{FS="'$viewName'-"} {print $2}'`
newJobName=$newViewName-$name
echo $newJobName
# 復制 config.xml
mkdir $newJobName && cp $jobName/config.xml $newJobName/
fi
fi
done
# 執行批量復制腳本,dev 視圖下的任務復制到 sit 視圖下
$ sh copyViewJobs.sh dev sit
注意:復制完成后,Jenkins 需要重新加載配置才可以生效。操作菜單路徑:Manage Jenkins
--》 Reload Configuration from Disk
。
第二種:jenkins-cli
實現步驟與第一種類似,大家可以根據自己擅長的腳本語言來實現即可。下面簡單介紹下關鍵命令。
jenkins-cli
使用方法見:http://localhost:8080/cli
# 下載 jenkins-cli.jar
$ wget http://localhost:8080/jnlpJars/jenkins-cli.jar
# 獲取視圖下的所有任務
$ java -jar jenkins-cli.jar -s http://localhost:8080/ -auth daodaotest:daodaotest list-jobs dev
# 復制任務
$ java -jar jenkins-cli.jar -s http://localhost:8080/ -auth daodaotest:daodaotest copy-job dev-daodaotest sit-daodaotest
第三種:REST API
同第二種,僅介紹關鍵命令。這里以 python-jenkins
api 為例。
python-jenkins
官網地址:https://opendev.org/jjb/python-jenkins
安裝 Python Jenkins
# 安裝 pip
$ sudo yum install epel-release && sudo yum install python-pip
# 安裝 python-jenkins
$ pip install python-jenkins
獲取視圖下任務名稱
import jenkins
server = jenkins.Jenkins('http://localhost:8080', username='daodaotest', password='daodaotest')
# 查詢 dev 視圖下的所有任務
jobs = server.get_jobs(folder_depth=0, view_name='dev')
# 循環打印任務名稱
for job in jobs:
print(job['fullname'])
復制任務
import jenkins
server = jenkins.Jenkins('http://localhost:8080', username='daodaotest', password='daodaotest')
# 任務是否存在,True 為存在,Fasle 為不存在
print(server.job_exists('dev-daodaotest'))
# 復制任務
server.copy_job('dev-daodaotest','sit-daodaotest')
# 打印任務信息
jobinfo = server.get_job_info('sit-daodaotest')
print(jobinfo)
請求報錯 "Error 403 No valid crumb was included in the request"
錯誤原因: jenkins 在 http 請求頭部中放置了一個名為 .crumb 的 token。在使用了反向代理,並且在 jenkins 設置中勾選了“防止跨站點請求偽造(Prevent Cross Site Request Forgery exploits)”之后此 token 會被轉發服務器 nginx 認為是不合法頭部而去掉,導致跳轉失敗。
解決辦法:在 Jenkins 的安全設置中取消“防止跨站點請求偽造(Prevent Cross Site Request Forgery exploits)”。