GitLab CI/CD:仅在特定文件更改时触发流水线

8

我正在对提交了 terragrunt.hcl 文件的目录运行合规性扫描。

我希望我的 .gitlab-ci.yaml 管道仅在目录及其子目录中这个特定文件 "terragrunt.hcl" 发生更改时触发,而且不会因其他任何提交而触发。使用GitLab的CI/CD工具是否有办法实现这一点,或者编写一个自定义构建脚本会更容易呢?

下面这条bash命令可以实现我的需求,但问题是它仍然在任何提交时触发管道,而我只想在那个特定的 terragrunt.hcl 上构建:

for i in $(git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA | xargs -n 1 dirname | uniq); do cd /scripts && ./run.sh /path/to/$i; done

我找到了这个资源:GitLab CI/CD: Run jobs only when files in a specific directory have changed,并且正在对其进行测试,但我需要额外的帮助!我离成功非常接近!!
1个回答

17

自Gitlab 11.4版本以来,onlyexcept关键字接受一个changes参数,使您能够定义仅在列出的文件之一发生更改时运行的作业。因此,对于您的示例,作业可能如下所示:

compliance_job:
  stage: compliance
  only:
    changes:
      - terragrunt.hcl
  script:
    - ./compliance_check.sh
这意味着只有当文件terragrunt.hcl发生更改时,compliance_job作业才会添加到管道中。 在Gitlab版本12.3中引入了rules关键字,它允许更精细的控制作业何时添加到管道中。它允许您执行以下操作:
compliance_job:
  stage: compliance
  rules:
    - if: $CI_COMMIT_MESSAGE ~= /compliance/ || $CI_COMMIT_REF_NAME == "main"
      changes:
        - terragrunt.hcl
      when: always
  script:
    - ./compliance_check.sh
这意味着如果提交信息包含单词“compliance”或分支或标签为“main”,并且更改了“terragrunt.hcl”文件,则将向管道添加“compliance_job”作业。 如果两个“if”条件都不成立,或者“terragrunt.hcl”文件没有更改,则该作业不会运行。 以下是使用“rules”关键字的另一种检查更改但不检查其他条件的方法。
compliance_job:
  stage: compliance
  rules:
    - changes:
        - terragrunt.hcl
        - file1.txt
        - file2.txt
        - path/to/file3.txt
      when: always
  script:
    - ./compliance_check.sh
在这个例子中,如果在最新一次提交中更改了列出的任何文件,则作业将运行,但我们不必使用“if”关键字来实现。您可以在此处阅读有关“only:changes”关键字的信息:https://docs.gitlab.com/ee/ci/yaml/#onlychangesexceptchanges。而“rules:if”和“rules:changes”的相关信息分别在此处:https://docs.gitlab.com/ee/ci/yaml/#ruleshttps://docs.gitlab.com/ee/ci/yaml/#ruleschanges

抱歉之前的信息不完整。看起来 if 语句就可以了 :) 由于我需要完整路径,这个命令 git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA 列出了我提交的所有文件及其完整路径,但我只想要那些已经修改了 terragrunt.hcl 的提交记录。我知道我的 if 语句是错误的,但只是为了让你明白我想要实现的目标:- if: git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA =~ /terragrunt.hcl/ - kddiji
我会编辑我的答案,展示另一种使用“rules”关键字的方式,这将使检查更改变得更容易。 - Adam Marshall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接