如何获取GitHub Actions矩阵作业各状态?实现分环境部署后通知
实现带矩阵部署与分环境通知的GitHub Actions工作流
要实现你需要的工作流,核心是让notification作业也对应一个和deploy完全匹配的矩阵,这样每个环境的通知作业能独立关联对应的部署实例,进而获取其状态。以下是完整的实现方案:
核心思路
默认情况下,当notification依赖整个deploy矩阵作业时,无法直接获取单个环境的部署状态。解决方法是:
- 给
notification设置与deploy完全一致的矩阵维度 - 通过
needs.deploy[matrix.stage].status的方式,精准获取对应环境的部署状态 - 用
if: always()确保无论部署成功/失败/跳过,通知都会执行
完整工作流代码
jobs: deploy: runs-on: ubuntu-latest defaults: run: shell: bash working-directory: ./infrastructure strategy: max-parallel: 3 matrix: stage: [dev, int, prd] fail-fast: true steps: - name: 检出代码 uses: actions/checkout@v4 - name: 部署至 ${{ matrix.stage }} 环境 run: | # 替换为你的实际部署逻辑(如Terraform、CloudFormation、CLI命令等) echo "开始部署 ${matrix.stage} 环境..." # 可选:模拟部署失败用于测试 # if [ "${matrix.stage}" = "prd" ]; then exit 1; fi notification: needs: deploy if: always() runs-on: ubuntu-latest strategy: matrix: stage: [dev, int, prd] steps: - name: 发送 ${matrix.stage} 环境部署通知 run: | # 获取对应环境的部署状态与结论 DEPLOY_STATUS="${{ needs.deploy[matrix.stage].status }}" DEPLOY_CONCLUSION="${{ needs.deploy[matrix.stage].conclusion }}" echo "=== ${matrix.stage} 环境部署结果 ===" echo "状态: $DEPLOY_STATUS" echo "结论: $DEPLOY_CONCLUSION" # 替换为你的实际通知逻辑(如Slack、邮件、企业微信等) # 示例:发送Slack消息 # curl -X POST -H "Content-Type: application/json" \ # -d '{"text":"【部署通知】${matrix.stage} 环境部署完成,状态: '$DEPLOY_STATUS'"}' \ # ${{ secrets.SLACK_WEBHOOK }}
关键细节说明
- 矩阵匹配:
notification的matrix.stage必须和deploy完全一致,确保每个环境的通知作业与部署作业一一对应。 - 状态获取:
needs.deploy[matrix.stage].status会返回对应部署实例的状态(success/failure/cancelled/skipped);conclusion字段会提供更具体的执行结论(如success、failure、skipped)。 if: always()的作用:即使某个环境的部署被跳过(比如fail-fast: true导致后续环境终止)或失败,对应的通知作业依然会执行,不会被忽略。fail-fast的影响:如果deploy的fail-fast设为true,当某个环境部署失败时,其余未执行的部署作业会被标记为skipped,对应的通知作业会获取到skipped状态;若设为false,每个环境的部署会独立执行,互不影响。
扩展技巧
- 可以根据
DEPLOY_STATUS或DEPLOY_CONCLUSION分支处理通知逻辑,比如失败时发送告警级别的消息,成功时发送普通通知。 - 若需要获取部署作业的更多信息(如日志链接、执行时长),可以通过
needs.deploy[matrix.stage].url获取作业的GitHub页面链接,或在deploy作业中输出自定义变量传递给notification。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

