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
870
R2DBCをサポートするORM Komapper
nakamura_to
1
1.3k
Other Decks in Programming
See All in Programming
Hono + Inertia + React で LP を構築した話
oukayuka
2
200
Deep dive into the select statement (GopherCon UK)
jespino
0
170
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
570
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
190
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.5k
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
150
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
120
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
250
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
410
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
270
初めての模倣学習とVLA
natsutan
0
420
楽しそうなつよつよエンジニアと目が死んでる僕/A brilliant engineer having a blast, and dead-eyed me.
3l4l5
2
280
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
810
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Navigating Weather and Climate Data
rabernat
0
510
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Speed Design
sergeychernyshev
33
2.1k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
970
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Darren the Foodie - Storyboard
khoart
PRO
3
3.9k
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