Slide 1

Slide 1 text

Kotlinライブラリの リリースを⾃動化する⼿法 2023/01/20 Server-Side Kotlin Meetup vol.7 1

Slide 2

Slide 2 text

⾃⼰紹介 nakamura-to nakamura_to 電通国際情報サービス(ISID)ソフトウェアデザインセンター • テックブログ︓ https://tech.isid.co.jp/ 代表的なOSSライブラリ • Doma︓ https://github.com/domaframework/doma • Komapper︓ https://github.com/komapper/komapper Font Awesome Icons under CC-BY 4.0 https://fontawesome.com/ 2 中村 年宏

Slide 3

Slide 3 text

Komapperの紹介|概要 サーバサイドKotlinのためのORM PostgreSQLなど代表的な6つのRDBMSに対応 @KomapperEntity data class Address(@KomapperId val id: Int = 0, val street: String) fun main() { // データベースを表すオブジェクトの⽣成 val db = JdbcDatabase(“jdbc:h2:mem:example;DB_CLOSE_DELAY=-1”) // Addressを1件返すクエリの構築: select t0_.ID, t0_.STREET from ADDRESS as t0_ where t0_.ID = 1 val query: Query
= QueryDsl.from(Meta.address).where { Meta.address.id eq 1 } .first() // クエリの実⾏ val address: Address = db.runQuery(query) } 3 エンティティクラス 利⽤例 class _Address { … } val Meta.address get() = _Address…. エンティティクラスのメタモデル コンパイル時に⽣成

Slide 4

Slide 4 text

Komapperの紹介|開発状況(これまでの取り組みと現在) • 2021年3⽉から開発開始 • 2022年5⽉にv1.0.0をリリース • 現在(2023年1⽉20⽇時点)のバージョンはv1.6.1 • 機能改善を中⼼にメンテナンス中 • GitHub issueやSlackでもらったフィードバックを反映など 4

Slide 5

Slide 5 text

Kotlinライブラリの開発で楽しいところ⾯倒なところ 楽しいところ • Kotlinの⾔語機能を使ってアイデアをコードに落とし込むこと • Kotlinのコミュニティ(公式Slack)からフィードバックをもらうこと ⾯倒なところ • テスト • ドキュメント • リリース 5

Slide 6

Slide 6 text

OSSライブラリにおけるリリースとは何か︖ 1. バージョン番号の更新やタグ付 • リリースバージョンに更新︓ 1.0.0-SNAPSHOT → 1.0.0 • タグ付︓ v1.0.0 • 開発バージョンに更新︓ 1.0.0 → 1.0.1-SNAPSHOT 2. jarファイルをセントラルリポジトリに公開すること 3. ドキュメントを公開すること 4. リリースノートを公開すること 5. リリースをアナウンスすること 6 いずれも重要ですが、今回は1と2を扱います

Slide 7

Slide 7 text

補⾜|jarファイルの公開 - セントラルリポジトリとSonatype OSSRH jarファイルをセントラルリポジトリに公開するには、まずSonatype OSSRH (OSS Repository Hosting) にそれらを送り特定の操作を⾏う必要あり。 OSSRHはセントラルリポジトリへ公開する前のステージングリポジトリ。 7 OSSRH セントラル リポジトリ 同期 送信 操作 GUI or CLI • Close: 要件を満たしているかのチェック(jarファイルに署 名がされているかなど) • Release: ステージングリポジトリからセントラルリポジト リへリリース $ gradle publishToSonatype closeAndReleaseSonatypeStagingRepository GUI︓https://s01.oss.sonatype.org/ CLI︓Gradleを使った例 OSSRHで必要な操作 セントラルリポジトリに公開するまで

Slide 8

Slide 8 text

リリースがなぜ⾯倒なのか︖ • 単純作業の繰り返しである • 例)バージョン番号を変更してコミットしてプッシュ • 例)OSSRHのCloseやRelease操作 • ミスをすると取り消せない • 例)バージョン番号を間違えてセントラルリポジトリに公開した場合 • 使⽤頻度の低い⾊々なことを思い出さないといけない • 例)jarファイルの署名に必要な鍵の保管場所やパスワード 8

Slide 9

Slide 9 text

リリースの⾃動化 リリース作業は全てGitHub Actions上で⾏う 9 • Releaseジョブ • Buildジョブ • Publishジョブ OSSRH セントラル リポジトリ 設定ファイル 設定ファイル GUI GitHub上のKomapperリポジトリ 同期 バージョンの変更 コミット タグ付け プッシュ 送信 操作 GitHub Actions Releaseワークフロー Buildワークフロー

Slide 10

Slide 10 text

⾃動化のポイント ① GitHub Actionsの起動ボタン ② Gradleプラグインを使ったバージョン番号の⾃動書き換え ③ Gradleプラグインを使ったOSSRHの⾃動操作 ④ GitHub Actionsのシークレット管理 10 ❷ ❶ ❹ ❸

