Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -32,6 +76,7 @@ jobs:

pack:
needs: test
# test がスキップされると pack もスキップされる
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7.0.1
Expand All @@ -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
Expand Down
3 changes: 2 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 のジョブ名を変えるとマージできなくなるので、ルールセットの必須チェックも合わせて変更する。

## バーコード処理

Expand Down
Loading