如何利用GitHub Matrix创建多个自托管Runner部署不同数据库
使用GitHub Action Matrix实现自托管Runner与数据库部署一一对应
原Workflow存在的问题
你的代码有几个关键问题,导致无法实现“每个Runner对应部署一个数据库”的需求:
- Outputs语法错误:
setupjob的输出写法"${{ steps }}.${{ matrix.schema-runner }}.${{ outputs.runner-label }}"不符合GitHub Actions语法,正确引用步骤输出的格式是${{ steps.步骤ID.outputs.输出字段 }}。 - Outputs变量冲突:
setup是matrix任务,会生成两个独立实例,但它们输出的变量名都是gitrunner_label,最终只会保留最后一个实例的值,无法获取所有Runner的标签。 - Matrix无关联:
deployjob的matrix(db1/db2)和setup的matrix(runner1/runner2)没有绑定关系,无法确保每个数据库对应到指定的Runner。
修正后的Workflow代码
jobs: setup-runner: runs-on: ubuntu-latest strategy: # 明确绑定Runner标识与对应数据库,确保一一匹配 matrix: include: - runner-key: runner1 target-db: db1 - runner-key: runner2 target-db: db2 permissions: id-token: write contents: read outputs: # 用runner-key作为输出变量名的一部分,避免多实例输出冲突 runner-label-${{ matrix.runner-key }}: "${{ steps.create-runner.outputs.runner-label }}" steps: - name: Checkout code uses: actions/checkout@v3 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@master with: role-to-assume: ${{ secrets.ASSUME_ROLE_AMR }} aws-region: ${{ env.AWS_REGION }} - name: Create self-hosted runner on ECS id: create-runner uses: abc/action-self-hosted-runner-ecs@v0.0.4 with: ecs-cluster-name: ${{ secrets.CLUSTER_NAME_AMR }} # 可选:给Runner指定唯一名称,方便识别 runner-name: "db-deploy-${{ matrix.runner-key }}" deploy-db: # 依赖对应的setup-runner实例完成 needs: setup-runner strategy: # 复用与setup一致的matrix配置,保证对应关系 matrix: include: - runner-key: runner1 target-db: db1 - runner-key: runner2 target-db: db2 # 引用对应Runner的标签,确保部署任务跑在指定Runner上 runs-on: [self-hosted, "${{ needs.setup-runner.outputs['runner-label-' || matrix.runner-key] }}"] steps: - name: Checkout code uses: actions/checkout@v3 - name: Deploy target database run: | echo "开始部署数据库:${{ matrix.target-db }}" echo "运行在自托管Runner:${{ needs.setup-runner.outputs['runner-label-' || matrix.runner-key] }}" # 在这里添加实际的数据库部署命令,比如执行初始化脚本、配置实例等
关键改动说明
- 绑定Runner与数据库:通过
matrix.include直接定义runner-key和target-db的对应关系,从根源上保证一一匹配。 - 避免Outputs冲突:每个
setup-runner实例输出的变量名包含runner-key(如runner-label-runner1),这样多个实例的输出不会互相覆盖。 - 关联部署任务与Runner:
deploy-db的runs-on通过动态引用对应runner-key的输出标签,确保每个数据库部署任务跑在预先创建好的专属自托管Runner上。 - 保持Matrix一致性:
setup-runner和deploy-db使用相同的matrix配置,确保每个部署任务都有对应的Runner准备完成。
内容的提问来源于stack exchange,提问作者Manish
相关产品推荐
相关产品推荐

