問題点
- GitHub Actionsのpushイベントでは、CIが実行される前のコミットIDが
github.before.event
、最新のコミットIDがgithub.sha
で参照できる - 複数のコミットをまとめてプッシュした際に、最新のコミットID以外を参照したいといったケースが発生することがあるが、あらかじめ環境変数としては用意されていない
解決策
-
github.before.event
とgithub.sha
を利用してコミット履歴から抽出する
検証
- 設定
.github/workflows/main.yml
name: Commit log example
on:
push:
jobs:
job1:
runs-on:
- ubuntu-latest
steps:
# リポジトリをクローンする
- name: Checkout repository
uses: actions/checkout@v3
with:
# コミット履歴をどこまで遡って参照できるかの設定
# デフォルトでは 1 に設定されており、最新のコミット履歴しか参照できない
# 0 に変更することで、リポジトリの完全なコミット履歴を参照できるようになる
# ただし、コミット履歴が大きくなるとクローンに時間がかかるため、ボトルネックになる場合は適切な値を設定する
fetch-depth: 0
- name: Display commit log
# コミットID..コミットID とすることで、表示するコミット履歴の範囲を指定することができる
# --format="%s %H" と指定することで、コミットメッセージとコミットIDをワンライナーで表示できる
run: git log ${{ github.event.before }}..${{ github.sha }} --format="%s %H"
- 実行結果
- 最新のコミットID以外も参照できていることが分かる
Dockerコンテナを使用する場合
- Dockerコンテナ上でジョブを実行する場合は以下のような対応が追加で必要となる場合がある
.github/workflows/main.yml
name: Commit log example
on:
push:
jobs:
job1:
runs-on:
- ubuntu-latest
# Dockerコンテナ上でジョブを実行する
container:
image: debian:stable-slim
steps:
# 指定したDockerイメージにgitがインストールされていない場合に必要
- name: Install dependent packages
run: apt-get update && apt-get install git -y
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: 0
# リポジトリに設定されている所有者とアクセスしているユーザが異なる場合にエラーが発生する
# おそらく、Dockerコンテナ上にリポジトリがマウントされた際に、リポジトリの所有者がホストマシンのユーザのままになっていることが原因
# このエラーは無視しても特に問題無いので以下のコマンドで無視するように設定する
- name: Add safe directory
run: git config --global --add safe.directory $PWD
- name: Display commit log
run: git log ${{ github.event.before }}..${{ github.sha }} --format="%s %H"