Debに署名してレポを作成するスクリプトがあります。問題を引き起こしている関連コードは以下のとおりです。
export GNUPGHOME=foo/gnupg/
killall -q gpg-agent
eval $(gpg-agent --daemon --homedir $GNUPGHOME --allow-preset-passphrase)
echo ${signPass} | /usr/lib/gnupg2/gpg-preset-passphrase --preset $fingerprint
dpkg-sig -g '--no-tty' --sign builder bar/baz/app.deb
これはUbuntu 14.04で機能していますが、Ubuntu 16.04がインストールされているサーバーでこれを実行しようとすると、次のエラーが発生します。
dpkg-deb: building package 'app' in 'bar/baz/app.deb'.
Processing bar/baz/app.deb..
gpg: gpg-agent is not available in this session
gpg: Sorry, no terminal at all requested - can't get input
E: Signing failed. Error code: 512
buntu 14.04パッケージ:
buntu 16.04パッケージ:
dpkg-sig
が/usr/bin/gpg
を直接呼び出し、update-alternatives
を使用して/usr/bin/gpg
をgpg2
に設定したことを知っていますが、それは「デバイスの不適切なioctl 」。私はしばらく頭を叩いてきたので、どんな提案でも素晴らしいでしょう。
追加情報:
このスクリプトは、「Bamboo」のビルドジョブの一部として実行されます。パスワードは安全に保存されるため、環境変数としてパススルーされます。ただし、このアプリのパイプラインを変更するつもりはありません。
${signPass}
のパスフレーズは安全なストレージから来ていると言います。パスフレーズを安全に保存できる場合は、password-less secret keyを使用してキーチェーンを安全に保存することもできます。
キーのパスワードを空に変更します。お気に入りのキーチェーンマネージャーまたは次のコマンドを使用できます。
GNUPGHOME=... gpg2 --passwd user_id
キーチェーンを安全なストレージに保管します。
安全に保存されたキーチェーンを使用するGPGオプションでdpkg-sig
を実行します。
dpkg-sig --gpg-options "--secret-keyring /path/to/secret-keyring.gpg"
または、dpkg-sig
でパスフレーズファイル直接を使用できます(下記の編集を参照してください):
dpkg-sig -f /path/to/pass-phrase ...
標準入力を使用することもできます。
printf '%s' "${signPass}" | dpkg-sig -f - ...
編集:長年のバグ が-f
オプションを壊しているようですが、--gpg-options '--passphrase-file /path/to/pass-phrase'
を介して回避することができます(ただし、パスフレーズのファイル名を空白)。