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.title
和 github.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 的情况下无法获取全部信息。
示例截图:
执行日志:
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 }}"
日志截图:
✅ 优点:简单直接
❌ 缺点:仅适用于最新 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"
日志截图:
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"
日志截图:
✅ 优点:灵活,支持多 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'
日志截图:
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'
日志截图:
✅ 优点:支持多 commit、多分支场景
✅ 缺点:需要调用 API,略复杂
5. 总结
本文我们介绍了三种在 GitHub Actions 中获取 commit message 的方式:
方法 | 适用场景 | 是否支持多 commit | 是否需调用 API |
---|---|---|---|
github.event |
单 commit 的 PR / Push | ❌ | ❌ |
git 命令 |
所有场景 | ✅ | ❌ |
GitHub API | 所有场景 | ✅ | ✅ |
✅ 推荐使用 git
命令,通用性强,适合大多数实际项目场景
⚠️ 使用 github.event
时要注意其局限性(如仅支持单 commit)
💡 使用 API 可以获取最完整的信息,但会增加复杂度和依赖
根据实际需求选择合适的方式,才能写出更健壮、更灵活的 GitHub Actions 工作流。