专栏首页calvinjira webhook 事件触发并程序代码调用jenkins接口触发构建操作

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 条评论
登录 后参与评论

相关文章

  • 我的devops实践经验分享一二

    随着系统越来越大,开发人员、站点、服务器越来越多,微服务化推进,......等等原因,实现自动化的devops越来越有必要。 当然,真实的原因是,在团队组建之...

    旺财的城堡
  • 在Jenkins中使用sonar进行静态代码检查

    懒得说,跟着官方文档走就行,这边主要的开发语言是.net core 和 typescript,所以在sonar server中的应用市场搜索对应语言安装就完事 ...

    旺财的城堡
  • .Net Core Linux centos7行—jenkins linux 构建.net core web app

    # wget -P /opt https://pkg.jenkins.io/redhat-stable/jenkins-2.7.4-1.1.noarch.rpm...

    旺财的城堡
  • hadoop伪分布式之配置历史服务器

    sbin/mr-jobhistory-daemon.sh start historyserver

    绝命生
  • Tekton Pipeline教程

    Tekton Pipeline,是一个k8s native的pipeline, 任务跑在pod中,通过自定义CRD去管理任务与工作流等等,我看完tekton之后...

    sealyun
  • [学习es6]setter/getter探究

    其实本质还是基于javascript原型链机制开发的语法糖,其中,本人对setter/getter进行一番研究,发现了不少坑。

    前端博客 : alili.tech
  • LEDE(OpenWrt)安装openclash |旁路由技巧 | 配置网络流量全部通过旁路由

    今天我们来安装一个运行在OpenWrt上的Clash客户端,兼容Shadowsocks、ShadowsocksR、Vmess、Trojan、Snell等协议,可...

    宋天伦
  • Mybatis常见面试题总结及答案

    1、Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建stat...

    挨踢小子部落阁
  • [数据清洗]- Pandas 清洗“脏”数据(二)

    概要 了解数据 分析数据问题 清洗数据 整合代码 了解数据 在处理任何数据之前,我们的第一任务是理解数据以及数据是干什么用的。我们尝试去理解数据的列/行、记录、...

    数据分析
  • Docker 实战和基础架构

    Maybe you will see a few extra lines if your Docker install is brand new.

    Jintao Zhang

扫码关注云+社区

领取腾讯云代金券