scala/sbt-ci-releaseでライブラリをパブリッシュする
#scala
cf. https://blog.3qe.us/entry/2024/03/24/012435
sbtプラグインsbt-ci-releaseを利用すると、GitHub Actionsなどからライブラリをパブリッシュできる。
だいたいこの内容は公式ドキュメントの書き写しです。
必要なもの
Maven Centralのアカウント
Maven Centralのnamespace
libraryDependencies += "ここがnamespace" %% "ここがartifact名" % "ここがバージョン" という状態
GitHubログインすると自動的にio.github.てめーのIDがもらえるのでそれを使ってもよい
ドメインを持っているなら、DNSの設定をするとnamespaceがもらえる
ref. https://central.sonatype.org/register/namespace/
SNAPSHOTを利用したい場合はここから有効化しておく必要がある
https://scrapbox.io/files/69307f67ff0cd1ce5d40db7a.png
sbtでビルドしているプロジェクト
! sbt 1.11.x以降
今すぐ一回確認しろ
sbt-ci-release 1.11.0以降
gpg
自動化のための小道具
gh
jq
shred または srm
下準備(プロジェクトごとに一回だけ行う)
addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "<version>")をproject/plugins.sbtに追記する
最新のバージョンはGitHubで確認できる
または、拙作のscaladex-mcpを利用するとAIくんが勝手に最新のバージョンを拾ってくれるはず
build.sbtに以下の設定がないことを確認する。これらはsbt-ci-releaseが自動的に処理するため、あってはならない
version
! 大抵の場合は既に存在するため、削除したことを確認しておく
publishTo
publishMavenStyle
credentials
build.sbtの最上部に以下の設定を書き、パブリッシュの際のメタデータを用意する:
code:scala
inThisBuild(List(
organization := "dev.capslock", // 自分のnamespace
// GitHubのページを指定する。GitHubを使っていなければリポジトリのありかを指定する
homepage := Some(url("https://github.com/windymelt/$REPOSITORY")),
// ライセンスを設定する
licenses := List(
// "Apache-2.0" -> url("http://www.apache.org/licenses/LICENSE-2.0"),
// "BSD-3-Clause" -> url("https://spdx.org/licenses/BSD-3-Clause.html"),
// "MIT" -> url("https://spdx.org/licenses/MIT.html"),
// "GPL-3.0-or-later" -> url("https://spdx.org/licenses/GPL-3.0-or-later.html"),
),
// 開発者リスト
developers := List(
Developer(
"windymelt", // GitHubなどでのID
"Windymelt", // 名前
"Eメールアドレス",
url("https://www.3qe.us") // ホームページやSNSなどの連絡先のページ
)
),
versionScheme := Some("early-semver") // https://www.scala-sbt.org/1.x/docs/Publishing.html#Version+scheme
))
ライセンスは、License.*にあるものを使ってもよい。
List[(SPDXのid, URL)]という形式で記述する
SPDXのIDリスト: https://raw.githubusercontent.com/spdx/license-list-data/master/json/licenses.json
licenseIdがIDにあたる。
referenceがURLにあたる。
例えばBSD三項ライセンスでは、IDはBSD-3-Clauseであり、URLはhttps://spdx.org/licenses/BSD-3-Clause.htmlである。
ここでターミナルを開く
ユーザートークンを作成する
要するにSonatype用のPersonal Access Token。
https://central.sonatype.com/usertoken に行き、Generate User Tokenする
名前は何でもいいが、リポジトリ名とかを設定しておくと良さそう
有効期限はDoes not expireでよいだろう
作成するとUsernameとPasswordがもらえるのでメモしておく
$ export SONATYPE_USERNAME=...
$ export SONATYPE_PASSWORD=...
dotenvxとか使うと楽かも?
$ dotenvx set SONATYPE_USERNAME foobar2000
$ gh secret set SONATYPE_USERNAME --body "$SONATYPE_USERNAME"
$ gh secret set SONATYPE_PASSWORD --body "$SONATYPE_PASSWORD"
ここは自動化できない……
PGP鍵のセットアップ
Mavenは伝統的にPGP鍵によってアーティファクトの真正性を保証している
リポジトリごとに作ることが望ましいため、作成する
! 新作グッズがあります https://blog.3qe.us/entry/2025/12/10/015333
$ cs launch dev.capslock::scala-pgp-bootstrap:0.0.2
旧記述 scala/sbt-ci-releaseでライブラリをパブリッシュする/PGP鍵の生成(旧)
GitHub Actionsを用意する
公式が用意してくれているのでそれをコピペするだけ
code:sh
mkdir -p .github/workflows && \
curl -L https://raw.githubusercontent.com/sbt/sbt-ci-release/main/.github/workflows/release.yml > .github/workflows/release.yml
コミットしてpushする
$ git add .github/workflows/release.yml build.sbt project/plugins.sbt
$ git commit -m 'sbt-ci workflow'
リリースフロー
PRを作ってmainにマージされると勝手にsnapshotがリリースされる
! ここでコケているときはbuild.sbtにversionが指定されていないことを確認しよう!
プラグインがタグをもとに勝手にバージョンを設定するので触っちゃだめ〜
タグを打つとそれが正式にリリースされる
$ git tag -a v0.1.0 -m "v0.1.0"
タグはvが先頭についている必要がある
$ git push origin v0.1.0