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 の意図とは逆)

補足

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions