我正在开发一个多分支管道Jenkins设置和构建,它是使用Git中的webhook触发的。在这里,我选择了Git Branch source as - Git。
当我推送git中的任何更改时,webhook会创建一个包含所有推送事件详细信息的请求体。我如何从这里解析"git_http_url“值(它将包含我的git repo url)。然后我可以在jenkins控制台中使用这个值作为${myrepourl}。基本上我想避免硬编码repo url,它应该使用这个参数动态获取。
请指点一下。
]2]1:https://i.stack.imgur.com/sdb0l.png 2:https://i.stack.imgur.com/icPP9.png
发布于 2020-07-15 16:09:50
一开始,这看起来不是一个很好的主意。我将首先解释原因,概述替代方案,并在最后提出一个解决方案,如果您坚持这样做,该解决方案可能仍然有效。
当你配置你的管道时,你需要为它提供Jenkinsfile。它可以粘贴到配置中("Pipeline script"),或者您可以提供它的路径,以便Jenkins可以执行检出(“来自SCM的Pipeline script”)。在执行前者时,您有一个Jenkinsfile,因此不同的分支无法更改它(因此错过了拥有多分支的要点)。在执行后一种操作时,即使您可以参数化git代码库,您仍然需要提供路径(因为它不会到达github通知)。此外,我可以使用我的repo触发您的构建,但您的管道无论如何都不能正确地构建我的repo。因此,您的管道只能构建您的repo,在这一点上,您为什么坚持不为您的特定管道提供它特别知道如何构建的特定repo的路径,这一点有点不清楚。
大多数需要在Github上使用多分支管道的人都会使用专门为此目的编写的插件,例如Github多分支插件或Github组织。这些插件自己做所有的工作:它们注册通知,处理它们,并开始构建。他们还会为你更新Github中的构建状态。
最后,如果你坚持自己处理Github通知,你可以使用通用的Webhook触发器插件,它允许你通过POST-ing使用令牌触发作业到指定的URL。这可能看起来像这样:
pipeline {
agent { node { label 'master'} }
triggers {
GenericTrigger(causeString: 'Generic Cause',
genericVariables: [
[key: 'DATA', value: '$'], //JSONPath expression meaning "everything"
[key: 'GITHUB_URL', value: '$.project.git_http_url']
],
printContributedVariables: false, // change to 'true' to see all the available variables in the console
printPostContent: false, // change to 'true' to see the dump of the POST data
silentResponse: false,
token: 'my_token')
}按照第一个配置行,任何张贴的JSON都将被扁平化并转换为管道变量,并带有您定义的前缀(在本例中为"DATA_")。例如,Github有效负载中字段project中的字段git_http_url将在管道中定义,并作为DATA_project_git_http_url提供给您。根据第二个配置行,它还将以GITHUB_URL的形式提供。
你可以用例如测试你的管道。
curl -XPOST -H "Content-Type: application/json" 'http://<jenkins>/generic-webhook-trigger/invoke?token=my_token' --data '{"hello": "world"}'在本例中,提供的变量将为DATA_hello,并且它的值为world。(自然不会定义GITHUB_URL变量。)
如果你想把它变成真正的Github webhook处理器,你需要确保Github通知文件到达<jenkins>/generic-webhook-trigger/invoke?token=my_token。我们使用nginx来实现这一点,但还有很多其他选择。
https://stackoverflow.com/questions/62908257
复制相似问题