繁体   English   中英

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

[英]GitLab CI/CD: Trigger pipeline only when a specific file have changed

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

我想要我的管道. gitlab-ci.yaml . 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:仅在特定目录中的文件发生更改并且仍在对其进行一些测试时运行作业,但我将不胜感激任何额外的帮助!!! 我很亲近!!

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

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

这意味着只有当文件terragrunt.hcl发生更改时,才会将complaince_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

And the rules: if and rules:changes are here: https://docs.gitlab.com/ee/ci/yaml/#rules and here: https://docs.gitlab.com/ee/ci/yaml/#规则变更

暂无
暂无

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

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