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



我正在对在terragrunt.hcl文件上进行提交的目录运行遵从性扫描。

我希望当且仅当对目录及其子目录中的特定文件"terragrunt.hcl"的提交发生更改时,才触发. gitlab-ci.yaml的管道。是否有一种方法可以做到这一点与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

rules: ifrules:changes在这里:https://docs.gitlab.com/ee/ci/yaml/#rules和这里:https://docs.gitlab.com/ee/ci/yaml/#ruleschanges

最新更新