GitHub 工作流失败后自动重新运行
有时你的 GitHub Actions 工作流会情绪化并由于随机原因失败。让我们看看如何自动重新运行它,以节省你的时间。
介绍
我们喜欢 GitHub Actions。它功能强大,并提供了慷慨的免费服务层。
随着我们的项目增长,我们在 GitHub Actions 工作流中添加了越来越多的集成测试。像其他酷项目一样,我们在每个拉取请求、推送和发布时运行我们的测试。
然而,由于集成测试的性质,有时我们的工作流会因为随机原因失败。可能是网络问题、浏览器故障,或者是一些难以重现的原因。
当工作流失败时,我们不得不手动重新运行它。一开始这并不是什么大问题,但对于像我们这样追求高效率的开发者来说,这还是有点恼人。
它是如何工作的
在撰写本文时,GitHub Actions 并没有提供内置的自动重新运行失败工作流的方法。所以让我们分解一下,看看我们如何实现这一点。
当一个工作流没有在运行并且已经失败时,你可以通过点击 “重新运行作业” 按钮手动重新运行它。它会打开一个下拉菜单,并有一个很好的 “重新运行失败的作业” 选项,跳过已成功的作业。
所以想法很简单:
- 我们需要检测工作流何时失败。
- 我们需要在工作流完成之后触发重新运行的动作。
显然,我们不能在同一个工作流中实现这一点,因为当工作流不在运行时,它什么都做不了。所以我们需要另一个工作流来监控前一个工作流的状态并触发重新运行动作。这可以通过以下方式来说明:
更新你的工作流
在你的库中创建一个新的工作流文件,例如 .github/workflows/rerun.yml
:
感谢 GitHub CLI,我们可以通过两个简单的命令轻松监控工作流的状态并重新运行它:
你只需要提供失败工作流的 run_id
,这可以通过使用 github.run_id
上下文来实现。例如,你可以通过在原始工作流中添加以下步骤来触发重新运行的工作流:
if: failure()
条件只会在作业失败时触发步骤。fromJSON(github.run_attempt) < 3
条件只会重新运行前两次尝试。你可以根据需要调整此数字。
此步骤使用 gh workflow run
命令触发重新运行的工作流。更多细节请参阅文档。
额外提示:从失败的分支运行重新运行的工作流
如果你想从失败的分支而不是默认分支运行重新运行的工作流,你可以使用以下命令:
如果是拉取请求,将使用 github.head_ref
上下文,否则将使用 github.ref_name
。
致谢
这种方法的想法最初来自 该 GitHub 讨论评论。