Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kotlinライブラリのリリースを自動化する手法
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Toshihiro Nakamura
January 20, 2023
Programming
370
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Kotlinライブラリの リリースを自動化する手法
Toshihiro Nakamura
January 20, 2023
More Decks by Toshihiro Nakamura
See All by Toshihiro Nakamura
Doma で目指す ORM 最適解
nakamura_to
1
720
R2DBCをサポートするORM Komapper
nakamura_to
1
1.3k
Other Decks in Programming
See All in Programming
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
7.1k
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
430
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
0
160
[RVD26] Vibe Architecture en 2040 : Darwin a-t-il (enfin) eu raison des architectes ?
alexandretouret
0
110
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
120
5分で問診!Composer セキュリティ健康診断
codmoninc
0
680
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
3
170
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.1k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
270
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
740
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
190
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.4k
Featured
See All Featured
A better future with KSS
kneath
240
18k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
The Cult of Friendly URLs
andyhume
79
7k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.3k
RailsConf 2023
tenderlove
30
1.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Chasing Engaging Ingredients in Design
codingconduct
0
240
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Why Our Code Smells
bkeepers
PRO
340
58k
Amusing Abliteration
ianozsvald
1
240
Transcript
Kotlinライブラリの リリースを⾃動化する⼿法 2023/01/20 Server-Side Kotlin Meetup vol.7 1
⾃⼰紹介 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 中村 年宏
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<Address> = 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…. エンティティクラスのメタモデル コンパイル時に⽣成
Komapperの紹介|開発状況(これまでの取り組みと現在) • 2021年3⽉から開発開始 • 2022年5⽉にv1.0.0をリリース • 現在(2023年1⽉20⽇時点)のバージョンはv1.6.1 • 機能改善を中⼼にメンテナンス中 •
GitHub issueやSlackでもらったフィードバックを反映など 4
Kotlinライブラリの開発で楽しいところ⾯倒なところ 楽しいところ • Kotlinの⾔語機能を使ってアイデアをコードに落とし込むこと • Kotlinのコミュニティ(公式Slack)からフィードバックをもらうこと ⾯倒なところ • テスト •
ドキュメント • リリース 5
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を扱います
補⾜|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で必要な操作 セントラルリポジトリに公開するまで
リリースがなぜ⾯倒なのか︖ • 単純作業の繰り返しである • 例)バージョン番号を変更してコミットしてプッシュ • 例)OSSRHのCloseやRelease操作 • ミスをすると取り消せない •
例)バージョン番号を間違えてセントラルリポジトリに公開した場合 • 使⽤頻度の低い⾊々なことを思い出さないといけない • 例)jarファイルの署名に必要な鍵の保管場所やパスワード 8
リリースの⾃動化 リリース作業は全てGitHub Actions上で⾏う 9 • Releaseジョブ • Buildジョブ • Publishジョブ
OSSRH セントラル リポジトリ 設定ファイル 設定ファイル GUI GitHub上のKomapperリポジトリ 同期 バージョンの変更 コミット タグ付け プッシュ 送信 操作 GitHub Actions Releaseワークフロー Buildワークフロー
⾃動化のポイント ① GitHub Actionsの起動ボタン ② Gradleプラグインを使ったバージョン番号の⾃動書き換え ③ Gradleプラグインを使ったOSSRHの⾃動操作 ④ GitHub
Actionsのシークレット管理 10 ❷ ❶ ❹ ❸
⾃動化のポイント|①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の画⾯
⾃動化のポイント|②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
⾃動化のポイント|③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
⾃動化のポイント|④GitHub Actionsのシークレット管理 署名に必要な鍵などのシークレットはActions secretsで管理する 14 https://github.com/organizations/komapper/settings/secrets/actions OrganizationのSettings > Secrets >
Actions で開く画⾯
⾃動化のポイント|④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ス クリプトへ渡している 鍵とパスワードを受け取って いる 署名している
⾃動化のポイント(再掲) ① GitHub Actionsの起動ボタン ② Gradleプラグインを使ったバージョン番号の⾃動書き換え ③ Gradleプラグインを使ったOSSRHの⾃動操作 ④ GitHub
Actionsのシークレット管理 16 ❷ ❶ ❹ ❸
リリースの⾃動化により得られたもの • 単純作業から解放される • ミスを防⽌できる • 誰でもリリースできる • ローカルのリリース環境を不要にできる 17
リリースの⾃動化に関して不安だったこと どれだけの数のjarファイルを⼀度に公開できるか︖ 18 IDEAのプロジェクツールウィンドウ KomapperはGradleのマルチプロジェクト構成 • サブプロジェクト︓56個 • セントラルリポジトリへの公開対象︓46個 OSSRHへの送信・操作でタイムアウトなどが懸念されたが問題なし
まとめ KotlinのOSSライブラリ開発における⾯倒な作業としてリリースに 着⽬し、⾃動化するための⼿法を紹介しました。 今回紹介した⼿法は「JavaのOSSライブラリ」や「OSS以外のライ ブラリ開発」にも活かせる部分があると思います。 良きライブラリ開発ライフを︕ 19