借助Generic Webhook Trigger,如何在Jenkins中读取Bitbucket的HTTP请求头?
如何在Jenkins的Generic Webhook插件中读取Bitbucket的X-Hub-Signature请求头
第一步:在Generic Webhook插件中配置请求头参数
在你已有的Generic Webhook配置界面里,找到「Request headers」区域(就在请求体配置模块附近),添加一条配置:
- 参数名称:填
X_Hub_Signature(Jenkins变量不允许包含连字符,用下划线替代) - 表达式:填
X-Hub-Signature(完全匹配Bitbucket发送的请求头名称)
保存配置后,该请求头的值会被Jenkins捕获,你可以在任务中通过环境变量${X_Hub_Signature}直接引用。
第二步:验证签名(以Pipeline任务为例)
拿到签名后,需要用Bitbucket Webhook配置的密钥重新计算请求体的签名,与收到的X-Hub-Signature比对,确保请求来自合法的Bitbucket实例。
以下是Pipeline中的验证脚本示例:
pipeline { agent any stages { stage('Validate Webhook Signature') { steps { script { // 获取收到的签名 def receivedSig = env.X_Hub_Signature // 替换为你在Bitbucket Webhook中设置的密钥 def webhookSecret = 'your-bitbucket-webhook-secret' // 获取Generic Webhook已读取的请求体(变量名要和你配置的一致) def requestPayload = env.requestBody // 计算HMAC SHA256签名(Bitbucket默认使用该算法) def mac = javax.crypto.Mac.getInstance('HmacSHA256') mac.init(new javax.crypto.spec.SecretKeySpec(webhookSecret.getBytes(), 'HmacSHA256')) def computedHash = new BigInteger(1, mac.doFinal(requestPayload.getBytes())).toString(16).padLeft(64, '0') def computedSig = "sha256=${computedHash}" // 签名不匹配则终止任务 if (receivedSig != computedSig) { error "Invalid signature: Expected ${computedSig}, got ${receivedSig}" } } } } // 后续任务步骤... } }
补充说明
- 如果是自由风格任务,可添加「Execute system Groovy script」步骤,用上述核心逻辑完成验证
- 确认Bitbucket的签名算法为SHA256(多数版本默认如此),若你的版本使用其他算法,替换代码中的
HmacSHA256即可 - 保证请求体的变量名与你在Generic Webhook中配置的一致,避免无法获取请求体内容
内容的提问来源于stack exchange,提问作者John_Bon
相关产品推荐
相关产品推荐

