概要
.github/workflows/build-staged.yml の determine-strategy ジョブにある auto-skip 検出が、Dockerfile / Dockerfile.lite / toml/*.toml / .github/workflows/*.yml などビルドをトリガーすべき変更を含む PR でも Documentation-only change: true と誤判定し、Lite / Full ビルドをスキップしてしまう。
再現例
PR #79 のコミット 99f207a は以下を変更しているが CI 上では「docs only」と判定された:
.github/workflows/pr-test.yml
CLAUDE.md
Dockerfile ← ビルドトリガー対象
Dockerfile.lite ← ビルドトリガー対象
IMAGE_SIZE_ANALYSIS.md
README.md
toml/install-script.toml ← ビルドトリガー対象
toml/installscript.toml ← ビルドトリガー対象
該当 CI run: https://github.com/smkwlab/atcoder-container/actions/runs/25650566629
determine-strategy/Determine build strategy:
Commit message: Update Java to 24.0.2 and Rust to 1.89.0 (#78)
Documentation-only change: true
Build skipped: only documentation files changed
根本原因
.github/workflows/build-staged.yml L77 の git diff 引数が PR コンテキストで逆方向になっている:
if [[ "$EVENT_NAME" == "pull_request" ]]; then
CHANGED_FILES=$(git diff --name-only HEAD^2 HEAD 2>/dev/null || git diff --name-only HEAD^ HEAD 2>/dev/null || echo "")
else
CHANGED_FILES=$(git diff --name-only HEAD^ HEAD 2>/dev/null || echo "")
fi
GitHub Actions の PR チェックアウトでは merge commit ができ、HEAD^1 = base (main), HEAD^2 = PR head になる。git diff HEAD^2 HEAD は 「PR head から merge commit までの差分」、すなわち PR が分岐後に base 側で追加された変更 を返す。PR 自身が追加した変更ではない。
そのため、main が PR 分岐後に進んでいない / docs しか進んでいない場合、この diff は空または .md のみになり、PR 内のどんな変更 (Dockerfile を含む) でも DOCS_ONLY=true と判定される。
修正案
PR の差分を正しく取るには以下のいずれか:
-
base...head の triple-dot 構文を使う
CHANGED_FILES=$(git diff --name-only "$GITHUB_BASE_REF...HEAD" 2>/dev/null || echo "")
※ actions/checkout@v4 の fetch-depth: 0 か事前 git fetch origin "$GITHUB_BASE_REF" が必要
-
HEAD^1 と HEAD^2 を比較 (merge commit 前提)
CHANGED_FILES=$(git diff --name-only HEAD^1 HEAD^2 2>/dev/null || echo "")
※ 現在の fetch-depth: 2 でも動作する見込み
-
GitHub の paths-filter action / API を使う
- merge commit に依存しない、最も堅牢な方法
影響範囲
- すべての PR で Dockerfile / toml / yaml 変更が CI 検証されないまま merge されうる
- 動作確認をローカルで完結させるか、明示的に
[build-all] タグを付与する運用が必要 (本来の auto-skip の意図とは逆)
補足
概要
.github/workflows/build-staged.ymlのdetermine-strategyジョブにある auto-skip 検出が、Dockerfile / Dockerfile.lite /toml/*.toml/.github/workflows/*.ymlなどビルドをトリガーすべき変更を含む PR でもDocumentation-only change: trueと誤判定し、Lite / Full ビルドをスキップしてしまう。再現例
PR #79 のコミット
99f207aは以下を変更しているが CI 上では「docs only」と判定された:該当 CI run: https://github.com/smkwlab/atcoder-container/actions/runs/25650566629
根本原因
.github/workflows/build-staged.ymlL77 のgit diff引数が PR コンテキストで逆方向になっている:GitHub Actions の PR チェックアウトでは merge commit ができ、
HEAD^1= base (main),HEAD^2= PR head になる。git diff HEAD^2 HEADは 「PR head から merge commit までの差分」、すなわち PR が分岐後に base 側で追加された変更 を返す。PR 自身が追加した変更ではない。そのため、main が PR 分岐後に進んでいない / docs しか進んでいない場合、この diff は空または .md のみになり、PR 内のどんな変更 (Dockerfile を含む) でも
DOCS_ONLY=trueと判定される。修正案
PR の差分を正しく取るには以下のいずれか:
base...head の triple-dot 構文を使う
CHANGED_FILES=$(git diff --name-only "$GITHUB_BASE_REF...HEAD" 2>/dev/null || echo "")※
actions/checkout@v4のfetch-depth: 0か事前git fetch origin "$GITHUB_BASE_REF"が必要HEAD^1 と HEAD^2 を比較 (merge commit 前提)
CHANGED_FILES=$(git diff --name-only HEAD^1 HEAD^2 2>/dev/null || echo "")※ 現在の
fetch-depth: 2でも動作する見込みGitHub の
paths-filteraction / API を使う影響範囲
[build-all]タグを付与する運用が必要 (本来の auto-skip の意図とは逆)補足
[build-all]付き空コミットで強制ビルドで対処済み