From 312620e86ddef1c694808f9beb490bd211a92a11 Mon Sep 17 00:00:00 2001 From: cssho Date: Sat, 7 Nov 2026 00:02:34 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=81=A0=E3=81=91=E3=81=AE=E5=A4=89=E6=9B=B4=E3=81=A7?= =?UTF-8?q?=E3=81=AF=20test=20=E3=81=A8=20pack=20=E3=82=92=E3=82=B9?= =?UTF-8?q?=E3=82=AD=E3=83=83=E3=83=97=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit changes ジョブで変更ファイルを判定し、*.md・LICENSE・.claude/・dependabot.yml だけの変更なら test と pack をスキップする。paths-ignore だと必須チェックが 報告されずマージできなくなるため、結果をまとめる build-result ジョブを追加し、 これをルールセットの必須チェックにする。 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01HNb8H3hV3ndoRpyuu59g1u --- .github/workflows/build.yml | 56 +++++++++++++++++++++++++++++++++++++ CLAUDE.md | 3 +- 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6c1e3eb..0b4b6e0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,9 +13,53 @@ permissions: contents: read jobs: + # ドキュメントなどビルドに関係しないファイルだけの変更では、test と pack をスキップする。 + # paths-ignore でワークフローごと止めると必須チェックが報告されず PR をマージできなくなるため、 + # ワークフローは常に動かし、最後の build-result ジョブ(ルールセットの必須チェック)で結果をまとめる + changes: + runs-on: ubuntu-latest + outputs: + code: ${{ steps.filter.outputs.code }} + steps: + - uses: actions/checkout@v7.0.1 + with: + fetch-depth: 0 + persist-credentials: false + - name: ビルドに関係する変更があるか + id: filter + shell: bash + env: + EVENT_NAME: ${{ github.event_name }} + PR_BASE: ${{ github.event.pull_request.base.sha }} + PR_HEAD: ${{ github.event.pull_request.head.sha }} + PUSH_BEFORE: ${{ github.event.before }} + run: | + # ビルドに関係しないファイル(これ以外が1つでも変わっていればビルドする) + ignore='(\.md$|^LICENSE$|^\.claude/|^\.github/dependabot\.yml$)' + if [[ "$GITHUB_REF" == refs/tags/v* ]]; then + # タグは公開するので常にビルドする + echo "code=true" >> "$GITHUB_OUTPUT"; exit 0 + elif [[ "$EVENT_NAME" == pull_request ]]; then + files=$(git diff --name-only "$PR_BASE...$PR_HEAD") + elif [[ -n "$PUSH_BEFORE" && ! "$PUSH_BEFORE" =~ ^0+$ ]] && git cat-file -e "$PUSH_BEFORE^{commit}" 2>/dev/null; then + files=$(git diff --name-only "$PUSH_BEFORE" "$GITHUB_SHA") + else + # 比較元が分からない場合はビルドする + echo "code=true" >> "$GITHUB_OUTPUT"; exit 0 + fi + echo "$files" + if [[ -n "$files" ]] && ! grep -qvE "$ignore" <<< "$files"; then + echo "ビルドに関係する変更はないため、test と pack をスキップする" + echo "code=false" >> "$GITHUB_OUTPUT" + else + echo "code=true" >> "$GITHUB_OUTPUT" + fi + test: # コアは netstandard2.0 と net8.0 で処理が異なる(#if NET8_0_OR_GREATER)ため、両方のビルドをテストする name: test (${{ matrix.os }}, ${{ matrix.core }}) + needs: changes + if: needs.changes.outputs.code == 'true' runs-on: ${{ matrix.os }} strategy: fail-fast: false @@ -32,6 +76,7 @@ jobs: pack: needs: test + # test がスキップされると pack もスキップされる runs-on: ubuntu-latest steps: - uses: actions/checkout@v7.0.1 @@ -56,6 +101,17 @@ jobs: name: packages path: artifacts/ + # ルールセットの必須チェック。test・pack のどれかが失敗・キャンセルされたら失敗、 + # すべて成功またはスキップ(ドキュメントだけの変更)なら成功する + build-result: + if: always() + needs: [changes, test, pack] + runs-on: ubuntu-latest + steps: + - name: 結果の確認 + if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') + run: exit 1 + publish: if: startsWith(github.ref, 'refs/tags/v') needs: pack diff --git a/CLAUDE.md b/CLAUDE.md index e214b3e..9a9a887 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -45,7 +45,8 @@ - パッケージ作成時の検証(`EnablePackageValidation`)で、net8.0 版から netstandard2.0 版の公開 API が欠けているとエラー(CP0002)になる(net8.0 版にだけ API を足すのは検出しない)。 - あわせて、公開済みのバージョン(`Directory.Build.props` の `PackageValidationBaselineVersion`)と比べて公開 API を削除・変更していないかも確認する。破壊的変更をするメジャーバージョンアップでは、この基準を外すか更新する。 - NuGet パッケージの更新も Dependabot が PR にする。`SkiaSharp` とテスト用の `SkiaSharp.NativeAssets.Linux.NoDependencies` はバージョンを揃える必要があるので、グループにまとめて一緒に更新する。 -- master はルールセットで保護している(PR 経由のみ、CI の test 4 ジョブ・pack・verify-lockfile の成功が必須)。CI のジョブ名を変えるとマージできなくなるので、ルールセットの必須チェックも合わせて変更する。 +- `build.yml` は、ドキュメントなどビルドに関係しないファイル(`*.md`・`LICENSE`・`.claude/`・`.github/dependabot.yml`)だけの変更では test と pack をスキップする(`changes` ジョブで判定)。`paths-ignore` を使うと必須チェックが報告されず PR をマージできなくなるので使わない。 +- master はルールセットで保護している(PR 経由のみ、`build-result`(test・pack の結果をまとめるジョブ)と verify-lockfile の `verify` の成功が必須)。CI のジョブ名を変えるとマージできなくなるので、ルールセットの必須チェックも合わせて変更する。 ## バーコード処理