Skip to content

build-staged.yml: auto-skip incorrectly classifies non-doc changes as docs-only #80

Description

@toshi0806

概要

.github/workflows/build-staged.ymldetermine-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 の差分を正しく取るには以下のいずれか:

  1. base...head の triple-dot 構文を使う

    CHANGED_FILES=$(git diff --name-only "$GITHUB_BASE_REF...HEAD" 2>/dev/null || echo "")

    actions/checkout@v4fetch-depth: 0 か事前 git fetch origin "$GITHUB_BASE_REF" が必要

  2. HEAD^1 と HEAD^2 を比較 (merge commit 前提)

    CHANGED_FILES=$(git diff --name-only HEAD^1 HEAD^2 2>/dev/null || echo "")

    ※ 現在の fetch-depth: 2 でも動作する見込み

  3. GitHub の paths-filter action / API を使う

    • merge commit に依存しない、最も堅牢な方法

影響範囲

  • すべての PR で Dockerfile / toml / yaml 変更が CI 検証されないまま merge されうる
  • 動作確認をローカルで完結させるか、明示的に [build-all] タグを付与する運用が必要 (本来の auto-skip の意図とは逆)

補足

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions