如何在HipChat消息中添加触发Jenkins审批步骤的可操作元素?
在HipChat消息中添加可触发Jenkins操作的元素(含PROD审批实现)
我来帮你梳理下如何实现在HipChat里直接审批Jenkins的部署步骤,以及如何运用卡片功能——这确实是官方HipChat插件文档没覆盖太全的场景,不过有几种实用的方案:
一、用Jenkins HipChat插件原生支持的操作按钮
官方的HipChat插件其实支持在消息里添加可点击的操作按钮,只是需要用到attachments参数(而不是简单的message)来定义卡片式消息。这些按钮可以直接关联到Jenkins的API端点,触发审批动作。
示例代码:带审批按钮的HipChat消息
stage ('Approval for PROD') { // 给input步骤设置唯一ID,方便后续API调用定位 def inputApprovalId = 'prod-deployment-approval' // 构建Jenkins审批的API链接 def jenkinsApproveUrl = "${env.JENKINS_URL}/job/${env.JOB_NAME}/${env.BUILD_NUMBER}/input/${inputApprovalId}/submit?json=%7B%22parameter%22%3A+%5B%5D%7D&Submit=Proceed" def jenkinsRejectUrl = "${env.JENKINS_URL}/job/${env.JOB_NAME}/${env.BUILD_NUMBER}/input/${inputApprovalId}/submit?json=%7B%22parameter%22%3A+%5B%5D%7D&Submit=Abort" // 发送带操作按钮的HipChat卡片消息 hipchatSend color: 'yellow', notify: true, room: "Jenkins Team FooBar", attachments: """ [{ "title": "${env.JOB_NAME}#${env.BUILD_NUMBER} 等待PROD部署审批", "description": "请确认是否批准本次部署到PROD环境", "actions": [ { "name": "批准部署", "style": "primary", "url": "${jenkinsApproveUrl}" }, { "name": "拒绝部署", "style": "danger", "url": "${jenkinsRejectUrl}" } ] }] """, textFormat: false // 注意这里要设为false,因为attachments是JSON格式 // 原有的input步骤逻辑保持不变 try { timeout(time: approvalTime, unit: approvalTimeUnit) { input id: inputApprovalId, message: 'Do you approve the deployment to PROD?' } } catch (Exception ex) { finishBuild = true } } // Stop build if flag was set if (finishBuild) return
二、通过POST请求实现更灵活的审批
如果原生按钮的功能不够满足需求(比如需要传递自定义参数、更安全的认证),你可以通过构建调用Jenkins API的POST请求来实现。关键在于:
- 获取对应
input步骤的API提交端点(格式就是上面示例里的链接) - 确保请求带有Jenkins的认证信息(比如服务账号的API Token)
- 在HipChat卡片的操作按钮中调用这个端点
优化版:带安全认证的审批链接
stage ('Approval for PROD') { def inputApprovalId = 'prod-deployment-approval' // 使用Jenkins服务账号的API Token(建议单独创建权限受限的服务账号) def jenkinsServiceToken = '<你的服务账号API Token>' // 把Token加入URL实现认证(也可以通过HTTP Header传递,更安全) def jenkinsApproveUrl = "${env.JENKINS_URL}/job/${env.JOB_NAME}/${env.BUILD_NUMBER}/input/${inputApprovalId}/submit?token=${jenkinsServiceToken}&Submit=Proceed" def jenkinsRejectUrl = "${env.JENKINS_URL}/job/${env.JOB_NAME}/${env.BUILD_NUMBER}/input/${inputApprovalId}/submit?token=${jenkinsServiceToken}&Submit=Abort" hipchatSend color: 'yellow', notify: true, room: "Jenkins Team FooBar", attachments: """ [{ "title": "${env.JOB_NAME}#${env.BUILD_NUMBER} PROD部署审批", "description": "点击按钮完成审批,权限已通过服务账号验证", "actions": [ { "name": "批准", "style": "primary", "url": "${jenkinsApproveUrl}" }, { "name": "拒绝", "style": "danger", "url": "${jenkinsRejectUrl}" } ] }] """, textFormat: false try { timeout(time: approvalTime, unit: approvalTimeUnit) { input id: inputApprovalId, message: 'Do you approve the deployment to PROD?' } } catch (Exception ex) { finishBuild = true } } if (finishBuild) return
三、HipChat卡片功能的核心要点
HipChat的卡片(Attachments)是实现富交互消息的关键,你需要注意这些细节:
- 卡片必须是JSON数组格式,每个元素是一个卡片对象
- 支持
title(标题)、description(描述)、actions(操作按钮)等字段 style字段可以设置按钮样式:primary(蓝色主按钮)、danger(红色危险按钮)- 确保
textFormat设为false,否则插件会把JSON当成纯文本处理
注意事项
- 权限控制:不要把高权限的Jenkins账号Token暴露给普通用户,建议创建仅拥有审批权限的服务账号
- 安全风险:URL里传递Token虽然方便,但有泄露风险,更安全的方式是通过反向代理或者OAuth2认证来处理请求
- 格式校验:HipChat对JSON格式要求严格,建议先在线校验JSON语法再加入代码
内容的提问来源于stack exchange,提问作者Patrick T
相关产品推荐
相关产品推荐

