如何在GitHub Actions中实现自托管Runner故障转移运行序列?
解决方案
要实现指定Runner优先执行、故障时自动切换到备用Runner的需求,你可以通过拆分作业+依赖判断的方式实现,具体配置如下:
核心思路
将任务拆分为两个顺序执行的作业:
- 第一个作业仅在
runner-01上运行目标任务 - 第二个作业仅在第一个作业失败/Runner断开导致任务终止时,在
runner-02上接管执行
GitHub Actions 配置示例
name: Long-running Task with Runner Fallback jobs: run-on-primary-runner: name: Execute task on runner-01 runs-on: [self-hosted, runner-01] steps: - name: Checkout code uses: actions/checkout@v4 - name: Run long-running task run: | # 替换为你的长时间任务命令 ./your-long-running-script.sh run-on-fallback-runner: name: Fallback to runner-02 if primary fails needs: run-on-primary-runner # 触发条件:主作业失败/被取消(Runner断开会导致作业被标记为cancelled) if: ${{ needs.run-on-primary-runner.result == 'failure' || needs.run-on-primary-runner.result == 'cancelled' }} runs-on: [self-hosted, runner-02] steps: - name: Checkout code uses: actions/checkout@v4 - name: Run long-running task (fallback) run: | # 与主作业相同的任务命令 ./your-long-running-script.sh
关键说明
- 关于
runs-on的逻辑:你之前使用的[self-hosted, runner-01, runner-02]是标签交集筛选,要求Runner同时拥有这三个标签才会被选中,并非你需要的 fallback 逻辑。 - 顺序执行保障:通过
needs字段让备用作业依赖主作业,只有主作业执行完成后,备用作业才会根据条件判断是否启动。 - 故障覆盖场景:
if条件同时包含failure(任务执行失败)和cancelled(Runner断开连接导致任务终止)两种情况,确保所有异常场景都能触发备用Runner。
内容的提问来源于stack exchange,提问作者bostontept
相关产品推荐
相关产品推荐

