Github Actions 如何在build 运行后自动重启 重新运行?

36 min read

Github Actions 默认情况下不会自动重启并重新运行构建。但是,您可以使用 GitHub Actions 的 workflow_run 事件来完成这项任务。

首先,在您的 workflow 中设置一个 job ,并将其标记为失败时重新尝试:

name: My Workflow

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        os: [ubuntu-latest]
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      
      - name: Build
        run: |
          # 将构建命令添加在这里
          # 例如:npm install && npm run build          

    # 标记此 job 为 "失败时重新尝试"
    # 设置最大尝试次数为 3 次
    # 间隔为 10 秒
    retry:
      max-tries: 3
      delay: 10
      # 仅在构建失败时重新尝试
      when:
        failure: true

接下来,您需要为 workflow_run 事件创建一个触发器,以便可以在前一个构建失败时自动重启。要创建此触发器,请创建一个新的 workflow,并使用 workflow_run 事件。当前工作流中的所有 job 都将被重新运行:

name: Workflow Runner

on:
  workflow_run:
    workflows: ["My Workflow"]
    # 仅在 My Workflow 失败时运行此 workflow
    types:
      - completed
    # 仅当 My Workflow 中的所有 job 都失败时,才重新运行
    # 您可以根据需要更改此条件
    if: ${{ github.event.workflow_run.conclusion == 'failure' && github.event.workflow_run.jobs.every(job => job.conclusion == 'failure') }}

jobs:
  runner:
    runs-on: ubuntu-latest
    steps:
      - name: "Rerun My Workflow"
        run: echo "My Workflow Failed. Rerunning..."  # 在这里输入您想要运行的命令
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        
        # 声明需要运行的工作流程
        uses: peter-evans/workflow-dispatch@v1
        with:
          workflow: My Workflow

此 workflow 启用 peter-evans/workflow-dispatch 动作以触发 My Workflow 的重新运行。在 peter-evans/workflow-dispatch 动作中,您需要使用 secrets.GITHUB_TOKEN 对工作流程进行身份验证。

这样,每当 My Workflow 失败时,Workflow Runner 就会自动触发并重新运行整个工作流。