问题描述
在GitLab CI中有一个CI流程,用于构建和测试产品。他们的产品可以明确地分为两个不同的部分,我们称它们为A和B。流程中耗时最长的部分是需要超过40分钟的端到端(e2e)测试,他们希望能够减少这个时间。目前这些测试在一个作业中执行。
由于他们的产品由A和B组成,每次合并请求都希望只运行一部分的e2e测试(只运行A部分的测试,或只运行B部分的测试,或全部运行),并且他们希望能够手动为每个合并请求指定这个部分。
他们正在寻找在GitLab CI中实现这个目标的最佳实践,但并没有找到一个合适的方法。他们想知道如何以最干净、最不显眼的方式实现这个目标。当然,他们还希望能够在主分支上运行所有的e2e测试。
他们考虑了在提交信息或合并请求标题中编码这些信息,并从环境变量中提取这些信息,但这两种方法都似乎不太理想。
解决方案
请注意以下操作可能涉及GitLab CI的特定功能或版本,可能会因版本差异而有所不同。
方案1:使用only
和except
关键字
可以使用GitLab CI中提供的 only
和 except
关键字来实现这个目标。以下是一个示例配置,针对A部分和B部分分别指定了不同的条件:
test:e2e:A:
script:
- # 在这里放置测试A部分的脚本
only:
refs:
- master
- /^A-.*$/
test:e2e:B:
script:
- # 在这里放置测试B部分的脚本
only:
refs:
- master
- /^B-.*$/
在上述示例中,我们为A部分和B部分分别定义了两个作业。通过 only
关键字,我们限制了这些作业仅在特定的分支上运行,如 master
主分支以及以 A-
或 B-
开头的分支。
方案2:使用rules
关键字
如果你的GitLab版本较新(>12.3),你也可以使用 rules
关键字来实现上述目标。以下是一个示例配置,针对A部分的规则:
test:e2e:A:
script:
- # 在这里放置测试A部分的脚本
rules:
- if: $CI_COMMIT_REF_NAME =~ /^A-.*$/
when: always
- if: $CI_COMMIT_REF_NAME =~ /^master$/
when: always
在上述示例中,我们使用了 rules
关键字,根据分支名称来定义何时运行作业。这个例子中,作业将在分支名称以 A-
开头或为 master
主分支时始终运行。
方案3:使用单一的正则表达式
如果你希望更简洁一些,你可以将A部分和master分支合并为一个正则表达式,像这样:
test:e2e:A:
script:
- # 在这里放置测试A部分的脚本
rules:
- if: $CI_COMMIT_REF_NAME =~ /^(A-.*|master)$/
when: always
在这个示例中,我们将 A 部分和 master 主分支的规则合并为一个正则表达式,作业将在分支名称以 A-
开头或为 master
主分支时始终运行。
请注意,上述示例可能需要根据你的具体情况进行微调。确保你的分支命名和配置相匹配。
结论
通过使用GitLab CI中提供的 only
、except
和 rules
关键字,你可以根据分支名称灵活地控制每次合并请求前的CI流程。这将帮助你有效地减少e2e测试的执行时间,同时保持代码质量。
希望上述解决方案对你有所帮助。如果有任何问题或需要进一步的帮助,请随时提问。