最近,要搭建多套測試環境,須要把 Jenkins 中 dev 視圖下的全部任務批量複製到 sit 等視圖下。java
Jenkins 任務名稱規則爲:[測試環境標識]-[工程名稱],如:dev-daodaotest,sit-daodaotest
。python
視圖中顯示任務的正則表達式:[測試環境標識]-.* ,如:dev-.*,sit-.*
。nginx
Jenkins 的任務都是以 xml
文件方式存儲的,全部能夠經過複製 xml
的方式來批量建立。正則表達式
# 進入 jobs 目錄下 $ cd ~/.jenkins/jobs # 建立批量複製 shell 腳本 $ vi copyViewJobs.sh #!/bin/bash # 視圖名稱 viewName=$1 # 新視圖名稱 newViewName=$2 # 循環複製任務 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
。shell
實現步驟與第一種相似,你們能夠根據本身擅長的腳本語言來實現便可。下面簡單介紹下關鍵命令。api
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
同第二種,僅介紹關鍵命令。這裏以 python-jenkins
api 爲例。bash
python-jenkins
官網地址:https://opendev.org/jjb/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)
錯誤緣由: jenkins 在 http 請求頭部中放置了一個名爲 .crumb 的 token。在使用了反向代理,而且在 jenkins 設置中勾選了「防止跨站點請求僞造(Prevent Cross Site Request Forgery exploits)」以後此 token 會被轉發服務器 nginx 認爲是不合法頭部而去掉,致使跳轉失敗。測試
解決辦法:在 Jenkins 的安全設置中取消「防止跨站點請求僞造(Prevent Cross Site Request Forgery exploits)」。