在 Jenkins 管道作业中访问 BitBucket 负载数据
Access BitBucket payload data in Jenkins pipeline job
我有一个 Jenkins 管道作业;它被配置为构建在由 BitBucket webhook 调用的远程触发器上。这有效并正在触发构建。
我还需要访问 BitBucket (described here) 发送的有效负载数据,以获取有关推送的详细信息,例如特定分支。
BitBucket plugin 通常会解析此有效负载并将其作为环境变量呈现给作业,但我无法将管道作业设置为连接到该插件的特定回购,因此它不会帮帮忙。
我尝试通过几种不同的方式测试数据是否可用,如下所示:
node {
stage 'Desperation'
echo "${params.push}"
echo "${env.BITBUCKET_PAYLOAD}"
echo "${env.push}"
}
这些都不管用(我也没想到它们会起作用)。
有什么方法可以获取此负载数据吗?我唯一能想到的就是做一个自由式作业并在其上设置与 BitBucket 的连接,然后调用这个作业并重新格式化数据。虽然这看起来非常笨重。
最终我不得不接受一个解决方法。
我的最终设置是管道作业 my-build
和自由式作业 my-build-trigger
。
my-build-trigger
很简单。它在 SCM 部分设置了一个 git 回购协议,并在构建触发器部分检查了 Build when a change is pushed to BitBucket
。
在 post-build 个操作中,我选择了 Trigger parameterized build on other projects
。
以上内容很重要。 Build other projects
不会触发管道作业。它只会说 my-build is not buildable
.
根据预定义参数将有效负载参数传递到下游(管道)作业,输入为 payload=${BITBUCKET_PAYLOAD}
。
BITBUCKET_PAYLOAD
是一个环境变量,由 BitBucket 插件从 BitBucket 负载对象填充。您可以从 BitBucket here
查看 payload 文档
您的 post-build 将如下所示:
在您的管道作业中,您应该创建一个名为 payload
(字符串类型)的相应参数。
在您的 Jenkinsfile
中,您可以像这样使用此负载:
node {
stage 'Echo stuff pointlessly'
def payload = new groovy.json.JsonSlurper().parseText("${params.payload}")
// Echoes the new commit hash
echo payload.push.changes[0].new.target.hash
}
请注意,您可能会在作业中遇到序列化错误 (java.io.NotSerializableException: groovy.json.internal.LazyMap
)。即解释。简而言之,您需要在使用后取消 payload
和其他 JSONObject 变量。
如有任何意见或改进,我们将不胜感激。
我们是这样解决的:
- 我们使用 BitBucket webhook 来接收我们想要的通知。
- 为了接收负载,我们安装了 https://plugins.jenkins.io/generic-webhook-trigger/
后者允许您接收 application/json 格式的数据,这就是 BitBucket 发送的格式。
在您的作业设置中,确保启用以下选项:
此外,请确保同时检查:
Print post content
Print contributed variables
这将在您的 jenkins 控制台中显示它接收到的所有变量,还会分解 json 并将其转换为纯变量。在您看到所需的变量名称后,请确保 "register" 将它们作为项目的普通变量。
我知道你问过关于使用 Jenkins Pipeline 的问题,这个解释是使用 WebUI。 generic-webhook-trigger
的文档涵盖了完全适合您的情况的代码片段。我决定添加 WebUI 解释,以便您了解它的要点。
我有一个 Jenkins 管道作业;它被配置为构建在由 BitBucket webhook 调用的远程触发器上。这有效并正在触发构建。
我还需要访问 BitBucket (described here) 发送的有效负载数据,以获取有关推送的详细信息,例如特定分支。
BitBucket plugin 通常会解析此有效负载并将其作为环境变量呈现给作业,但我无法将管道作业设置为连接到该插件的特定回购,因此它不会帮帮忙。
我尝试通过几种不同的方式测试数据是否可用,如下所示:
node {
stage 'Desperation'
echo "${params.push}"
echo "${env.BITBUCKET_PAYLOAD}"
echo "${env.push}"
}
这些都不管用(我也没想到它们会起作用)。
有什么方法可以获取此负载数据吗?我唯一能想到的就是做一个自由式作业并在其上设置与 BitBucket 的连接,然后调用这个作业并重新格式化数据。虽然这看起来非常笨重。
最终我不得不接受一个解决方法。
我的最终设置是管道作业 my-build
和自由式作业 my-build-trigger
。
my-build-trigger
很简单。它在 SCM 部分设置了一个 git 回购协议,并在构建触发器部分检查了 Build when a change is pushed to BitBucket
。
在 post-build 个操作中,我选择了 Trigger parameterized build on other projects
。
以上内容很重要。 Build other projects
不会触发管道作业。它只会说 my-build is not buildable
.
根据预定义参数将有效负载参数传递到下游(管道)作业,输入为 payload=${BITBUCKET_PAYLOAD}
。
BITBUCKET_PAYLOAD
是一个环境变量,由 BitBucket 插件从 BitBucket 负载对象填充。您可以从 BitBucket here
您的 post-build 将如下所示:
在您的管道作业中,您应该创建一个名为 payload
(字符串类型)的相应参数。
在您的 Jenkinsfile
中,您可以像这样使用此负载:
node {
stage 'Echo stuff pointlessly'
def payload = new groovy.json.JsonSlurper().parseText("${params.payload}")
// Echoes the new commit hash
echo payload.push.changes[0].new.target.hash
}
请注意,您可能会在作业中遇到序列化错误 (java.io.NotSerializableException: groovy.json.internal.LazyMap
)。即解释payload
和其他 JSONObject 变量。
如有任何意见或改进,我们将不胜感激。
我们是这样解决的:
- 我们使用 BitBucket webhook 来接收我们想要的通知。
- 为了接收负载,我们安装了 https://plugins.jenkins.io/generic-webhook-trigger/
后者允许您接收 application/json 格式的数据,这就是 BitBucket 发送的格式。
在您的作业设置中,确保启用以下选项:
此外,请确保同时检查:
Print post content
Print contributed variables
这将在您的 jenkins 控制台中显示它接收到的所有变量,还会分解 json 并将其转换为纯变量。在您看到所需的变量名称后,请确保 "register" 将它们作为项目的普通变量。
我知道你问过关于使用 Jenkins Pipeline 的问题,这个解释是使用 WebUI。 generic-webhook-trigger
的文档涵盖了完全适合您的情况的代码片段。我决定添加 WebUI 解释,以便您了解它的要点。