访问Jenkins管道作业中的BitBucket有效负载数据

时间:2017-01-13 16:52:19

标签: jenkins bitbucket jenkins-plugins jenkins-pipeline

我有Jenkins管道工作;它被配置为构建在BitBucket webhook调用的远程触发器上。这有效并且正在触发构建。

我还需要访问BitBucket(described here)发送的有效负载数据,以获取有关推送的详细信息,例如特定分支。

BitBucket plugin通常会解析此有效负载并将其作为环境变量呈现给作业,但我无法将管道作业设置为连接到该插件的特定仓库,因此它不会帮助

我尝试过测试以查看数据是否可以通过几种不同的方式获得:

node {
    stage 'Desperation'

    echo "${params.push}"
    echo "${env.BITBUCKET_PAYLOAD}"
    echo "${env.push}"
}

这些不起作用(我也没想到它们。)

有没有办法获取此有效负载数据?我唯一能想到的就是拥有一个自由式工作并设置与BitBucket的连接,然后在重新格式化数据后调用此工作。但这似乎非常笨重。

2 个答案:

答案 0 :(得分:9)

最终我不得不接受解决方法。

我的最终设置是管道作业my-build和自由式作业my-build-trigger

my-build-trigger很简单。它在SCM部分设置了一个git仓库,并在构建触发器部分中检查了Build when a change is pushed to BitBucket

在构建后的操作中,我选择了Trigger parameterized build on other projects

以上很重要。 Build other projects不会触发管道作业。它只会说my-build is not buildable

将您的有效负载参数传递到预定义参数下的下游(管道)作业,输入为payload=${BITBUCKET_PAYLOAD}

BITBUCKET_PAYLOAD是由BitBucket有效负载对象的BitBucket插件填充的环境变量。您可以从BitBucket here

查看有效负载文档

您的后期制作将如下所示: Jenkins post-build calling Pipeline with parameters

在管道作业上,您应该创建一个名为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)。这解释了in this question。简而言之,您需要在使用后使payload和其他JSONObject变量无效。

任何意见或改进都会受到赞赏。

答案 1 :(得分:0)

这是我们解决的方式:

后者使您可以接收Application / json格式的数据,这是BitBucket发送的数据。

在作业设置中,请确保启用以下选项:

generic-webhook-plugin settings

此外,请确保同时选中以下两项:

  • Print post content
  • Print contributed variables

这将在您的jenkins控制台中显示它接收到的所有变量,还分解json并将其转换为普通变量。在看到所需的变量名称后,请确保将其“注册”为项目的普通变量。

我知道您问过有关使用Jenkins Pipeline的问题,而这种解释是使用WebUI的。 generic-webhook-trigger的文档涵盖了适合您的情况的代码段。我决定添加WebUI解释,以便您了解其要点。