在 GitHub 合并队列中合并之前运行昂贵的 e2e 测试 – 这是正确的选择吗?

问题描述 投票:0回答:1

嗨,

在我们的 GitHub 存储库中,我们需要运行 e2e 测试,并且仅在拉取请求 (PR) 时才执行 已准备好合并(例如,至少获得一项批准)。我们不想将这些测试包含在基本测试中 拉取请求检查。

我们的 e2e 测试大约需要 10-15 分钟才能完成。我们选择了 GitHub Merge Queue 并准备了 在

gate.yml
事件上运行的
merge_group
工作流程。此外,我们还设置了 受保护分支的状态检查。

我们保留合并队列配置大部分默认:

  • 合并方法:合并提交
  • 构建并发: 5
  • 合并限制:
    • 最小拉取请求:1 或 5 分钟后(考虑到我们的测试需要 10 分钟,这似乎有问题)
    • 要合并的最大拉取请求:5
  • 状态检查超时:118分钟

问题:

合并单个 PR 时,一切正常。然而,当我们对 PR A 和 PR B 进行排队时,就会出现问题:

  1. PR A 添加到队列中,
    gate.yml
    工作流程开始。
  2. PR B 被添加到队列中,
    gate.yml
    工作流程也随之启动。
  3. 10 分钟后,PR A 的
    gate.yml
    工作流程成功完成,并且 PR A 已合并。
  4. 5 分钟后,PR B 的
    gate.yml
    工作流程也成功完成,但 PR B 未合并 – 相反,PR B 的
    gate.yml
    工作流程重新启动。
  5. PR B 最终仅在第二次
    gate.yml
    运行后才会合并,这还需要 10 分钟。

结果:

PR B 的

gate.yml
工作流程执行了两次,这是多余的并且会引入延迟。

问题:

  1. 我们如何配置合并队列,以便
    gate.yml
    工作流程不会为单个 PR 运行两次?
  2. GitHub Merge Queue 是适合我们用例的正确解决方案吗?或者我们应该尝试实现我们的自定义工作流程作为守卫,仅在拉取请求获得批准后才运行 e2e?
名称:门
在:
  合并组:
    类型:
      - 检查请求
职位:

e2e-阶段:
权限: id 令牌:写入 内容: 阅读 拉取请求:读取 名称: e2e-阶段 使用:./.github/workflows/rw-rush-build-e2e-tests.yml 秘密:继承

准备合并: 运行: 组:infra1-runners-arc 标签: 跑步者-小号 如果:总是() 需求: - e2e阶段 步骤: - name:检查所需作业是否成功 使用:re-actors/alls-green@release/v1 和: 允许跳过:${{ toJSON(needs) }} 工作:${{ toJSON(需要) }}

非常感谢您的帮助和提示

github github-actions
1个回答
0
投票

问题主要是由于并行运行而产生的。因此,最简单的解决方案是一次仅运行一个工作流程。不允许并行运行。

选项 2:使用缓存

为您的

gate
工作流程实现缓存机制

- name: Cache E2E Test Results
  uses: actions/cache@v3
  with:
    path: ./e2e-test-results
    key: e2e-${{ github.event.pull_request.head.sha }}

并在运行测试之前检查缓存

- name: Check Cache for Test Results
  id: cache-check
  uses: actions/cache@v3
  with:
    path: ./e2e-test-results
    key: e2e-${{ github.event.pull_request.head.sha }}

- name: Run E2E Tests
  if: steps.cache-check.outputs.cache-hit != 'true'
  run: ./run-e2e-tests.sh

或者选项 3 可能是仅在批准后才触发 e2e 测试。

© www.soinside.com 2019 - 2024. All rights reserved.