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

Vic*_*nez 14 git continuous-integration gitlab

当且仅当存储库特定目录中的文件发生更改时,我想在 .gitlab-ci.yaml 上运行特定作业。有没有办法使用 gilab 的 ci/cd 工具来做到这一点,或者只是运行自定义构建脚本会更容易吗?

Pez*_*vak 31

从 GitLab 12.3 开始,这是可能的:

rules:
    - changes:
      - package.json
      - yarn.lock
    - exists: 
      - node_modules
      when: never
    - when: always
Run Code Online (Sandbox Code Playgroud)

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


小智 29

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}
Run Code Online (Sandbox Code Playgroud)

在上面的场景中,如果您要将 GitLab 的多个提交推送到现有分支,GitLab 会创建并触发 docker 构建作业,前提是其中一个提交包含对以下任一方面的更改:

  • Dockerfile 文件。
  • docker/scripts/ 目录中的任何文件。
  • dockerfiles 目录中的任何文件和子目录。
  • more_scripts 目录中带有 rb、py、sh 扩展名的任何文件。

您可以在文档中阅读更多内容

  • 不太有趣的是我们无法在文档中阅读更多内容。该文档实际上包含的信息比您在此处提供的信息要少。我仍然想知道为什么只输入目录名称(somedir 或 somedir/)不起作用,也不知道为什么 somedir/** 不起作用,为什么只有 somedir/**/* 可以工作,即使 somedir/*支持*.扩展名。除此之外,对于路径是相对的还是绝对的(包括本地)存在很大的困惑,这是一种非常不愉快的体验,如果有合适的文档可以做得更好。 (13认同)
  • 只是仅供参考..为了获得文件夹递归,我必须添加 `-foldername/**/*` (8认同)
  • `only` 现在已过时 https://docs.gitlab.com/ee/ci/jobs/job_control.html#specify-when-jobs-run-with-only-and- except (5认同)
  • 尝试这个文档链接@Johan Boulé(以及其他任何人)。这告诉你更多。https://docs.gitlab.com/ee/ci/jobs/job_control.html#onlychanges-- exceptchanges-examples (3认同)

veb*_*ben 25

您可以使用rules:changes关键字来做到这一点:

rules:
  - changes:
    - directory/**/*
Run Code Online (Sandbox Code Playgroud)

请参阅: https: //docs.gitlab.com/ee/ci/yaml/#rules