繁体   English   中英

如果仅更改特定文件,则触发 jenkins 构建

[英]Trigger jenkins build if only a specific file is changed

我在 GIT 中有我的代码库。 代码库中有 5 个文件,即

  • 文件 1
  • 文件2
  • 文件 3
  • 文件 4
  • 文件5

我只想在文件 2 更改时触发 jenkins 构建。请注意,在触发构建后,它应该拉取整个代码库。

我尝试使用 poll SCM,但问题是如果存储库中的任何文件发生更改,就会触发构建。我只想在文件 2 更改时触发它。

是否可以?

这是我将如何做到的。

  1. 将您的 Jenkins 作业配置为Trigger builds remotely

这将启用JENKINS_URL/job/MYJOB/build?token=TOKEN_NAME形式的构建触发器 URL。 您必须自己指定令牌名称。

  1. 在你的 repo 上配置一个 git post-receive 钩子来调用那个触发器。

钩子的脚本通常在.git/hooks/post-receive post-receive hook 在整个过程完成后运行,可用于更新其他服务或通知用户。

post-receive hook 从 stdin 获取其参数,格式为<oldrev> <newrev> <refname>

您可以从新的 HEAD 提交中检索文件列表,然后仅在包含File2时才继续下一步。 像这样的东西(未测试):

#!/bin/bash
while read oldrev newrev refname
do
    # list of changed files for a commit
    filelist=$(git diff-tree --no-commit-id --name-only -r $newrev)
    if [[ $filelist == *"File2"* ]]; then
        # call the URL according to your build trigger config
    fi
done

有关 git 钩子的更多详细信息。

当您在 Jenkins 中配置 git checkout 时,有一个按钮可以添加其他行为。 这些选项之一是Polling ignores commits in certain paths 我还没有真正使用过它,但据我所知,这将满足您的需求。 有包括和排除选项。 我相信你只会使用包含。

是的,您需要安装 FS trigeer 插件,然后您可以在 jenkins 配置中包含和排除

链接在这里 - FSTrigger 插件

我能够使用这个插件来做到这一点,它就像一个魅力。

您需要在 Jenkins 中安装插件 Generic Webhook Plugin 并在配置中提供以下值。

变量:changed_files

表达式 : $.commits[ ].['modified',' added','removed'][ ]

表达式类型:JSONPath

在选项下:文本:$changed_files

表达式:路径/到/你的/文件

https://github.com/jenkinsci/generic-webhook-trigger-plugin/blob/master/src/test/resources/org/jenkinsci/plugins/gwt/bdd/gitlab/gitlab-push-specific-folder.feature

在我开始之前,您可能应该在 github 操作中执行此操作,这将非常简单,除非像我一样您被迫使用 Jenkins,否则这适合您。
因此,在对这个答案进行了一些搜索之后,我能够使用通用 webhook trigger来完成它,这是我上面获得 0 票的评论,我将尝试更清楚地了解这个过程:

  1. 将通用 webhook 触发器插件安装到 Jenkins,您可以从github webhook 负载中提取变量
  2. 然后,您可以使用通用 webhook 触发器插件创建作业
  3. 我使用了 github webhook 负载中的 3 个变量:(写在插件 json 路径表达式中)
    • $.ref(分支)
    • $.head_commit.modified(压缩提交修改文件数组)
    • $.html_url (repo url - 因为我想在 repo 上做动作如果改变)
  4. 在通用 webhook 触发器部分下的作业中,您可以使用可选过滤器来决定是否应触发作业。 对我来说,这是一个简单的检查分支主的正则表达式,并且“版本”文件在修改后的文件中
  5. 转到您的 Github 存储库并在设置 > 钩子 > 带有 url http://JENKINS_URL/generic-webhook-trigger/invoke 的新 webhook 中进行配置(我选择它来触发 PUSH 事件,这对我来说很重要)

调试:
Github 在这方面实际上很棒,一旦您配置了 webhook,您就可以看到发送给 Jenkins 的每个 POST 并看到 Jenkins 的响应。 通用 webhook 触发器文档中也有很好的例子

笔记:
注意不同的 github 动作有不同的有效载荷:一个 PR 动作不会有任何修改过的文件数组等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM