通过解析Webhook请求主体/ JSONpath参数化我的仓库URL

时间:2020-07-15 05:39:53

标签: jenkins jenkins-pipeline jsonpath multibranch-pipeline git-webhooks

我正在使用多分支管道Jenkins进行设置,并且使用Git中的webhook触发了构建。在这里,我选择了Git Branch源作为-Git。

当我推送git中的任何更改时,webhook会创建带有所有推送事件详细信息的请求正文。我如何从这个解析“ git_http_url”值(它将有我的git repo url)。然后,可以在jenkins控制台中将此值用作$ {myrepourl}。基本上,我想避免对存储库URL进行硬编码,它应该动态地使用此参数。

请指导。

![webhook请求正文屏幕截图] [2]] [2] [![附上我的jenkins控制台分支源代码] [1]] [1] [1]:https://i.stack.imgur.com/sdb0l.png [2]:https://i.stack.imgur.com/icPP9.png

1 个答案:

答案 0 :(得分:0)

这似乎不是一个很好的主意。首先,我将解释原因,概述替代方案,最后提出一个解决方案,如果您坚持要这样做的话,它可能仍然有效。

配置管道时,需要为其提供Jenkinsfile。可以将其粘贴到配置中(“ Pipeline脚本”),也可以提供它的路径,以便Jenkins可以执行结帐(“ SCM的Pipeline脚本”)。在使用前者时,您只有一个Jenkinsfile,因此不同的分支无法更改它(因此失去了使用多分支的意义)。在执行后者时,即使您可以参数化git repo,您​​仍然需要提供路径(因为它不会在github通知中到达)。此外,我可以使用我的存储库触发您的构建,但是您的管道可能仍然无法正确构建我的存储库。因此,您的管道只能建立您的存储库,这时还不清楚为什么您坚持不为特定的管道提供指向您明确知道如何构建的特定存储库的路径。

大多数需要在Github上使用多分支管道的人都使用专门为此目的编写的插件之一,例如Github Multibranch插件或Github组织。这些插件自己完成所有工作:他们注册通知,处理通知并开始构建。他们还会为您更新Github中的构建状态。

最后,如果您坚持要自己处理Github通知,则可以使用通用Webhook触发器插件,该插件将允许您通过POST-使用令牌访问指定的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有效负载中字段git_http_url内的字段project将在管道中定义,并以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,但还有许多其他选择。