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


要解決的問題

開發管理工具觸發站點構建事件,事件處理中需要調用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運維懂代碼開發,是多么強悍呀!
順帶還能做個頁面看看進度什么的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM