我有Jenkins管道工作;它被配置为构建在BitBucket webhook调用的远程触发器上。这有效并且正在触发构建。
我还需要访问BitBucket(described here)发送的有效负载数据,以获取有关推送的详细信息,例如特定分支。
BitBucket plugin通常会解析此有效负载并将其作为环境变量呈现给作业,但我无法将管道作业设置为连接到该插件的特定仓库,因此它不会帮助
我尝试过测试以查看数据是否可以通过几种不同的方式获得:
node {
stage 'Desperation'
echo "${params.push}"
echo "${env.BITBUCKET_PAYLOAD}"
echo "${env.push}"
}
这些不起作用(我也没想到它们。)
有没有办法获取此有效负载数据?我唯一能想到的就是拥有一个自由式工作并设置与BitBucket的连接,然后在重新格式化数据后调用此工作。但这似乎非常笨重。
答案 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
在管道作业上,您应该创建一个名为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发送的数据。
在作业设置中,请确保启用以下选项:
此外,请确保同时选中以下两项:
Print post content
Print contributed variables
这将在您的jenkins控制台中显示它接收到的所有变量,还分解json并将其转换为普通变量。在看到所需的变量名称后,请确保将其“注册”为项目的普通变量。
我知道您问过有关使用Jenkins Pipeline的问题,而这种解释是使用WebUI的。 generic-webhook-trigger
的文档涵盖了适合您的情况的代码段。我决定添加WebUI解释,以便您了解其要点。