GitLab CI/CD:仅在特定文件发生更改时触发管道

时间:2021-01-29 16:49:48

标签: bash gitlab gitlab-ci

我正在对在 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 个答案:

答案 0 :(得分:3)

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

compliance_job:
  stage: compliance
  only:
    changes:
      - terragrunt.hcl
  script:
    - ./compliance_check.sh

这意味着 complaince_job 作业只会在文件 terragrunt.hcl 发生更改时添加到管道中。

在 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_job 或分支或标记为 compliance,并且 main文件已更改。如果 terragrunt.hcl 条件都不为真,或者 if 文件未更改,则作业将不会运行。

这是使用 terragrunt.hcl 关键字检查更改但不检查其他条件的另一种方法:

rules

在此示例中,如果列出的任何文件在最新提交中发生更改,则作业将运行,但我们不必附带“if”。

您可以在此处阅读有关 compliance_job: stage: compliance rules: - changes: - terragrunt.hcl - file1.txt - file2.txt - path/to/file3.txt when: always script: - ./compliance_check.sh 关键字的信息:https://docs.gitlab.com/ee/ci/yaml/#onlychangesexceptchanges

only: changesrules: if 在这里:https://docs.gitlab.com/ee/ci/yaml/#rules 和这里:https://docs.gitlab.com/ee/ci/yaml/#ruleschanges