From cbcb60f04ada5b53afa6157fb3c8107321127c85 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 8 Aug 2026 12:41:44 +0900 Subject: [PATCH 1/3] =?UTF-8?q?ci:=20=E4=BE=9D=E5=AD=98=E3=82=B0=E3=83=A9?= =?UTF-8?q?=E3=83=95=E3=81=AE=E7=99=BB=E9=8C=B2=E5=AF=BE=E8=B1=A1=E3=82=92?= =?UTF-8?q?=E9=85=8D=E5=B8=83=E7=89=A9=E3=81=B8=E8=BC=89=E3=82=8B=E4=BE=9D?= =?UTF-8?q?=E5=AD=98=E3=81=AB=E7=B5=9E=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dependency-submission は解決済みの全構成を登録するため、compileOnly(maven-core / kotlin-compiler-embeddable 等)・テスト・buildscript のクラスパスまで alerts の対象になっていた。 4 成果物の公開 POM が持つ依存は kotlin-stdlib と自プロジェクトのみであり、これらは利用者へ届かない。 登録対象を runtime classpath(公開 POM の compile / runtime スコープの元)へ絞る。 Co-Authored-By: Claude Opus 5 --- .github/workflows/build.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1e51b7c..b1b73ae 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -285,3 +285,12 @@ jobs: # (依存解決のみでコンパイルしないため ~/.konan のキャッシュも不要。他ジョブと同じキーで # 部分的な内容を保存してしまう事故も避ける) - uses: gradle/actions/dependency-submission@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + # 登録対象は配布物へ載る依存に絞る(alerts を利用者へ届くものに限るため)。対象とする + # runtime classpath は公開 POM の compile / runtime スコープの元であり、compileOnly(maven-core / + # kotlin-compiler-embeddable 等)・テスト・buildscript のクラスパスはここへ入らない。 + # フィルタは configuration 名の完全一致で、include と exclude は両方が適用される。 + # native ターゲットは runtime classpath を持たないが、runtime-api の依存は stdlib のみで + # jvm / js 側の登録に含まれる(native 限定の依存を足す場合はこの指定を見直すこと) + with: + dependency-graph-include-configurations: ".*[Rr]untimeClasspath" + dependency-graph-exclude-configurations: ".*[Tt]est[Rr]untimeClasspath" From d66acf04a86e7ac71429bdd4b3b2ebf6f218e512 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 8 Aug 2026 12:41:53 +0900 Subject: [PATCH 2/3] =?UTF-8?q?ci:=20Kotlin=20=E3=83=97=E3=83=AC=E3=83=AA?= =?UTF-8?q?=E3=83=AA=E3=83=BC=E3=82=B9=E3=81=AE=E9=80=B1=E6=AC=A1=E6=A4=9C?= =?UTF-8?q?=E8=A8=BC=E3=83=AF=E3=83=BC=E3=82=AF=E3=83=95=E3=83=AD=E3=83=BC?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit コンパイラプラグイン API に互換性保証が無いため、新しい Kotlin マイナーへの対応可否は 実際にビルドを通すまで分からない。プレリリースの段階で検知できるよう、週 1 で -PkotlinVersionOverride によるフルビルドと integration-test を回す。 検出は Maven Central のメタデータを情報源とし、比較はプレリリース接尾辞を落とした版で行う (sort -V は 2.4.20-Beta2 を 2.4.20 より後ろへ置くため、接尾辞付きのまま比べると 安定版の公開後もその版を拾い続ける)。 Co-Authored-By: Claude Opus 5 --- .github/workflows/kotlin-prerelease.yml | 93 +++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 .github/workflows/kotlin-prerelease.yml diff --git a/.github/workflows/kotlin-prerelease.yml b/.github/workflows/kotlin-prerelease.yml new file mode 100644 index 0000000..a095a24 --- /dev/null +++ b/.github/workflows/kotlin-prerelease.yml @@ -0,0 +1,93 @@ +# 週次マイナー横断ビルド(docs/チェックリスト.md §7)。Kotlin の新しい Beta / RC を検出し、 +# -PkotlinVersionOverride でカタログの Kotlin 版を差し替えてルートビルドと integration-test を通す。 +# 目的は対応版の発行判断に要る事前検知であり、結果は CI(build.yml)の必須チェックには関与しない。 +# アクションはコミットハッシュで固定する(末尾コメントの vX.Y.Z は参照用。更新は Dependabot が追随する) +name: kotlin-prerelease + +on: + schedule: + # JST 金曜 19:00 = 金曜 10:00 UTC(Dependabot の更新 PR と同じ周期) + - cron: "0 10 * * 5" + # 手元で版を指定して回すための入口(検出をとばして指定版で走る) + workflow_dispatch: + inputs: + kotlinVersion: + description: "検証する Kotlin 版(未指定なら Maven Central の最新 Beta / RC)" + required: false + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: true + +jobs: + # 検証対象の版を決める。無ければ後続をスキップする(version が空文字になる) + detect: + runs-on: ubuntu-latest + timeout-minutes: 10 + outputs: + version: ${{ steps.pick.outputs.version }} + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - id: pick + env: + REQUESTED: ${{ inputs.kotlinVersion }} + run: | + set -euo pipefail + if [ -n "$REQUESTED" ]; then + echo "version=$REQUESTED" >> "$GITHUB_OUTPUT" + exit 0 + fi + # Kotlin のプレリリースは安定版と同じく Maven Central へ公開される(プラグインマーカーも + # Plugin Portal 経由で解決できる)ため、メタデータの版一覧を情報源とする。 + # 取得と抽出は分ける(取得の失敗はジョブの失敗、該当なしは通知のみとするため) + metadata=$(curl -fsSL \ + https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler-embeddable/maven-metadata.xml) + latest=$(printf '%s' "$metadata" | tr '<' '\n' | sed -n 's/^version>//p' \ + | grep -E -- '-(Beta|RC)[0-9]*$' | sort -V | tail -1 || true) + if [ -z "$latest" ]; then + echo "::notice::no Kotlin prerelease published" + exit 0 + fi + current=$(sed -n 's/^kotlin = "\(.*\)"$/\1/p' gradle/libs.versions.toml) + # 比較はプレリリース接尾辞を落とした版で行う。sort -V は 2.4.20-Beta2 を 2.4.20 より後ろへ置くため、 + # プレリリースのまま比べると安定版が出た後もその版を拾い続けてしまう + base=${latest%%-*} + newest=$(printf '%s\n%s\n' "$current" "$base" | sort -V | tail -1) + if [ "$newest" = "$base" ] && [ "$base" != "$current" ]; then + echo "version=$latest" >> "$GITHUB_OUTPUT" + else + echo "::notice::no Kotlin prerelease newer than $current (latest: $latest)" + fi + + # 分割せず 1 ジョブで通す。CI と違って所要時間より「その版で全部通るか」の一括判定が要るため + build: + needs: detect + if: needs.detect.outputs.version != '' + runs-on: ubuntu-latest + timeout-minutes: 150 + env: + KOTLIN_OVERRIDE: -PkotlinVersionOverride=${{ needs.detect.outputs.version }} + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 + with: + distribution: temurin + java-version: 17 + - uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + # K/N ツールチェーンは Kotlin 版に対応するため、キャッシュのキーは CI(カタログのハッシュ)と分ける。 + # 同じキーを使うと、プレリリースの内容で CI 側のキャッシュを埋めてしまう + - uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: ~/.konan + key: konan-${{ runner.os }}-${{ needs.detect.outputs.version }} + - run: ./gradlew build $KOTLIN_OVERRIDE + - run: >- + ./gradlew -p integration-test build $KOTLIN_OVERRIDE + -x :gradle-integration:test -x :maven-integration:test + # 重いテストはローカル Maven の非タイムスタンプ SNAPSHOT を入力に持ち UP-TO-DATE 判定が + # 信用できないため --rerun で必ず再実行する(build.yml と同じ理由) + - run: ./gradlew -p integration-test :gradle-integration:test --rerun $KOTLIN_OVERRIDE + - run: ./gradlew -p integration-test :maven-integration:test --rerun $KOTLIN_OVERRIDE From 8a2e392d2dc78fade50525d214c920eb18717ef1 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sat, 8 Aug 2026 12:42:01 +0900 Subject: [PATCH 3/3] =?UTF-8?q?ci:=20=E3=82=BF=E3=82=B0=E9=A7=86=E5=8B=95?= =?UTF-8?q?=E3=81=AE=E5=85=AC=E9=96=8B=E3=83=AF=E3=83=BC=E3=82=AF=E3=83=95?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit タグ v-<自版> の push を起点に、ゲート(フルビルド + integration-test)を 通してから Maven Central と Gradle Plugin Portal へ公開し、GitHub Release を作る。 版の正はビルドの導出値でありタグはその写しに過ぎないため、両者の一致を公開前に照合する (SNAPSHOT のまま打たれたタグもこの照合で落ちる)。Central は公開の確定を Portal 上の 手作業に残し、取り消しのきかない Plugin Portal はその後に置く。 Co-Authored-By: Claude Opus 5 --- .github/workflows/publish.yml | 80 +++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 .github/workflows/publish.yml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..1b601be --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,80 @@ +# CD(docs/チェックリスト.md §7)。タグ v-<自版> の push で駆動し、 +# ルートビルドと integration-test の green を確認してから Maven Central と Gradle Plugin Portal へ公開する。 +# ランナーは macos 単騎(宣言済みの全ターゲットをネイティブ + クロスコンパイルで賄えるため)。 +# アクションはコミットハッシュで固定する(末尾コメントの vX.Y.Z は参照用。更新は Dependabot が追随する) +name: publish + +on: + push: + tags: ["v*"] + +permissions: + contents: read + +# 公開は取り消せないため、走行中のランをキャンセルしない +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: false + +jobs: + publish: + runs-on: macos-latest + timeout-minutes: 180 + # ジョブ単位の permissions はワークフロー既定を置き換える。GitHub Release の作成に contents: write が要る + permissions: + contents: write + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5.7.0 + with: + distribution: temurin + java-version: 17 + - uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6.3.0 + - uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: ~/.konan + key: konan-${{ runner.os }}-${{ hashFiles('gradle/libs.versions.toml') }} + + # 版の正はビルド(カタログの Kotlin 版 + gradle.properties の enumizerVersion)であり、タグは + # その写しに過ぎない。両者の一致をここで確かめる。SNAPSHOT のまま打たれたタグもこの照合で落ちる + - name: Verify tag matches derived version + run: | + set -euo pipefail + version=$(./gradlew -q properties --property version | sed -n 's/^version: //p') + if [ "v$version" != "$GITHUB_REF_NAME" ]; then + echo "::error::tag $GITHUB_REF_NAME does not match derived version $version" + exit 1 + fi + + # 公開前のゲート。CI と同じ範囲を 1 ジョブで通す + - run: ./gradlew build + - run: >- + ./gradlew -p integration-test build + -x :gradle-integration:test -x :maven-integration:test + # 重いテストはローカル Maven の非タイムスタンプ SNAPSHOT を入力に持ち UP-TO-DATE 判定が + # 信用できないため --rerun で必ず再実行する(build.yml と同じ理由) + - run: ./gradlew -p integration-test :gradle-integration:test --rerun + - run: ./gradlew -p integration-test :maven-integration:test --rerun + + # Central Portal へはデプロイの作成までとし、公開の確定は Portal 上の validation 確認後に手で行う + # (publishAndReleaseToMavenCentral は使わない)。vanniktech の設定値は ORG_GRADLE_PROJECT_ 接頭辞の + # 環境変数で渡す(Gradle プロパティ名は大小文字を区別するため、シークレット名とは別に対応付ける) + - name: Publish to Maven Central + env: + ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.MAVEN_CENTRAL_USERNAME }} + ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.MAVEN_CENTRAL_PASSWORD }} + ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.SIGNING_IN_MEMORY_KEY }} + ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.SIGNING_IN_MEMORY_KEY_PASSWORD }} + run: ./gradlew publishToMavenCentral + + # Plugin Portal は取り消しができないため Central の後に置く + - name: Publish to Gradle Plugin Portal + env: + GRADLE_PUBLISH_KEY: ${{ secrets.GRADLE_PUBLISH_KEY }} + GRADLE_PUBLISH_SECRET: ${{ secrets.GRADLE_PUBLISH_SECRET }} + run: ./gradlew :sealed-class-enumizer-gradle-plugin:publishPlugins + + - name: Create GitHub Release + env: + GH_TOKEN: ${{ github.token }} + run: gh release create "$GITHUB_REF_NAME" --verify-tag --title "$GITHUB_REF_NAME" --generate-notes