xsbt-gpg-pluginを使うと、sbtで生成されたプロジェクトのjarファイルにGnuPG(gpg)による署名ができる。Sonatypeのリポジトリにプロジェクトをdeployする際にgpgによる署名が必須。作成したプログラムをSonatypeのリポジトリに登録して、Maven Central Repositoryに同期してもらうと、自分で作ったプログラムを世界中の人に手軽にダウンロードできる状態(つまりsbtのlibraryDependenciesの設定に追加するだけで使える状態)で公開できる。
gpg, gpg-agent, keychain
~/.sbt/(sbt-version)/plugins/build.sbt
にsbt-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
を設定しても良い。
$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 --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が代わりにやってくれるようになる。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
(パスフレーズを入力)