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
9 changes: 9 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
93 changes: 93 additions & 0 deletions .github/workflows/kotlin-prerelease.yml
Original file line number Diff line number Diff line change
@@ -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
80 changes: 80 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# CD(docs/チェックリスト.md §7)。タグ v<KotlinVersion>-<自版> の 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