gitlab ci 里的 rules 和 only 区别是什么
gitlab ci 里的 rules 和 only 区别是什么
在 GitLab CI/CD 中,rules
和 only
是用来控制流水线中作业的执行条件的两种不同机制,但它们的功能和灵活性有显著差异。
1. 功能定位
only
是一个较早引入的语法,用于定义作业在哪些分支、标签或事件触发时运行。它的规则相对简单,主要用于基于预定义条件(如分支名称或事件类型)来过滤作业。"only 定义分支规则"
rules
是一种更灵活和强大的配置方式,支持复杂的条件判断、文件变化监听和变量检查等动态逻辑。它允许更精细地控制作业的执行行为。"rules 更加强大,支持条件判断、文件变化监听和文件存在检查"
2. 灵活性
only
的局限性:- 只能基于固定的条件(如分支名称、标签或事件类型)来决定是否运行作业。
- 不支持复杂的逻辑组合,例如结合多个条件或使用变量进行动态判断。
- 如果需要更复杂的控制,则需要借助
except
来排除特定条件。 > "如果 only 和 except 在一个 job 配置中同时存在,则以 only 为准,跳过 except"
rules
的优势:- 支持复杂的条件逻辑,例如使用
if
表达式、变量检查、文件变化监听等。 - 可以根据不同的条件动态设置作业的行为(如自动运行、手动触发或跳过)。 > "rules 是GitLab CI中更灵活的规则配置方式,用于动态决定作业的运行条件"
- 支持复杂的条件逻辑,例如使用
3. 默认行为
only
的默认行为:- 如果没有定义
only
或except
,默认情况下作业会在所有分支和标签上运行。 > "当一个作业没有定义 only 规则时,其默认为 only: ['branches', 'tags']"
- 如果没有定义
rules
的默认行为:- 如果没有定义
rules
,作业会根据默认规则运行。rules
不依赖于only
或except
的默认行为。 > "如果作业不使用 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. 发展趋势
only
和except
正在逐渐被废弃:- 虽然目前仍然可以使用
only
和except
,但 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"
- 虽然目前仍然可以使用
总结
- 如果你需要简单的分支或事件过滤,可以继续使用
only
和except
。 - 如果你需要更复杂的条件控制,或者希望未来的项目更具可维护性,建议使用
rules
。 > "rules 更加强大,支持条件判断、文件变化监听和文件存在检查" .