当只有 Markdown 更改时,是否有一种方法可以跳过流水线?

11

目标

发布流程应该针对特定分支启动部署。
如果只有文档更改(*.md 文件),则此操作不应该发生(跳过此作业)。

问题

如果您更改多个文件,但只有一个文件以 .md 结尾,则 build 作业仍将被跳过。此作业不会运行任何文件。

https://docs.gitlab.com/ee/ci/jobs/job_control.html#onlychanges--exceptchanges-examples

那么,是否可能按照上述规则指定规则?

我到目前为止尝试的方法(摘录)

如果 "*.md" 不起作用,是否可以恢复它?
"**/!(*.md)" # 每个文件除了 *.md

这不会执行任何操作。

  rules:
    - if: $CI_COMMIT_BRANCH == "main"
      changes:
      - "**/!(*.md)" # Every file except *.md

这将始终执行

  rules:
    - if: $CI_COMMIT_BRANCH == "main"
    - changes:
      - "**/!(*.md)"

问题

我是否必须使用自定义变量来解决此问题,或者有更简单的方法?


嗨,可能不太优雅,但您可能会对类似这样的内容感兴趣。它使用Gitlab变量来保存SHA引用,因此您可以在shell脚本中运行git命令来检测更改。您可以在任何所需条件下中止脚本。 - asinkxcoswt
我经常发现每次进行更改时运行整个流程比向流程添加许多额外的配置并花费时间使其正常工作要更具成本效益。这是我的想法。 - Valentin Despa
1
@ValentinDespa 您说得完全正确,但我认为这是一个经常需要的(简单)用例... - kapsiR
3个回答

8

5
以下是更优雅的解决方案,并在GitLab文档中有详细记录。
所以有两种方法。
1. 要推送一个提交而不触发流水线,请在提交消息中添加`[ci skip]`或`[skip ci]`,大小写不限。
2. 或者,如果您使用的是Git 2.10或更高版本,请使用`ci.skip` Git推送选项。`ci.skip`推送选项不会跳过合并请求流水线。 对于GL版本2.18及更高版本,甚至可以使用简短版本: `git push --push-option=ci.skip` `git push -o ci.skip`
参考资料:

谢谢这个提示,但如果任何人都可以跳过它,我们就必须启用“跳过的管道被视为成功”。在合并任何内容之前,必须有一个成功的管道。 (只有*.md文件会是一个例外) - kapsiR
@kapsiR 很酷,我不知道这个。也许已经配置好了。当我在处理一些临时代码并想与团队分享时,我需要这个选项,因此创建了一个将要被抛弃的分支,并且不希望它通过庞大的管道和阻塞资源。 - Sanjay Bharwani
1
请编辑此答案(编辑队列已满,因此我无法编辑)。它应该是[skip ci]或[ci skip] - 没有方括号不起作用。 - Kappacake

4

我的一个同事研究了用于制定排除规则的通配符语法,并发现可以提供一系列条件,这些条件将按 AND 条件逻辑进行评估。请考虑以下内容:

.other_files_rule: &other_files_rule
  # Check if any files (not MD) changed
  # Glob syntax that checks for changes in all files except files that end with .md extension.
  # (Glob syntax tester: https://toools.cloud/miscellaneous/glob-tester)
  - changes:
      - "**/{.*,!(*.md)}"
    # If any non-MD files changed, always run the pipeline.
    when: always

# What happens if I updated CHANGELOG.md and some python file?
.md_only_rule: &md_only_rule
  # Check if any MD files changed
  # Glob syntax that checks for changes in files ending with .md extension.
  # (Glob syntax tester: https://toools.cloud/miscellaneous/glob-tester)
  - changes:
      - "**/*.md"
    # If any MD files changed, don't run the pipeline.
    when: manual
    # Allow failure must be true, else manual pipelines can never be successful without running the manual jobs.
    allow_failure: true

您需要两个规则,一个是排除MD文件,另一个是处理MD文件。


你能提供一个如何使用这些的例子吗? - secavfr
规则:
  • <<: *scheduled_master_pipeline
  • *other_files_rule
  • *md_only_rule
  • when: always
- Louis Parkin

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