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运维懂代码开发,是多么强悍呀! 顺带还能做个页面看看进度什么的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰同学骚年

.NET Core微服务之基于Consul实现服务治理(续)

上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧。

1525
来自专栏草根专栏

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

http://www.cnblogs.com/cgzl/p/9010978.html

1402
来自专栏阿杜的世界

RocketMQ学习-消息发布和订阅

前面一篇文章分析了broker的启动过程,浏览了broker的基本功能。接下来的几篇文章,准备按照十分钟入门RocketMQ一文中提到的一系列特性,依次进行学习...

5342
来自专栏琯琯博客

开发 Composer 包详细步骤

一、GitHub 创建一个名 uploadfile 新仓库,并克隆至本地。 二、初始化项目,生成composer.json文件 2.1 步骤 2.2 步骤解释...

72712
来自专栏散尽浮华

ELK实时日志分析平台环境部署--完整记录

在日常运维工作中,对于系统和业务日志的处理尤为重要。今天,在这里分享一下自己部署的ELK(+Redis)-开源实时日志分析平台的记录过程(仅依据本人的实际操作为...

5577
来自专栏坚毅的PHP

zookeeper学习系列:一、入门

基本是 http://zookeeper.apache.org/doc/trunk/zookeeperOver.html 的翻译,应用场景摘抄:http://w...

4706
来自专栏月色的自留地

新麦装机问题汇

1423
来自专栏大魏分享(微信公众号:david-share)

Oracle11g RAC双NFS仲裁容错方案

说明: 整理文档时发现自己在2010年写的一个RAC容灾方案,觉得有一些用,分享出来。当时为了验证此方案,做了很多PoC。方案相对比较复杂,但是也提供了一种思路...

5219
来自专栏weixuqin 的专栏

Nginx 安装配置教程

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #454545 }...

1661
来自专栏FreeBuf

Xdigger Framework:一款网络安全测试辅助框架

*本文作者、Xdigger Framework开发者:guyoung Xdigger Framework是一款基于.Net Framework的网络安全测试辅助...

2037

扫码关注云+社区

领取腾讯云代金券