gitlab ci 里的 rules 和 only 区别是什么

gitlab ci 里的 rules 和 only 区别是什么

在 GitLab CI/CD 中,rulesonly 是用来控制流水线中作业的执行条件的两种不同机制,但它们的功能和灵活性有显著差异。

1. 功能定位

  • only 是一个较早引入的语法,用于定义作业在哪些分支、标签或事件触发时运行。它的规则相对简单,主要用于基于预定义条件(如分支名称或事件类型)来过滤作业。

    "only 定义分支规则"

  • rules 是一种更灵活和强大的配置方式,支持复杂的条件判断、文件变化监听和变量检查等动态逻辑。它允许更精细地控制作业的执行行为。

    "rules 更加强大,支持条件判断、文件变化监听和文件存在检查"


2. 灵活性

  • only 的局限性

    • 只能基于固定的条件(如分支名称、标签或事件类型)来决定是否运行作业。
    • 不支持复杂的逻辑组合,例如结合多个条件或使用变量进行动态判断。
    • 如果需要更复杂的控制,则需要借助 except 来排除特定条件。 > "如果 only 和 except 在一个 job 配置中同时存在,则以 only 为准,跳过 except"
  • rules 的优势

    • 支持复杂的条件逻辑,例如使用 if 表达式、变量检查、文件变化监听等。
    • 可以根据不同的条件动态设置作业的行为(如自动运行、手动触发或跳过)。 > "rules 是GitLab CI中更灵活的规则配置方式,用于动态决定作业的运行条件"

3. 默认行为

  • only 的默认行为

    • 如果没有定义 onlyexcept,默认情况下作业会在所有分支和标签上运行。 > "当一个作业没有定义 only 规则时,其默认为 only: ['branches', 'tags']"
  • rules 的默认行为

    • 如果没有定义 rules,作业会根据默认规则运行。rules 不依赖于 onlyexcept 的默认行为。 > "如果作业不使用 only、except 或 rules,则 only 默认"

4. 示例对比

使用 only 的例子:

job:
  script: echo "This job runs on main branch"
  only:
    - main

这个例子表示作业只会在 main 分支上运行 。

使用 rules 的例子:

job:
  script: echo "This job runs on main branch or when file.txt changes"
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
    - changes:
      - file.txt

这个例子表示作业会在 main 分支上运行,或者当 file.txt 文件发生变化时运行 。


5. 发展趋势

  • onlyexcept 正在逐渐被废弃
    • 虽然目前仍然可以使用 onlyexcept,但 GitLab 官方推荐在新项目中使用 rules,因为它更灵活且功能更强大。 > "I know that only is slowly becoming obsolete, although it can still be used, but I'd like to use rules for the new projects in any case"

总结

  • 如果你需要简单的分支或事件过滤,可以继续使用 onlyexcept
  • 如果你需要更复杂的条件控制,或者希望未来的项目更具可维护性,建议使用 rules。 > "rules 更加强大,支持条件判断、文件变化监听和文件存在检查" .