1. Sonatype の使用

Sonatype の使用 

Sonatype へのデプロイは簡単です!次の簡単な手順に従ってください

Sonatype の設定 

Sonatype を構成および公開するためのリファレンスプロセスは、OSSRH ガイドに記載されています。簡単に言うと、公開されている URL が 2 つ必要です

  • プロジェクトの Web サイト (例: https://github.com/sonatype/nexus-public)
  • プロジェクトのソースコード (例: https://github.com/sonatype/nexus-public.git)

OSSRH ガイドでは、Sonatype でアカウントを設定するのに必要なプロセスについて説明しています。Sonatype の JIRA アカウントを作成し、次に 新規プロジェクトチケットを作成するだけです。アカウントを作成するときは、プロジェクトがホストされているのと同じドメインをメールアドレスで使用するようにしてください。これにより、Sonatype がチケットで要求された groupId との関係を検証するのが簡単になりますが、所有権を確認するために使用される唯一の方法ではありません。

新規プロジェクトチケットの作成は、次のようになります。

  • チケットの件名にライブラリの名前を入力する。
  • ライブラリを配布するための groupId を命名する (コードのルートパッケージと一致していることを確認してください)。Sonatype は、ライブラリを公開するための適切な groupId を選択するための追加のヒントを、座標を選択するガイドで提供しています。
  • ライブラリのソースコードとホームページへの SCM およびプロジェクト URL を提供します。

JIRA で Sonatype アカウントを作成したら、同じ資格情報を使用して Nexus リポジトリマネージャーにログインできます。これはガイドでは必須ではありませんが、後で公開されたアーティファクトを確認するのに役立つ場合があります。

注意: Sonatype は、新規プロジェクトチケットへの返信には最大 2 営業日かかる場合があることを推奨していますが、私の場合には数分でした。

sbt の設定 

セントラルリポジトリへの公開に関する Sonatype の 要件に対応し、公開プロセスを簡素化するために、2 つのコミュニティプラグインを使用できます。sbt-pgp プラグインは、GPG/PGP でファイルに署名できます。(オプションで、sbt-sonatype は、Sonatype リポジトリへの公開をよりきれいにすることができます。)

ステップ 1: PGP 署名 

PGP 署名の使用に従ってください。

まず、GnuPG をインストールし、バージョンを確認する必要があります。

$ gpg --version
gpg (GnuPG/MacGPG2) 2.2.8
libgcrypt 1.8.3
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>

次に、キーを生成します。

$ gpg --gen-key

キーをリストします。

$ gpg --list-keys

/home/foo/.gnupg/pubring.gpg
------------------------------

pub   rsa4096 2018-08-22 [SC]
      1234517530FB96F147C6A146A326F592D39AAAAA
uid           [ultimate] your name <[email protected]>
sub   rsa4096 2018-08-22 [E]

キーを配布します。

$ gpg --keyserver keyserver.ubuntu.com --send-keys 1234517530FB96F147C6A146A326F592D39AAAAA

ステップ 2: sbt-pgp 

使用する PGP キーを使用して、sbt-pgp プラグインを使用して Sonatype リポジトリに公開するアーティファクトに署名できます。プラグインの手順に従うと、すぐに PGP 署名されたアーティファクトが作成されます。

簡単に言えば、次の行を ~/.sbt/1.0/plugins/gpg.sbt ファイルに追加して、SBT プロジェクトでグローバルに有効にします。

addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.1.2")

注意: このプラグインは、アーティファクトに署名するためのソリューションです。GPG コマンドラインツールで動作します。

gpg コマンドが sbt で利用可能な PATH にあることを確認します。

ステップ 3: 資格情報 

Sonatype OSSRH アカウントの資格情報は、安全な場所 (例: リポジトリ内ではありません) に保存する必要があります。一般的な規則は、次の内容を含む $HOME/.sbt/1.0/sonatype.sbt ファイルです。

credentials += Credentials(Path.userHome / ".sbt" / "sonatype_credentials")

次に、ファイル ~/.sbt/sonatype_credentials を作成します。

realm=Sonatype Nexus Repository Manager
host=oss.sonatype.org
user=<your username>
password=<your password>

注意: Coursier が資格情報を使用するには、最初の 2 つの文字列が "Sonatype Nexus Repository Manager""oss.sonatype.org" である必要があります。2021 年 2 月以降に作成された新しい OSSRH アカウントを使用している場合は、"oss.sonatype.org" の代わりに "s01.oss.sonatype.org" を使用してください。

ステップ 4: build.sbt の構成 

maven リポジトリに公開するには、正しいメタデータが生成されるようにいくつかの設定を構成する必要があります。

これらの設定を build.sbt の末尾または別の publish.sbt に追加します。

ThisBuild / organization := "com.example.project2"
ThisBuild / organizationName := "example"
ThisBuild / organizationHomepage := Some(url("http://example.com/"))

ThisBuild / scmInfo := Some(
  ScmInfo(
    url("https://github.com/your-account/your-project"),
    "scm:[email protected]:your-account/your-project.git"
  )
)
ThisBuild / developers := List(
  Developer(
    id = "Your identifier",
    name = "Your Name",
    email = "your@email",
    url = url("http://your.url")
  )
)

ThisBuild / description := "Some description about your project."
ThisBuild / licenses := List(
  "Apache 2" -> new URL("https://apache.dokyumento.jp/licenses/LICENSE-2.0.txt")
)
ThisBuild / homepage := Some(url("https://github.com/example/project"))

// Remove all additional repository other than Maven Central from POM
ThisBuild / pomIncludeRepository := { _ => false }
ThisBuild / publishTo := {
  // For accounts created after Feb 2021:
  // val nexus = "https://s01.oss.sonatype.org/"
  val nexus = "https://oss.sonatype.org/"
  if (isSnapshot.value) Some("snapshots" at nexus + "content/repositories/snapshots")
  else Some("releases" at nexus + "service/local/staging/deploy/maven2")
}
ThisBuild / publishMavenStyle := true

pom.xml (Maven が使用するプロジェクト構成の最終成果物) ファイルの完全な形式は、こちらに概要が記載されていますbuild.sbtpomExtra オプションを使用して、さらにデータを追加できます。

ステップ 5: 公開 

sbt シェルから次を実行します。

> publishSigned

Nexus リポジトリマネージャー (Sonatype の Jira アカウントと同じログイン) で公開されたアーティファクトを確認します。

ステージングリポジトリを閉じ、「閉じる」ボタンを押してから「リリース」ボタンを押して、リリースをセントラルに昇格させます。

オプションの手順 

sbt-sonatype 

注意: sbt-sonatype はサードパーティ製プラグインであり、Lightbend サブスクリプションの対象ではありません。

Sonatype の Nexus の使用を簡素化するには、project/plugins.sbt に次の行を追加して、sbt-sonatype プラグインをプロジェクトにインポートします。

addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "3.9.13")

このプラグインは公開プロセスを容易にしますが、簡単に言えば、ライブラリをリポジトリに公開するための主な手順は次のとおりです。

  1. 新しいステージングリポジトリを作成します。sonatypeOpen "your groupId" "Some staging name"
  2. ライブラリに署名してステージングリポジトリに公開します。publishSigned
  3. Nexus リポジトリマネージャー (Sonatype の Jira アカウントと同じログイン) で、公開されたアーティファクトを確認できます。
  4. ステージングリポジトリを閉じ、リリースをセントラルに昇格させます。sonatypeRelease

このプラグインを使用する際に注意すべき重要なキーを以下に示します。詳細については、こちらをお読みください

// This becomes a simplified version of the above key.
publishTo := sonatypePublishToBundle.value
// Set this to the same value set as your credential files host.
sonatypeCredentialHost := "oss.sonatype.org"
// Set this to the repository to publish to using `s01.oss.sonatype.org`
// for accounts created after Feb. 2021.
sonatypeRepository := "https://oss.sonatype.org/service/local"

公開後、Nexus のリリースワークフローに従う必要があります。

注意: sbt-sonatype プラグインは、Sonatype 以外の他のリポジトリへの公開にも使用できます。

公開のヒント 

完全なプロジェクトをプッシュする前に、独立したリリースの大規模なプロジェクト全体でテストするために、ステージングされたリリースを使用します。

注意: PGPException: checksum mismatch at 0 of 20 というエラーメッセージは、パスフレーズが間違っていることを示しています。少なくとも OS X では、7 ビット ASCII 範囲外の文字 (例: ウムラウト) に問題がある可能性があることがわかりました。正しいフレーズを入力したことが絶対に確実であり、エラーが消えない場合は、パスフレーズを変更してみてください。

注意: 2021 年 2 月以降に作成された新しい OSSRH アカウントを使用している場合は、"oss.sonatype.org" の代わりに "s01.oss.sonatype.org" を使用してください。

リリースプロセスとの統合 

注: sbt-release はサードパーティ製のプラグインであり、Lightbend のサブスクリプションの対象外です。

sbt-release プラグインを使用して上記の発行方法を自動化するには、releaseProcessタスクのステップとして発行コマンドを追加するだけで済みます。

...
releaseStepCommand("sonatypeOpen \"your groupId\" \"Some staging name\""),
...
releaseStepCommand("publishSigned"),
...
releaseStepCommand("sonatypeRelease"),
...