如何在 Web 挂钩 URL 中动态传递 git 分支名称?

Posted

技术标签:

【中文标题】如何在 Web 挂钩 URL 中动态传递 git 分支名称?【英文标题】:How to pass git branch name dynamically in web hook URL? 【发布时间】:2020-12-10 01:07:30 【问题描述】:

我在 Jenkins 中使用参数化的声明性下游作业。 在 webhook 期间,我需要将 git_repo 和 git_branch 作为参数传递。

而且我已经在 Gitlab 仓库中定义了这个参数

示例

https://myjenkins.com/job/myjob-builder-downstream/buildWithParameters?token=1qqq1f54ff88e373b3c0&git_repo=git@mygitlab:development/myproduct.git&git_branch=master

在 webhook 期间,我不知道如何将分支名称动态传递给我的下游作业?

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

主要提供商(bitbucket、github 和 gitlab)不允许我们在静态 webhook url 注册步骤中进行这种级别的参数化:

比特桶

Github

Gitlab



那么,解决办法是什么?

这些提供程序为我们提供了另一种选择:Webhook 后有效负载解释。

它是如何工作的?

当 github(example) 调用我们的 webhook url 时,发送一个带有 json 的 body http,其中包含有关事件的大量信息:

分公司名称 存储库名称 执行推送事件的用户名 git 提交消息 等

所以在你的 webhook url 的后端,你必须解析这个 json 并获取你想要的值并启动你的自定义逻辑。以下是这些 json 主体的一些示例:

gitlab json payload github json payload bitbucket json payload

很遗憾,对于 github、gitlab 和 bitbucket,json 是不一样的



Jenkins 插件

如果你使用一些 jenkins 插件,你可以取消这个 json 解析。一个由供应商提供。在你的情况下gitlab-plugin。如果您查看源代码,您将查看 json 解析。



easy-webhook-plugin

如果您使用多个提供商或自定义插件对您没有帮助,您可以尝试我的通用插件。

https://github.com/utec/easy-webhook-plugin

它是如何工作的?:

插件公开一个类似于您的方法的公共 url 或其他插件的 url:

https://myjenkins.com/project/myjob-builder-downstream/buildWithParameters?token=1qqq1f54ff88e373b3c0&git_repo=git@mygitlab:development/myproduct.git&git_branch=master

但有一些差异,我认为,更干净和容易:

http://my_jenkins.com/easy-webhook-plugin-RDcd4y3LkDcMKKhG/?scmId=gitlab&jobId=hello_word_job

您必须在其中指明 scmId(gitlab 或 bitbucket)和任何 jenkins 作业的 id。

执行git push时,gitlab会将json发送到这个url,我的插件会解析它并将一些标准参数转发给你的工作:

存储库名称 分行名称 作者身份 事件消息

您可以使用 jenkins 中的经典“params”变量访问这些参数,并为所欲为!

node 
   echo 'New build detected with these incoming parameters: '+params

关注官方readme 或随时通过issue与我联系

【讨论】:

【参考方案2】:

Jenkins gitlab 插件有预定义变量:

https://plugins.jenkins.io/gitlab-plugin/

参见定义的变量部分。但是为了使用它们,您需要启用 This project is parametrized 部分而不添加任何变量,这会触发 webhook 自动填充变量,如 gitlabSourceBranchgitlabTargetBranch 以及未来版本中的更多内容.. 不确定这是否是一个错误,但如果没有启用一次,变量就不会被填充。

【讨论】:

以上是关于如何在 Web 挂钩 URL 中动态传递 git 分支名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 useEffect 挂钩中形成 setFieldValue

如何在@Url.Action 中传递动态值?

如何在预提交挂钩中使用 git diff 的退出代码

如何在不引用 React 中的动态值的情况下在 URL 中传递“:”?

如何在数组依赖中正确使用 useEffect 挂钩。我从 redux 商店传递了状态,但我的组件仍然无限渲染

如何从使用状态挂钩的功能性父组件传递道具?