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
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
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
180
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
890
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
0
160
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
150
AIが無かった頃の素敵な出会いの話
codmoninc
1
270
5分で問診!Composer セキュリティ健康診断
codmoninc
0
680
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
220
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
9
3.6k
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
430
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
190
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
190
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
680
Featured
See All Featured
Accessibility Awareness
sabderemane
1
160
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Optimising Largest Contentful Paint
csswizardry
37
3.8k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
BBQ
matthewcrist
89
10k
New Earth Scene 8
popppiees
3
2.4k
A better future with KSS
kneath
240
18k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.4k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
190
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
Building an army of robots
kneath
306
46k
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