在Github Actions中获取提交的SHA值

18
在Github action中,您可以使用${GITHUB_SHA}获取提交的SHA值,这是一个默认环境变量。但是,这个提交的SHA似乎是一个合并提交!它与在Pull Request的Github UI上显示的提交SHA不相等。您有什么想法如何获取在PRs上显示的SHA(在Github UI上)?
3个回答

29

理解发生了什么

参考:Github社区帖子,其中包含 weide-zhou (Github合作伙伴) 的答案。

当您创建拉取请求时,github将基于虚拟合并分支执行工作流程:refs/pull/:prNumber/mergemerge_commit_sha不存在于基础或头分支上,但指向该代理合并提交,并且有一个可合并的关键字来显示测试提交的状态。

因此,在这里,github.sha代表实际的合并提交。

Github变量

提示:您可以使用以下步骤打印GitHub变量

- name: Show GitHub context
  env:
    GITHUB_CONTEXT: ${{ toJson(github) }}
  run: echo "$GITHUB_CONTEXT"

看起来您想要的是${{ github.event.pull_request.head.sha }}值。

pull_request的情况下,最新提交的哈希可以在${{ github.event.pull_request.head.sha }}变量中找到,而${{ github.sha }}则指PR合并提交。

请注意,如果对于fork repo打开了pull_request,则github.event.pull_request变量将为空(不知道是否为错误或他们正在处理的内容)。


2
你不知道是否有通用的解决方案,无论工作流是从PR还是合并提交到主分支触发的? - MrModest
我认为只要 Github 上下文 JSON 对于两个触发器的结构不同,就不会有通用解决方案。 - GuiFalourd
也许有一种方法可以检查它是推送到开发分支还是拉取请求提交,这样我们就可以做到“如果是拉取请求,则执行此操作;如果是推送到分支,则执行那个操作”? - MrModest
我不知道如何区分它们,因为在GHA中,作为拉取请求提交到分支的提交被视为推送事件 - GuiFalourd

7

虽然这不是对问题的直接回答,但当我在寻找获取SHA的通用解决方案时,谷歌推荐了我这个问题,无论是push还是pull_request,我的答案可能对某些人有所帮助。

- name: Setup Environment (PR)  
  if: ${{ github.event_name == 'pull_request' }}  
  shell: bash  
  run: |  
    echo "LAST_COMMIT_SHA=${{ github.event.pull_request.head.sha }}" >> ${GITHUB_ENV}  
- name: Setup Environment (Push)  
  if: ${{ github.event_name == 'push' }}  
  shell: bash  
  run: |  
    echo "LAST_COMMIT_SHA=${GITHUB_SHA}" >> ${GITHUB_ENV}

现在我们可以使用来自 ENV 的 LAST_COMMIT_SHA 来获取最后一次提交的 SHA。如果我们需要在多个工作流中使用它,我们可以将这些步骤放到一个自定义操作中。

# .github/actions/prepare/action.yml
name: 'Preparation'
description: ''
runs:
  using: "composite"
  steps:
    - name: Setup Environment (PR)  
      if: ${{ github.event_name == 'pull_request' }}  
      shell: bash  
      run: |  
        echo "LAST_COMMIT_SHA=${{ github.event.pull_request.head.sha }}" >> ${GITHUB_ENV}  
    - name: Setup Environment (Push)  
      if: ${{ github.event_name == 'push' }}  
      shell: bash  
      run: |  
        echo "LAST_COMMIT_SHA=${GITHUB_SHA}" >> ${GITHUB_ENV}

并将其称为每个工作流程的第一步。
# .github/workflows/ci.yml
# ...
    steps:
      - name: Checkout Code
        uses: actions/checkout@v3
      - name: Prepare
        uses: ./.github/actions/prepare
# ...
      - name: Set build tag
        shell: bash
        run: |
          echo "BUILD_TAG=${LAST_COMMIT_SHA:0:7}" >> $GITHUB_ENV

4
谢谢,这正是我想要的圣诞礼物。 - Levin Magruder

0
你可以使用这个来检测拉取请求,甚至可以覆盖GITHUB_SHA为正确的值:
if [ "$GITHUB_EVENT_NAME" == "pull_request" ]; then
    GITHUB_SHA=$(cat $GITHUB_EVENT_PATH | jq -r .pull_request.head.sha)
fi

参考:https://github.com/orgs/community/discussions/26325

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接