如何在 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 自动填充变量,如 gitlabSourceBranch 或 gitlabTargetBranch 以及未来版本中的更多内容.. 不确定这是否是一个错误,但如果没有启用一次,变量就不会被填充。
【讨论】:
以上是关于如何在 Web 挂钩 URL 中动态传递 git 分支名称?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 useEffect 挂钩中形成 setFieldValue
如何在不引用 React 中的动态值的情况下在 URL 中传递“:”?