Mavenリリースプラグインを使用するように構成しようとしているMavenプロジェクトがあります。リリースプロセスの一部は、Maven GPGプラグインを使用してアーティファクトに署名することです。これには、特に、成功するためにGPG署名キーパスフレーズが必要です。これらのビルドは非対話型環境で実行可能である必要があるため、(CI-Server)これらのパラメーターは次の形式でMavenに引数として渡されます。
-Dgpg.passphrase=XXX
スナップショットビルドの場合、すべてが正常に機能します。 Maven GPGプラグインは渡されたパスフレーズを確認し、アーティファクトは期待どおりにビルド、署名、デプロイされますが、リリースプラグインを使用しようとすると、gpg署名キーのパスワードの入力を求められます。渡されたパラメータを受け取らないmavenの別の呼び出しをフォークするリリースプラグインに起因する同様の問題に関するいくつかの議論を読みました。最も一般的な修正は、次のような「引数」パラメータを使用することのようです。
-Darguments="-Dgpg.passphrase=XXX"
おそらくこれはフォークされたインスタンスに渡されますが、残念ながら私にとってはプロンプトが削除されていません。
アーティファクトに署名することは、リリースアーティファクトをパブリックMavenリポジトリにデプロイするための珍しい前提条件ではなく、おそらくそれらのアーティファクトを生成するほとんどのエンティティが何らかの形式のCIを使用しているため、この問題に遭遇したのは私だけだとは想像できません。誰かが回避策を見つけましたか?
受け入れられた回答に関する注記:
受け入れられたソリューションは、Maven 3.0では機能しません-3.0.3および3.0.3は、デフォルトでJava on OSX Mountain Lionにインストールされます。 ここを参照)詳細については 。3.0.4にアップグレードする必要があります。
Settings.xmlのプロファイルで設定し、デフォルトでアクティブ化するだけです。
<settings>
<profiles>
<profile>
<id>gpg</id>
<properties>
<gpg.executable>gpg2</gpg.executable>
<gpg.passphrase>mypassphrase</gpg.passphrase>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>gpg</activeProfile>
</activeProfiles>
</settings>
ご覧のとおり、どのプロパティでもそれを行うことができます。また、jarsignerプラグインなどの他のユーザー名とパスワード。
これは常にアクティブである必要があります。新しいバージョンのMavenの使用に依存する場合がありますが、これはいつでも次のコマンドでデバッグできます。
mvn help:active-profiles
パスワードの暗号化
コメントやその他の回答は、パスワードをファイルに保持することは安全ではないことを指摘しています...これはある程度真実ですが、幸いなことにMavenでは、1つのマスターパスワードを作成し、設定ですべてのパスワードを暗号化することで、これを非常に安全にすることができます.xmlと一緒に。
詳細については、ミニガイド パスワード暗号化 をご覧ください。
ホームディレクトリ内のファイルにGPGパスフレーズを含めることは、絶対に恐ろしいセキュリティです。
代わりに、gpg-agentを使用して、セッションごとに1回だけパスフレーズを入力する必要があります。インストールしたら、次のようなことを行うようにシェルを設定できます。
eval $(gpg-agent --daemon --no-grab --write-env-file $HOME/.gpg-agent-info)
export GPG_TTY=$(tty)
export GPG_AGENT_INFO
次に、プラグインを更新してエージェントを有効にします。これは、pomで行うか、settings.xmlのプロファイルで行う方がよい場合があります。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<configuration>
<useAgent>true</useAgent>
</configuration>
</plugin>
または、設定でこれを行う方がおそらくより適切で移植性があります。
<profile>
<id>gpg-profile</id>
<properties>
<gpg.useagent>true</gpg.useagent>
</properties>
</profile>
次に、セッションで初めてgpgパスフレーズが必要になると、ダイアログがポップアップ表示されます。その後は毎回、エージェントからのパスフレーズを使用します。
Settings.xmlにクリアテキストでパスワードを設定したくない場合、およびgpg-agentを使用したくない/使用できない場合は、 パスワード暗号化の設定 を実行できます。
最初にmavenのマスターパスワードを設定する必要があります(maven 3.2.1以降を想定しています。そうでない場合は、パスワードを引数として渡す必要があります)。
mvn -emp
これにより、暗号化されたバージョンのパスワードが返されます。このパスワードを~/.m2/settings-security.xml
に保存します–次のようになります。
<settingsSecurity>
<master>{inY3jdvspkeO2RUTxzQ4xHPelos+9EF1iFQyJQ=}</master>
</settingsSecurity>
次に、キーパスワードを次のように暗号化します。
mvn -ep
そして、生成された暗号化されたパスワードをsettings.xml
で使用します(プロファイルIDは、使用するプロファイルと一致する必要があります。ここではrelease
を使用したため、mvn -P release release:prepare etc.
のようにmavenを実行する必要があります。別の回答で詳しく説明されているように、アクティブなプロファイルの一部にすることができます):
<servers>
<server>
<id>gpg.passphrase</id>
<passphrase>{inY3jdvspkeO2RUTxzQ4xHPelos}</passphrase>
</server>
</servers>
<profiles>
<profile>
<id>release</id>
<properties>
<gpg.keyname>6DF60995</gpg.keyname>
</properties>
</profile>
</profiles>
Settings.xmlのGPGパスワードは機能するソリューションですが、開いているため、これは問題です。私がプロジェクトで使用した代替ソリューションは次のとおりです。
stty -echo && printf "GPG password: " && read gpgPwd && printf '\n' && stty echo
mvn release:prepare -Darguments="-Dgpg.passphrase=$gpgPwd"
git Push
git Push --tags
mvn release:perform -Darguments="-Dgpg.passphrase=$gpgPwd"
unset gpgPwd
追加の必要な構成:
export GPG_TTY=$(tty) (in the ~/.bash_profile)
maven-release-plugin/configuration/pushChanges=false (in the root pom.xml)