天天看點

jira webhook 事件觸發并程式代碼調用jenkins接口觸發建構操作

要解決的問題

開發管理工具觸發站點建構事件,事件進行中需要調用Jenkins接口開始建構動作。

我的應用場景:

使用jira作為管理工具,在jira中建立自定義的工作流來規定測試,上線,釋出等流程,并通過自動化工具完成這一系列的操作。

jira webhook 事件觸發并程式代碼調用jenkins接口觸發建構操作

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

jira webhook 事件觸發并程式代碼調用jenkins接口觸發建構操作

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運維懂代碼開發,是多麼強悍呀!

順帶還能做個頁面看看進度什麼的。

jira webhook 事件觸發并程式代碼調用jenkins接口觸發建構操作