在GitLab CI中自定义每次合并请求前的CI流程

76次阅读
没有评论

问题描述

在GitLab CI中有一个CI流程,用于构建和测试产品。他们的产品可以明确地分为两个不同的部分,我们称它们为A和B。流程中耗时最长的部分是需要超过40分钟的端到端(e2e)测试,他们希望能够减少这个时间。目前这些测试在一个作业中执行。

由于他们的产品由A和B组成,每次合并请求都希望只运行一部分的e2e测试(只运行A部分的测试,或只运行B部分的测试,或全部运行),并且他们希望能够手动为每个合并请求指定这个部分。

他们正在寻找在GitLab CI中实现这个目标的最佳实践,但并没有找到一个合适的方法。他们想知道如何以最干净、最不显眼的方式实现这个目标。当然,他们还希望能够在主分支上运行所有的e2e测试。

他们考虑了在提交信息或合并请求标题中编码这些信息,并从环境变量中提取这些信息,但这两种方法都似乎不太理想。

解决方案

请注意以下操作可能涉及GitLab CI的特定功能或版本,可能会因版本差异而有所不同。

方案1:使用onlyexcept关键字

可以使用GitLab CI中提供的 onlyexcept 关键字来实现这个目标。以下是一个示例配置,针对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中提供的 onlyexceptrules 关键字,你可以根据分支名称灵活地控制每次合并请求前的CI流程。这将帮助你有效地减少e2e测试的执行时间,同时保持代码质量。

希望上述解决方案对你有所帮助。如果有任何问题或需要进一步的帮助,请随时提问。

正文完