1. 概述

GitHub Actions 是目前最流行的 CI/CD 自动化工具之一。它可以通过监听 GitHub 仓库中的特定事件(如 pushpull_request 等)来触发自动化流程。

在某些场景下,获取 commit SHA 是非常有用的,例如用于版本打标(tagging)、与 GitHub API 交互等。

在本教程中,我们将探讨在 GitHub Actions 中获取 Commit SHA 的不同方式


2. Pull Request 中的 Merge Commit

在介绍如何获取 Commit SHA 之前,我们先来了解 Pull Request 中的 Merge Commit,这对理解不同场景下的 SHA 值非常关键。

当你发起一个 Pull Request 时,GitHub 会在后台生成一个内部的 Merge Commit,用以表示源分支与目标分支合并后的结果。这个 Commit 并不属于源分支或目标分支本身:

internal commit

需要注意的是,这里涉及三个 SHA 值:

  • 源分支头指针的 SHA
  • 目标分支头指针的 SHA
  • GitHub 自动生成的 Merge Commit 的 SHA

如果你的 Workflow 同时监听 pull_requestpush 事件,那么会生成两个不同的 Workflow 运行实例:

GitHub Action

对于 push 事件,通常你关心的是当前分支头指针的 Commit SHA;而对于 pull_request 事件,通常会使用 Merge Commit 的 SHA。

你也可以通过以下链接访问具体的 Commit 页面来验证:

https://github.com/[username]/[repository-name]/commit/[commit-sha]

3. 使用 github 上下文获取 Commit SHA

GitHub Actions 提供了一个内置的 github 上下文对象,其中包含了一些非常实用的字段,包括当前 Commit SHA。

3.1 push 事件

定义一个监听 push 事件的 Workflow:

$ cat .github/workflows/commit-sha-push.yml
name: Workflow to get commit sha in GitHub actions

on:
  push:

jobs:
  display-commit-sha:
    runs-on: ubuntu-latest
    steps:
      - name: commit SHA of the head of the branch
        run: echo "The commit SHA is ${{ github.sha }}"

github.sha 会自动设置为当前分支头指针的 Commit SHA。

运行结果如下:

commit SHA using github context

验证分支的 Commit 历史,可以看到值一致:

commit history

3.2 pull_request 事件

定义一个监听 pull_request 事件的 Workflow:

$ cat .github/workflows/commit-sha-pull-request.yml
name: Workflow to get commit sha in GitHub actions

on:
  pull_request:

jobs:
  display-commit-sha:
    runs-on: ubuntu-latest
    steps:
      - name: Get commit SHA of the merge commit
        run: echo "commit SHA:"  ${{ github.sha }}
      - name: Display Source and Target Commit SHA
        run: |
          echo "Source commit SHA: ${{ github.event.pull_request.head.sha }}"
          echo "Target commit SHA: ${{ github.event.pull_request.base.sha }}"

⚠️ 注意:在 pull_request 事件中,github.sha 表示的是 GitHub 自动生成的 Merge Commit 的 SHA。而源分支和目标分支的头 Commit SHA 可以通过 github.event 获取。

运行结果如下:

Commit SHA using github context

验证目标分支的历史:

commit history of main branch

查看 Merge Commit 页面:

pull request merge request


4. 使用 git 命令获取 Commit SHA

除了使用 github 上下文,我们还可以通过 git 命令来获取 Commit SHA。

4.1 push 事件

$ cat .github/workflows/commit-sha-push-git-cmd.yml
name: Workflow to get commit sha in GitHub actions

on:
  push:

jobs:
    display-commit-sha:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3

        - name: commit SHA of the head of the branch
          run: echo "The commit SHA is $(git rev-parse HEAD)"

✅ 使用 actions/checkout 拉取代码,然后通过 git rev-parse HEAD 获取当前 HEAD 指向的 Commit SHA。

运行结果如下:

commit sha for push event using git command

验证 Commit 历史:

git cmd - commit history for push event

4.2 pull_request 事件

$ cat .github/workflows/commit-sha-pull-request-git-cmd.yml
name: Workflow to get commit sha in GitHub actions

on:
  pull_request:

jobs:
  display-commit-sha:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Get commit SHA
      run: |
        git fetch origin \
        +refs/pull/${{ github.event.pull_request.number }}/\*:refs/remotes/origin/pull/${{ github.event.pull_request.number }}/\* \
        +refs/heads/${{ github.base_ref }}:refs/remotes/origin/${{ github.base_ref }}
        echo "Merge commit SHA: $(git rev-parse origin/pull/${{ github.event.pull_request.number }}/merge)"
        echo "Source commit SHA: $(git rev-parse origin/pull/${{ github.event.pull_request.number }}/head)"
        echo "Target commit SHA: $(git rev-parse origin/${{ github.base_ref }})"

✅ 通过 git fetch 获取 Pull Request 相关引用,并使用 git rev-parse 获取三个 Commit SHA:

  • Merge Commit
  • Source Branch Commit
  • Target Branch Commit

运行结果如下:

commit sha for pull request using git cmd

查看 Merge Commit 页面:

merge commit for pull request


5. 总结

在本教程中,我们学习了在 GitHub Actions 中获取 Commit SHA 的两种主要方式:

  • 使用 github 上下文直接获取(适用于简单场景)
  • 使用 git 命令手动获取(更灵活,适用于复杂场景)

✅ 对于 push 事件,推荐使用 github.shagit rev-parse HEAD
✅ 对于 pull_request 事件,注意区分 Merge Commit 与源/目标分支的 Commit SHA。

合理使用这些方法,可以让你在 CI/CD 流程中更灵活地控制构建、部署与版本标记等操作。


原始标题:Guide to Getting Commit SHA in GitHub Actions