GitLab CI/CD:仅当特定目录中的文件发生更改时运行作业

70

我希望只有在存储库中特定目录中的文件发生更改时,才能在.gitlab-ci.yaml上运行特定的作业。GitLab的CI/CD工具是否有此功能,还是最好运行自定义构建脚本?

5个回答

120

GitLab 11.4 引入了变更策略。

例如:

docker build:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  only:
    changes:
      - Dockerfile
      - docker/scripts/*
      - dockerfiles/**/*
      - more_scripts/*.{rb,py,sh}

在上述情况下,如果您将多个提交推送到现有分支的GitLab,则GitLab会创建并触发docker构建作业,前提是其中一个提交包含以下更改之一:
  • Dockerfile文件。
  • docker/scripts/目录中的任何文件。
  • dockerfiles目录中的任何文件和子目录。
  • more_scripts目录中具有rb、py、sh扩展名的任何文件。

您可以在文档中阅读更多信息,并了解一些其他示例


13
有点不好笑的是,我们无法在文档中阅读更多信息。实际上,文档提供的信息比你在这里给出的信息还要少。 我仍然不明白为什么只键入目录名称(somedir或somedir/)不起作用,以及为什么somedir/不起作用,而仅somedir//*起作用,尽管支持somedir/**.extension。再加上关于路径是否可以相对或仅绝对(包括本地)的大混淆,这是一次相当不愉快的经历,如果有合适的文档,就可能会变得更好。 - Johan Boulé
7
只是提醒一下,要获取文件夹的递归,我必须添加“- foldername/**/*”。 - Erik
2
请尝试此文档链接@Johan Boulé(和其他人)。这将告诉您更多信息。https://docs.gitlab.com/ee/ci/jobs/job_control.html#onlychanges--exceptchanges-examples - Max O.
4
only is now considered obsolete. For more information, please refer to the following link: https://docs.gitlab.com/ee/ci/jobs/job_control.html#specify-when-jobs-run-with-only-and-except - undefined
1
现在only已经过时了。请参考https://docs.gitlab.com/ee/ci/jobs/job_control.html#specify-when-jobs-run-with-only-and-except - n.podbielski

30

自GitLab 12.3版本起,现在可以实现此功能:

rules:
    - changes:
      - package.json
      - yarn.lock
    - exists: 
      - node_modules
      when: never
    - when: always

您可以检查文件更改或检查文件是否存在。规则文档


22

3
你可以这样做:

您可以像这样操作:

trigger_documentation:
  image: alpine:3.8
  stage: trigger_documentation
  script:
    - apk update && apk add git curl bash
    - |
      if git diff --name-only --diff-filter=ADMR @~..@ |grep ^doc/; then
            echo "triggering..."
      fi

-2

你好,我对你最后一句话很感兴趣,你如何根据修改的文件来限制CI的操作? - Alejandro
1
@Alejandro 嗯,也许这不是最好的方法,但你可以比较提交的差异,并根据最后的更改决定要做什么。 - djuarezg

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