imbajin commented on PR #2984:
URL: https://github.com/apache/hugegraph/pull/2984#issuecomment-4207695008
基于这个 PR 的目标,我建议把初版设计收敛成下面这件事:
- 只对 4 个主 CI 生效
- 当 workflow 失败时,自动 `rerun failed jobs`
- 直到成功,或者达到上限 K
- `K` 表示“自动 rerun 的次数”,默认建议 `2`
- 也就是:`1 次原始运行 + 最多 2 次自动 rerun = 最多 3 次 attempt`
- 保留基础记录信息即可
一个更易理解的版本可以是:
```text
第 1 次失败 -> 等待一小段时间 -> 自动重试
第 2 次失败 -> 等待一小段时间 -> 自动重试
第 3 次还失败 -> 停止,交给人工排查
```
```text
+----------------------+
| 主 CI workflow 完成 |
+----------+-----------+
|
v
conclusion == failure ?
|
+----+----+
| |
否 是
| |
| run_attempt <= K ?
| |
| +----+----+
| | |
| 否 是
| | |
| | sleep(delay)
| | |
| | gh run rerun <id> --failed
| |
v v
结束 等待下一次 completed 事件
```
按优先级我会建议:
**5 ⭐️ 必做:把当前“只自动补 1 次”改成“支持 K 次自动 rerun”**
当前的 `run_attempt < 2` 只允许补一次,这和 issue 里描述的“自动缓解 flaky / network failure”还有差距。
如果这里把 `K` 定义成“自动 rerun 的次数”,那默认值建议就是 `2`,语义非常直观:
- `K = 2`
- attempt 1 失败 -> 触发 rerun,进入 attempt 2
- attempt 2 失败 -> 再触发 rerun,进入 attempt 3
- attempt 3 失败 -> 停止
参考写法可以接近这样:
```yaml
env:
MAX_RERUNS: 2
if: >-
github.event.workflow_run.conclusion == 'failure' &&
fromJSON(github.event.workflow_run.run_attempt) <= fromJSON(env.MAX_RERUNS)
```
这样后续如果要从 `2` 调成 `3`,只需要改一个配置值。
**4 ⭐️ 很建议初版就做:给两次自动重试加一个小间隔**
如果失败原因是 Maven Central / Docker Hub / DNS 的短暂抖动,立刻 rerun 往往会再次撞到同一波抖动。
所以建议加一个很小的 delay,例如:
- 默认 `3 分钟`,或者
- 保守一点 `5 分钟`
最简单的实现就是在 controller workflow 里先 `sleep` 再 rerun:
```yaml
env:
RETRY_DELAY_SECONDS: 180
steps:
- name: Wait before rerun
run: sleep "$RETRY_DELAY_SECONDS"
- name: Rerun failed jobs
run: gh run rerun ${{ github.event.workflow_run.id }} --failed
```
这不是最省 runner minutes 的方案,但对初版来说非常直接,而且行为容易理解。
**3 ⭐️ 应该补上:把“基础记录信息”写得比现在更可读一点**
当前只有几行 `echo`,能看,但后面排查效果一般。建议顺手把这些信息写进 `GITHUB_STEP_SUMMARY`,至少包含:
- workflow name
- event type
- run id
- current attempt
- max reruns
- delay seconds
- action: rerun / skip
- reason: below limit / exceeded limit / non-failure
这样后面点开 Actions 页面时,维护者可以一眼看明白 controller 为什么做了这个决定。
**2 ⭐️ 建议保留:限制触发范围,只对正式 CI 路径生效**
既然这个 workflow 带 `actions: write`,那还是建议顺手把范围收窄一点:
- 只保留现在这 4 个主 CI workflow 白名单
- 再额外限制 source event 为 `push` / `pull_request`
- 如有需要,也可以限制 branch 范围
这样能避免手动调试 run 也被自动再补跑一次。
**1 ⭐️ 后续增强项:以后再考虑更细的策略,不必阻塞初版**
这些我觉得都可以留到第二步:
- 不同 workflow 设不同的 `K`
- 只对特定失败类型自动重试
- 统计过去 30 天 auto-rerun 命中率
- 给 PR 留一条汇总 comment
这些都不错,但不应该挡住初版上线。
如果要一句话概括我最推荐的初版目标,就是:
> 失败后不要只补 1 次;把它做成“默认最多自动 rerun 2 次,每次间隔 3 分钟,只重跑失败 jobs,并在 summary 里留下基础记录”。
我觉得这个版本已经足够实用,也比较符合 issue 里最初提的 flaky / network failure 自愈目标。
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]