xsbt-gpg-pluginを使うと、sbtで生成されたプロジェクトのjarファイルにGnuPG(gpg)による署名ができる。Sonatypeのリポジトリにプロジェクトをdeployする際にgpgによる署名が必須。作成したプログラムをSonatypeのリポジトリに登録して、Maven Central Repositoryに同期してもらうと、自分で作ったプログラムを世界中の人に手軽にダウンロードできる状態(つまりsbtのlibraryDependenciesの設定に追加するだけで使える状態)で公開できる。

  • Deplying to Sonatype 
    • Scala+SBTでpgpによる署名を施してSonatypeのリポジトリにプロジェクトをアップロードする方法

必要なツール

gpg, gpg-agent, keychain

  • 以下の内容は、Windows+cygwin環境ではgpg-agentをうまく動かす方法が見当たらないため、まだ成功していない。MacかLinuxを使うと吉。

設定

~/.sbt/(sbt-version)/plugins/build.sbtsbt-pgp-pluginを追加:

addSbtPlugin("com.typesafe.sbt" % "pgp-plugin" % "0.7")

~/.sbt/(sbt-version)/gpg.sbt

// useGpg, useGpgAgentをtrueに設定
useGpg := true

useGpgAgent := true

useGpgAgentはfalseに設定して、$HOME/.gnupg/gpg.conf 内で、use-agentを設定しても良い。

参考: gpg.confの設定

$HOME/.gnupg/gpg.conf(抜粋) # We support the old experimental passphrase agent protocol as well as # the new Assuan based one (currently available in the “newpg” package # at ftp.gnupg.org/gcrypt/alpha/aegypten/). To make use of the agent, # you have to run an agent as daemon and use the option

# 以下をコメントアウトする
use-agent

お薦めしない方法

Windowsではgpg-agentが使えないため、gpgを使う替わりに以下の設定でパスフレーズの入力を省けるようになるが、危険なのであまりお薦めしない。

~/.sbt/(sbt-version)/gpg.sbt

pgpPassphrase = Some(Array('g','p','g','p','a','s','s')

gpgの証明書の作成と登録

# 鍵の作成
$ gpg --gen-key
(名前、e-mail, パスフレーズなどを登録)
# 鍵の表示
$ gpg --list-keys
pub   XXXXX/YYYYYYYY 2012-08-82
# 鍵を公開サーバーに登録
$ gpg --send-keys YYYYYYYY
  • gpg --gen-keyの際にmissing entropyと言われてフリーズする状態(sshでログインした環境で作業すると起こる)になった場合は、同じマシンで別のシェルを開いて、ls -lR /. などディスクにアクセスするコマンドを実行すれば良いとのこと。

gpg-agentの設定

gpg-agentを使うと、パスフレーズの入力を最初の一回だけ行えば、以降のパスフレーズの入力はgpg-agentが代わりにやってくれるようになる。keychainを使ってログイン時にgpg-agentを呼び出すこともでき、gpg-agentの多重起動を防ぐことができる。

ログイン時にgpg-agentを立ち上げるには、.bash_profile, .zprofileなどに以下の記述を追加する。

keychain -q --agents gpg
[ -z "$HOSTNAME" ] && HOSTNAME=`uname -n`
[ -f $HOME/.keychain/$HOSTNAME-sh-gpg ] && \
        . $HOME/.keychain/$HOSTNAME-sh-gpg

パスフレーズの時間

デフォルトでgpg-agentがパスフレーズを覚えてくれる時間は600秒と短いので、長めに設定しておくと日常のビルドが楽になる。

$HOME/.gnupg/gpg-agent.conf

# パスフレーズをcacheする時間を36000秒に設定
default-cache-ttl 360000
max-cache-ttl 360000
use-standard-socket

署名付きプロジェクトのビルド

# $HOME/.ivy2以下にインストール
$ sbt publish-local

# sbtのsettingsでpublishToで指定した先に署名付きjarファイルをアップロード
$ sbt publish

passphraseを聞かれてエラーが出てしまう場合、適当なファイルをgpgコマンドでエンコードしてagentにパスフレーズを覚えさせてからpublishを実行するとよい。

$ touch /tmp/hello
$ gpg /tmp/hello
(パスフレーズを入力)
comments powered by Disqus