Github Actions如何同时更新多台服务器?
解决两台自托管Runner同时执行更新任务的问题
问题原因
你当前的工作流仅定义了一个build任务,GitHub Actions会自动从所有标记为self-hosted的空闲Runner中挑选一台来执行该任务,因此只会触发其中一台VPS的更新,另一台会处于等待状态,直到第一台离线才会被选中。
解决方案
方案一:使用矩阵策略(推荐)
给两台自托管Runner分别添加唯一标签(比如vps-1和vps-2),然后通过矩阵策略让工作流为每个标签创建独立的任务实例,实现并行执行。
修改后的工作流代码:
jobs: build: runs-on: ${{ matrix.runner-tag }} strategy: matrix: runner-tag: [vps-1, vps-2] node-version: [16.x] steps: - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} cache: 'npm' # 在此添加你的VPS更新步骤(比如部署脚本、服务重启等)
操作说明:
- 进入GitHub仓库的
Settings->Actions->Runners页面 - 分别为两台VPS的Runner添加唯一标签(比如
vps-1和vps-2) - 替换工作流中的
runner-tag矩阵值为你设置的标签 - 保存并触发工作流,两台Runner会同时执行任务
方案二:创建独立任务
直接定义两个独立的job,每个job指定对应VPS的Runner标签,实现并行执行。
修改后的工作流代码:
jobs: build-vps1: runs-on: vps-1 steps: - uses: actions/checkout@v3 - name: Use Node.js 16.x uses: actions/setup-node@v3 with: node-version: 16.x cache: 'npm' # 在此添加VPS1的更新步骤 build-vps2: runs-on: vps-2 steps: - uses: actions/checkout@v3 - name: Use Node.js 16.x uses: actions/setup-node@v3 with: node-version: 16.x cache: 'npm' # 在此添加VPS2的更新步骤
操作说明:
- 确保两台Runner已添加对应的唯一标签
- 每个job的
runs-on字段设置为对应Runner的标签 - 触发工作流后,两个job会并行执行,同时更新两台VPS
注意事项
- 确保部署密钥已正确配置到对应VPS,保证任务执行时拥有足够权限
- 如果更新步骤涉及共享资源(比如同一存储库的文件操作),需根据实际情况添加锁机制避免冲突
- 若需要控制任务并行数量,可在矩阵策略中添加
max-parallel字段设置最大并行数
内容的提问来源于stack exchange,提问作者zuZuu
相关产品推荐
相关产品推荐

