1. 概述

GitHub Actions 是目前最强大的 CI/CD 平台之一,它允许我们为 GitHub 仓库自动化各种流程。在编写这些流程时,一个常见的需求是获取触发该流程的 commit message

利用这个信息,我们可以实现多种用途,比如自动生成 changelog、校验 commit 规范等。本文将介绍在 GitHub Actions 中获取 commit message 的多种方法,并附上完整的示例代码和截图。


2. 使用 github.event 上下文

GitHub Actions 提供了丰富的上下文变量,其中 github.event 包含了当前触发事件的详细信息。通过它,我们可以直接获取到 commit message。

2.1 针对 pull_request 事件

对于 PR 事件,我们可以通过 github.event.pull_request.titlegithub.event.pull_request.body 获取 commit 的标题和正文。

示例工作流:

name: Get Commit Message from Event Object

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  extract-commit-message:
    runs-on: ubuntu-latest
    steps:
      - name: Get commit message (Pull Request)
        if: github.event_name == 'pull_request'
        run: |
          echo "Commit Title: ${{ github.event.pull_request.title }}"
          echo "Commit Body: ${{ github.event.pull_request.body }}"

⚠️ 注意:这种方式只适用于单个 commit 的 PR,多个 commit 的情况下无法获取全部信息。

示例截图:

Sample Pull Request

执行日志:

Pull Request Event - Get Commit Message

2.2 针对 push 事件

对于 push 事件,我们可以通过 github.event.head_commit.message 获取最新 commit 的完整 message。

示例工作流:

name: Get Commit Message from Event Object

on:
  push:

jobs:
  extract-commit-message:
    runs-on: ubuntu-latest
    steps:
      - name: Get commit message (Push)
        if: github.event_name == 'push'
        run: |
          echo "Commit Message: ${{ github.event.head_commit.message }}"

日志截图:

Push Event - Get Commit Message Using Context

✅ 优点:简单直接
❌ 缺点:仅适用于最新 commit,不支持多 commit 场景


3. 使用 git 命令获取 commit message

github.event 无法满足需求时,我们可以使用 git 命令来获取更精确的 commit 信息。

3.1 针对 pull_request 事件

我们需要先 checkout 代码,然后通过 git fetch 获取 PR 的 commit 信息,最后使用 git log 解析 commit message。

示例工作流:

name: Get commit message using git log command

on:
  pull_request:

jobs:
  extract-commit-message:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Get commit message (Pull Request)
        if: github.event_name == 'pull_request'
        run: |
          pr_num=${{ github.event.pull_request.number }}
          git fetch origin refs/pull/${pr_num}/head:refs/remotes/origin/pull/${pr_num}/head
          commit_title=$(git log -1 --pretty=format:"%s" origin/pull/${pr_num}/head)
          commit_body=$(git log -1 --pretty=format:"%b" origin/pull/${pr_num}/head)
          echo "Commit Title: $commit_title"
          echo "Commit Body: $commit_body"

日志截图:

Pull Request Event - Get commit message using git log

3.2 针对 push 事件

同样地,我们可以使用 git log 获取当前分支的最新 commit 信息:

name: Get commit message using git log command
on:
  push:

jobs:
  extract-commit-message:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Get commit message (Push)
        if: github.event_name == 'push'
        run: |
          commit_title=$(git log -1 --pretty=format:"%s")
          commit_body=$(git log -1 --pretty=format:"%b")
          echo "Commit Title: $commit_title"
          echo "Commit Body: $commit_body"

日志截图:

Push Event - Get commit message using git log

✅ 优点:灵活,支持多 commit 场景
✅ 缺点:需要手动 checkout 和 fetch


4. 使用 GitHub API 获取 commit message

当本地命令无法满足需求时,我们可以调用 GitHub API 来获取更全面的 commit 数据。

4.1 针对 pull_request 事件

使用 octokit/request-action 调用 PR 的 commits 接口:

name: Get commit message using GitHub API

on:
  pull_request:

jobs:
  extract-commit-message:
    runs-on: ubuntu-latest
    steps:
      - name: Fetch commit messages from PR
        id: get_commits
        uses: octokit/[email protected]
        with:
          route: GET /repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/commits
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Get latest commit message
        run: |
          echo "Commit message:"
          echo '${{ steps.get_commits.outputs.data }}' | jq -r '.[-1].commit.message'

日志截图:

Pull Request - Get commit message using GitHub API

4.2 针对 push 事件

使用 compare API 获取两个 commit 之间的所有 commit:

name: Get commit message using GitHub API

on:
  push:

jobs:
  extract-commit-message:
    runs-on: ubuntu-latest
    steps:
      - name: Fetch commit messages
        id: get_commits
        uses: octokit/[email protected]
        with:
          route: GET /repos/${{ github.repository }}/compare/${{ github.event.before }}...${{ github.sha }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Get latest commit message
        env:
          DATA: ${{ steps.get_commits.outputs.data }}
        run: |
          echo "Commit message:"
          echo "$DATA" | jq -r '.commits[-1].commit.message'

日志截图:

Push Event - Get commit message using GitHub API

✅ 优点:支持多 commit、多分支场景
✅ 缺点:需要调用 API,略复杂


5. 总结

本文我们介绍了三种在 GitHub Actions 中获取 commit message 的方式:

方法 适用场景 是否支持多 commit 是否需调用 API
github.event 单 commit 的 PR / Push
git 命令 所有场景
GitHub API 所有场景

✅ 推荐使用 git 命令,通用性强,适合大多数实际项目场景
⚠️ 使用 github.event 时要注意其局限性(如仅支持单 commit)
💡 使用 API 可以获取最完整的信息,但会增加复杂度和依赖

根据实际需求选择合适的方式,才能写出更健壮、更灵活的 GitHub Actions 工作流。


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