如何获取可靠Git引用关联GitHub Actions的PR与master分支push工作流?
问题:如何可靠关联GitHub Actions中pull_request与push工作流
我正在使用GitHub Actions,配置了两个工作流:
- 触发条件为
pull_request - 触发条件为
push
对应工作流配置片段如下:
on: workflow_dispatch: pull_request: branches: - master
on: workflow_dispatch: push: branches: - master
pull_request工作流会生成需要在push工作流中使用的资源,我需要一个可将两个工作流关联的标识符,理想为Git合并提交的SHA,但目前未找到可靠的引用方式。
当前我在pull_request工作流中使用${{ github.event.pull_request.head.sha }},在push工作流中使用如下配置:
- name: Setup repository uses: actions/checkout@v2 with: fetch-depth: 2 - name: Set CI_COMMIT_SHORT_SHA env property shell: bash run: echo "CI_COMMIT_SHORT_SHA=$(git rev-parse --short=8 HEAD^2)" >> $GITHUB_ENV
该方案多数时候可正常运行,但如果PR合并前有人向PR分支强制推送提交就会失效。请问有什么可靠的Git引用可以关联pull_request与push工作流?
解决方案
1. 优先使用PR编号作为稳定关联标识
PR编号是GitHub仓库内唯一且永久不变的标识,不会受分支强制推送、合并操作改动,是关联两个工作流最可靠的选择。
- 在
pull_request工作流中,直接通过${{ github.event.pull_request.number }}获取PR编号,将生成的资源与该编号绑定存储。 - 在PR合并触发的
push工作流中,从默认合并提交信息中提取PR编号:
- name: 提取关联PR编号 shell: bash run: | PR_NUM=$(echo "${{ github.event.head_commit.message }}" | grep -oP 'Merge pull request #\K\d+') echo "PR_NUM=$PR_NUM" >> $GITHUB_ENV
如果团队自定义了合并提交的消息格式,调整对应正则匹配规则即可。
2. 需使用SHA关联的替代方案
如果业务逻辑必须使用Git SHA作为关联键,可以直接监听PR合并事件替代单独的push事件,避免从提交树反查头SHA的不可靠问题:
on: pull_request: types: [closed] branches: - master jobs: process_merged_pr: if: github.event.pull_request.merged == true runs-on: ubuntu-latest steps: # 该上下文可同时获取PR头SHA和合并后的提交SHA,完全不受强制推送影响 - run: | echo "PR头SHA: ${{ github.event.pull_request.head.sha }}" echo "合并到master的提交SHA: ${{ github.event.pull_request.merge_commit_sha }}"
你可以直接在这个工作流中处理原push工作流的逻辑,也可以把两个SHA的映射关系存入GitHub Actions缓存,供后续push工作流读取使用。
3. 保留原架构的优化方案
如果你要保留原有的双工作流架构,可以把actions/checkout的fetch-depth设为0拉取全量提交记录,再通过PR编号匹配对应的提交记录,而非固定取HEAD^2,避免合并不是快进合并、提交树结构变动导致的匹配错误。
内容的提问来源于stack exchange,提问作者Gajus
相关产品推荐
相关产品推荐

