場景分析
在實際部署Jenkins環境中,常常遇到多個作業相互觸發的場景。
如圖1,假設作業A與作業C在完成指定操作后,觸發作業B執行,那么在已有一個作業運行情況下,從C的觸發開始,串行作業B勢必會有3個構建在隊列中。消除第一個pending以外的構建便是本文的目標。
圖1 B作業隊列3個構建阻塞
實現方式
首先你需要知道Jenkins本身有API供用戶解析,包括作業的API與具體某次構建的API。
http://JENKINS_URL/job/JOB_NAME/api
Jenkins的API可以解析為JSON或XML格式,通過判斷pending字符串是否存在于API解析結果中,容易實現本文目標。
實現代碼
以下便是通過對pending的判斷,來決定是否再次觸發目標作業的具體代碼:
pending_status=`curl --user USERNAME:PASSWD http://JENKINS_URL/job/JOB_NAME/api/json`
if echo $pending_status | grep \"queueItem\":null
then
? ? curl --user USERNAME:PASSWD http://JENKINS_URL/job/JOB_NAME/build?token=TOKEN
? ? while [ 1 ]; do
? ? ? ? job_status=`curl --user USERNAME:PASSWD http://JENKINS_URL/job/JOB_NAME/api/json`
? ? ? ? if echo $job_status | grep \"pending\"
? ? ? ? then
? ? ? ? ? ? sleep 1
? ? ? ? else
? ? ? ? ? ? break
? ? ? ? fi
? ? done
else
? ? echo "Pending...Skip Calling A New Job."
fi
1. 判斷目標作業是否有構建處于隊列中;
2. 若有,則跳過再次觸發,進入后續操作,否則:
3. 觸發目標作業構建;
4. 輪詢目標作業被觸發后的狀態,直至其真正開始后,跳出循環,進入后續操作。
*? 通常,后續的操作是輪詢該作業的狀態等,此處不再贅述。若有不詳之處還望指正。