如何在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部署分支
关键说明
github.sha的取值:如果是PR合并到main,这个值就是合并提交的SHA;如果是直接push到main,就是push的提交SHA,完全符合需求。- 代码检出环节:通过
ref: ${{ inputs.commit-sha }}确保后续的依赖安装、构建等操作都基于触发工作流的版本,避免使用当前main分支的HEAD代码。 - 审批配置:需在GitHub仓库的Settings -> Environments中为UAT、Prod环境设置审批人,工作流运行到对应job时会自动暂停等待审批。
内容的提问来源于stack exchange,提问作者LoneWolfPR
相关产品推荐
相关产品推荐

