You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GitHub Actions Push流程中获取合并提交SHA以实现精准部署

解决GitHub Action审批部署时推送指定提交SHA到Heroku的问题

问题场景

我有一套多环境(qa、uat、prod)部署的GitHub Action:合并代码到main分支后自动部署QA环境,UAT和Prod环境需要审批后才能部署,部署操作通过向Heroku远程仓库执行git push完成。但等待审批期间main分支可能有新代码合并,此时批准旧的部署请求,会部署当前main分支的HEAD内容,而非触发该审批请求的那次合并提交SHA。需要修改Action,让推送到Heroku时使用触发工作流的特定提交SHA。


核心解决方案

利用GitHub Actions内置的github.sha环境变量,它会固定记录触发当前工作流实例的提交SHA。这个值在工作流触发时就已确定,不会随后续main分支的新提交改变,完全匹配需求。


修改主工作流代码

修正你的主工作流,将commit-sha参数设为${{ github.sha }},同时补充审批环境的配置(UAT/Prod需审批):

name: deploy
on:
  push:
    branches:
      - main
jobs:
  deploy-to-uat:
    environment: uat  # 需在GitHub仓库Settings->Environments中配置UAT环境的审批规则
    uses: ./.github/workflows/deploy-to-heroku.yml
    with:
      heroku-env: 'uat'
      commit-sha: ${{ github.sha }}

子工作流(deploy-to-heroku.yml)接收并使用指定SHA

在子工作流中定义输入参数,基于指定SHA完成代码检出和推送:

name: Deploy to Heroku
on:
  workflow_call:
    inputs:
      heroku-env:
        required: true
        type: string
      commit-sha:
        required: true
        type: string

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: 检出指定SHA的代码
        uses: actions/checkout@v4
        with:
          ref: ${{ inputs.commit-sha }}  # 确保操作基于触发工作流的特定版本

      - name: 配置Heroku CLI
        uses: akhileshns/heroku-deploy@v3.12.12
        with:
          heroku_api_key: ${{ secrets.HEROKU_API_KEY }}
          heroku_app_name: ${{ secrets.HEROKU_APP_NAME_${{ inputs.heroku-env }} }}
          heroku_email: ${{ secrets.HEROKU_EMAIL }}
          justlogin: true

      - name: 推送指定SHA到Heroku
        run: |
          git remote add heroku https://git.heroku.com/${{ secrets.HEROKU_APP_NAME_${{ inputs.heroku-env }} }}.git
          git push heroku ${{ inputs.commit-sha }}:main --force  # 替换main为你的Heroku部署分支

关键说明

  1. github.sha的取值:如果是PR合并到main,这个值就是合并提交的SHA;如果是直接push到main,就是push的提交SHA,完全符合需求。
  2. 代码检出环节:通过ref: ${{ inputs.commit-sha }}确保后续的依赖安装、构建等操作都基于触发工作流的版本,避免使用当前main分支的HEAD代码。
  3. 审批配置:需在GitHub仓库的Settings -> Environments中为UAT、Prod环境设置审批人,工作流运行到对应job时会自动暂停等待审批。

内容的提问来源于stack exchange,提问作者LoneWolfPR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:52:33