Slide 11

Slide 11 text

⾃動化のポイント|①GitHub Actionsの起動ボタン workflow_dipatchトリガーを有効にすると、画⾯上に起動ボタン が表⽰される 11 name: Release on: workflow_dispatch: inputs: version: description: 'Release version' required: false Releaseワークフローの設定 https://github.com/komapper/komapper/actions/workflows/release.yml GitHub Actionsの画⾯

Slide 12

Slide 12 text

⾃動化のポイント|②Gradleプラグインを使ったバージョン番号の⾃動書き換え gradle-releaseプラグインを使うとreleaseタスクが使える 1. リリースに向けたバージョン変更とコミット︓ 1.0.0-SNAPSHOT → 1.0.0 2. gitのタグ付け︓v1.0.0(命名規約はカスタマイズ可能) 3. リモートブランチへのpush 4. 開発に向けたバージョン変更とコミット︓ 1.0.0 → 1.0.1-SNAPSHOT 12 - name: Release ${{ env.RELEASE_VERSION }} uses: gradle/gradle-build-action@v2 with: arguments: release -Prelease.releaseVersion=${{ env.RELEASE_VERSION }} release.yml 詳細はプラグインのREADMEを参照︓ https://github.com/researchgate/gradle-release

Slide 13

Slide 13 text

⾃動化のポイント|③Gradleプラグインを使ったOSSRHの⾃動操作 publish-pluginを使うと追加でいくつかのGradleタスクが使える • publishToSonatype︓ Sonatype OSSRHへjarファイルを送信 • closeAndReleaseStagingRepository︓CloseとReleaseを実施 13 セントラルリポジトリの公開前にSonatype OSSRH上で以下の処理が必要である。 • Close: 要件を満たしているかのチェック(jarファイルに署名がされているかなど) • Release: ステージングリポジトリからセントラルリポジトリへリリース おさらい - name: Publish packages uses: gradle/gradle-build-action@v2 env: ORG_GRADLE_PROJECT_signingKey: ${{ secrets.SIGNING_KEY }} ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.SIGNING_PASSWORD }} ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }} ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }} with: arguments: publishToSonatype closeAndReleaseSonatypeStagingRepository 詳細はプラグインのREADMEを参照︓ https://github.com/gradle-nexus/publish-plugin build.yml

Slide 14

Slide 14 text

⾃動化のポイント|④GitHub Actionsのシークレット管理 署名に必要な鍵などのシークレットはActions secretsで管理する 14 https://github.com/organizations/komapper/settings/secrets/actions OrganizationのSettings > Secrets > Actions で開く画⾯

Slide 15

Slide 15 text

⾃動化のポイント|④GitHub Actionsのシークレット管理 – 利⽤例 署名に必要な鍵とパスワードを利⽤する例 15 - name: Publish packages uses: gradle/gradle-build-action@v2 env: ORG_GRADLE_PROJECT_signingKey: ${{ secrets.SIGNING_KEY }} ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.SIGNING_PASSWORD }} ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }} ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }} with: arguments: publishToSonatype closeAndReleaseSonatypeStagingRepository build.yml signing { val signingKey: String? by project val signingPassword: String? by project useInMemoryPgpKeys(signingKey, signingPassword) val publishing = extensions.getByType(PublishingExtension::class) sign(publishing.publications) isRequired = isReleaseVersion } build.gradle.kts Actions Secretsから読み出し た鍵とパスワードをGradleス クリプトへ渡している 鍵とパスワードを受け取って いる 署名している

Slide 16

Slide 16 text

⾃動化のポイント(再掲) ① GitHub Actionsの起動ボタン ② Gradleプラグインを使ったバージョン番号の⾃動書き換え ③ Gradleプラグインを使ったOSSRHの⾃動操作 ④ GitHub Actionsのシークレット管理 16 ❷ ❶ ❹ ❸

Slide 17

Slide 17 text

リリースの⾃動化により得られたもの • 単純作業から解放される • ミスを防⽌できる • 誰でもリリースできる • ローカルのリリース環境を不要にできる 17

Slide 18

Slide 18 text

リリースの⾃動化に関して不安だったこと どれだけの数のjarファイルを⼀度に公開できるか︖ 18 IDEAのプロジェクツールウィンドウ KomapperはGradleのマルチプロジェクト構成 • サブプロジェクト︓56個 • セントラルリポジトリへの公開対象︓46個 OSSRHへの送信・操作でタイムアウトなどが懸念されたが問題なし

Slide 19

Slide 19 text

まとめ KotlinのOSSライブラリ開発における⾯倒な作業としてリリースに 着⽬し、⾃動化するための⼿法を紹介しました。 今回紹介した⼿法は「JavaのOSSライブラリ」や「OSS以外のライ ブラリ開発」にも活かせる部分があると思います。 良きライブラリ開発ライフを︕ 19