如何在失败时自动重试 github Action 作业?

Ale*_*hen 27 github

我正在构建 github 操作管道,我想在我的作业中添加自动重试,类似于retry 关键字在 gitlab 中的工作方式,失败时将再次运行完整步骤。github actions 中有什么允许这样做的吗?

这是我正在使用的一个示例作业:

jobs:
  env-check:
    runs-on: ubuntu-latest
    container:
      image: myimage
    steps:
      - uses: actions/checkout@v2
      - name: env-check
        run: |
          echo "foobar"
Run Code Online (Sandbox Code Playgroud)

Von*_*onC 22

GitHub Action 语法中似乎没有重试,这就是为什么您会发现互补的 GitHub Actions,例如:

  • 重试步骤:在失败或超时时重试操作步骤。目前,这旨在取代喜怒无常的命令的运行步骤。
  • 重试操作:失败时重试 Github 操作步骤或命令。

例子:

uses: nick-fields/retry@v2
with:
  timeout_minutes: 10
  max_attempts: 3
  command: npm run some-typically-slow-script
Run Code Online (Sandbox Code Playgroud)

但这些指令不能与其他uses指令一起使用,对吗?
那么它们只有在您运行显式命令且没有依赖项时才起作用?

正确的。通过重新运行您指定的命令来重试诸如nick-fields/retry工作之类的操作,因此它不会直接与其他uses指令一起使用。这意味着当您运行显式 shell 命令时它最适用。

但是,如果您正在使用的操作可以通过 shell 命令运行,则您可以解决此限制。许多操作本质上只是可以从命令行执行的脚本,因此如果您使用的操作符合此描述,则可以使用重试操作来重新运行该命令。

例如,如果您正在使用类似的操作,actions/checkout@v2并且它有一个命令行界面,您可以执行如下操作:

uses: nick-fields/retry@v2
with:
  timeout_minutes: 10
  max_attempts: 3
  command: |
    git clone https://github.com/{owner}/{repo}.git
    cd {repo}
Run Code Online (Sandbox Code Playgroud)

请记住,这只是一种解决方法,可能并不适用于每个操作。
此外,如果您使用的操作没有命令行界面,或者它执行无法使用 shell 命令轻松复制的复杂任务,则此解决方法将不适用。

最后,请注意,重试操作将重试整个命令,因此,如果您有多个命令并且只想重试特定命令,则需要使用重试操作的多个实例。


美联社在评论中补充道:

实际上,经过几个小时的观察,这个重试操作Wandalen/wretry.action似乎确实做了正确的事情:在命令和子操作情况下。

请注意,官方文档仍然是“重新运行工作流程和作业”。

  • 伟大的!但这是在同一个运行器上执行的,对吗?如果我们可以重试另一个可用的跑步者,那就太好了。在我的设置中,跑步者通常是问题所在。 (2认同)

小智 6

您可以使用其他作业重新运行当前工作流程中失败的作业。如果其中任何一个作业失败,它将在所有其他作业之后执行。

rerun-failed-jobs:
    runs-on: ubuntu-latest
    needs: [ job1, job2]
    if: failure()
    steps:
      - name: Rerun failed jobs in the current workflow
        env:
          GH_TOKEN: ${{ github.token }}
        run: gh run rerun ${{ github.run_id }} --failed
Run Code Online (Sandbox Code Playgroud)