Azure Pipelines に限った話ではなく、 CI で GnuPG による署名を自動化する話です。
パスフレーズ入力の自動化
gpg
コマンドのオプションで --passphrase
オプションを使えば、とりあえずパスフレーズを渡せるのですが、最近の GnuPG だと --batch
と --pinentry-mode loopback
を使わないと有効にならなかったり、対話的に署名したい場合とコマンドを使い分けが必要だったりするので別の方法を考えました。
そこで注目したのが gpg-preset-passphrase
コマンド。 GnuPG のパスフレーズをキャッシュに事前設定するコマンドです。
ドキュメントによると、引数の cacheid は GnuPG 鍵の ID ではなくて keygrip を指定するとのこと。 keygrip はとりあえず次で取れることを確認。
keygrip=`gpg --list-secret-keys --with-colons '鍵の ID' | \
awk -F : '$1 == "grp" { print $10 }'`
なお gpg-preset-passphrase
コマンドを利用するには、 gpg-agent
を --allow-preset-passphrase
オプション付きで実行する必要があるので、 gpg
を最初に使う前に一度だけ以下を実行しておきます。
echo allow-preset-passphrase >> $HOME/.gnupg/gpg-agent.conf
最後に、 gpg-preset-passphrase
を次のように実行すれば準備完了。
echo 'パスフレーズ' | \
/usr/lib/gnupg/gpg-preset-passphrase --preset "$keygrip"
以上で、 gpg
コマンドがパスフレーズを尋ねてこなくなりました。めでたしめでたし。