要解決的問題
開發管理工具觸發站點建構事件,事件進行中需要調用Jenkins接口開始建構動作。
我的應用場景:
使用jira作為管理工具,在jira中建立自定義的工作流來規定測試,上線,釋出等流程,并通過自動化工具完成這一系列的操作。

jira issue資料格式位址:https://docs.atlassian.com/software/jira/docs/api/REST/7.6.1/#api/2/issue-getIssue
jenkins接口參考位址:https://wiki.jenkins.io/display/JENKINS/Remote+access+API
jira 的webhook
webhook server端代碼(nodejs+typescript)
主要的代碼如下所示,是以看代碼和注釋都不需要多解釋。
export class JenkinsController extends BaseController {
public async jira_notify_jenkins_build() {
const jenkinsAuthHeader = `Basic ${base64(jenkins_username + ':' + jenkins_userpwd)}`;
var jenkinsBaseUrl = 'http://ip:8080/';//jenkins的位址
var comment_name = req.body.issue.fields.components[0].name,//站點名稱
jira_issue_id = req.body.issue.key,//jira上面的任務id
git_branch = req.body.issue.fields.customfield_10107//jira上面的自定義字段,存的是git 分支名稱
, env = req.body.issue.fields.status.name;//目前要建構的的環境名稱
//一些檢查
if (!req.body.changelog || !req.body.changelog.items || !req.body.changelog.items[0] || req.body.changelog.items[0].field !== 'status') {
log.Info(`${comment_name} changelog not status ${JSON.stringify(req.body && req.body.changelog)}`)
res.end();
return;
}
if (env !== 'SIT' && env !== 'UAT' && env !== 'STG' && env !== 'PROD') {
log.Info(`${comment_name} env not support.${env}`)
res.end();
return;
}
//獲得jenkins的crumb值,沒有這玩意接口就不能調用
var data = await ApiClient.Get<any>(jenkinsBaseUrl, 'crumbIssuer/api/json', undefined, { headers: { 'Authorization': jenkinsAuthHeader } });
//組裝接口調用要用到的參數
var headers: any = {
'Authorization': jenkinsAuthHeader,
'Content-Type': 'application/x-www-form-urlencoded'
};
headers[data.crumbRequestField] = data.crumb;
//parameter:jenkins job 建構時要傳遞的參數
var postData = {
parameter: [
{
"name": "selected_branch",
"value": git_branch
},
{
"name": "env",
"value": env
},
{
"name": "JIRA_ISSUE_ID",
"value": jira_issue_id
}
]
};
log.Info(`${comment_name} notify jenkins building. ${JSON.stringify(postData)}`)
//調用jenkins接口,開始建構
await ApiClient.Post(jenkinsBaseUrl, `job/${comment_name}/build`, { json: JSON.stringify(postData) }, { headers: headers });
}
}
雖然jenkins和jira都有互相調用和觸發的插件,但是很難完美的滿足自身的業務,
比如要根據不同的env(建構環境)調用不同的jenkins來觸發不同的建構腳本,畢竟測試環境,産線環境的腳本不太一樣。
是以還不如自己做一個小站點來中轉來得快,devops運維懂代碼開發,是多麼強悍呀!
順帶還能做個頁面看看進度什麼的。