Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Kotlinライブラリのリリースを自動化する手法
Search
Toshihiro Nakamura
January 20, 2023
Programming
390
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
1k
R2DBCをサポートするORM Komapper
nakamura_to
1
1.3k
Other Decks in Programming
See All in Programming
8年前のNode.jsを動かして分かった、npm installの裏側
keisukeikeda
0
110
Performance Optimization With LLMs
xleitix
0
230
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
4
1.4k
Groovy as a human and AI friendly programming language
paulk
0
150
SODA - FACT BOOK(EN)
sodainc
1
200
プロジェクトコードをキレイキレイしよう!暗黙的な参照を読み解く静的解析
ostk0069
0
200
Modernizing iOS Apps
seyfoyun
0
140
Web Framework Benchmark Battle 2026, Any%
a_matsuda
3
3.1k
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.2k
AI Augmentation Techniques with Liberty
ivargrimstad
0
230
Inertia Rails: The One-Person Framework with React & Friends
skryukov
0
200
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
330
Featured
See All Featured
Scaling GitHub
holman
464
140k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
Optimising Largest Contentful Paint
csswizardry
37
4k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
440
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
380
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Between Models and Reality
mayunak
4
540
Bash Introduction
62gerente
615
220k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
550
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
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