39

Mavenリリースプラグインを使用するように構成しようとしているMavenプロジェクトがあります。リリースプロセスの一部は、Maven GPGプラグインを使用してアーティファクトに署名することです。これには、特にGPG署名キーパスフレーズが成功する必要があります。これらのビルドは非対話型環境で実行可能である必要があるため、(CI-Server)これらのパラメーターは引数としてmavenに次の形式で渡されます。

-Dgpg.passphrase=XXX

スナップショットビルドの場合、すべてが正常に機能します。Maven GPGプラグインは渡されたパスフレーズを認識し、アーティファクトは期待どおりにビルド、署名、デプロイされますが、リリースプラグインを使用しようとすると、gpg署名キーのパスワードの入力を求められます。渡されたパラメータを受け取らないmavenの別の呼び出しをフォークするリリースプラグインに起因する同様の問題に関するいくつかの議論を読みました。最も一般的な修正は、次のような「arguments」パラメータを使用することのようです。

-Darguments="-Dgpg.passphrase=XXX"

おそらくこれはフォークされたインスタンスに渡されますが、残念ながら私にとってはプロンプトが削除されていません。

アーティファクトに署名することは、リリースアーティファクトをパブリックMavenリポジトリにデプロイするための珍しい前提条件ではなく、おそらくそれらのアーティファクトを生成するほとんどのエンティティが何らかの形式のCIを使用しているため、この問題に遭遇したのは私だけだとは想像できません。誰かが回避策を見つけましたか?

受け入れられた回答に関する注記:

受け入れられたソリューションは、Maven 3.0では機能しません。3.0.3および3.0.3は、OSXMountainLionのJavaでデフォルトでインストールされるものです。3.0.4にアップグレードする必要があります。

4

7 に答える 7

33

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と一緒に。

詳細については、ミニガイドのパスワード暗号化をご覧ください。

于 2013-01-09T20:31:39.367 に答える
23

ホームディレクトリ内のファイルに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パスフレーズが必要になると、ダイアログがポップアップ表示されます。その後は毎回、エージェントからのパスフレーズを使用します。

于 2014-08-08T07:13:02.927 に答える
6

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は、使用するプロファイルと一致する必要があります。ここでは、releasemavenを実行する必要があるためmvn -P release release:prepare etc.、別の回答で詳しく説明されているように、アクティブなプロファイルの一部にすることができます)。

<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>
于 2015-06-18T12:24:29.860 に答える
2

受け入れられた回答は私には機能しませんでした(Maven3.6.2を使用)。私のために働いたのは、maven-gpg-plugin構成を更新することです。

<plugin>
  <artifactId>maven-gpg-plugin</artifactId>
 ....
  <configuration>
    <useAgent>true</useAgent>
    <passphrase>${env.GPG_PASSPHRASE}</passphrase>
    <gpgArguments>
      <arg>--batch</arg>
      <arg>--pinentry-mode</arg>
      <arg>loopback</arg>
    </gpgArguments>
  </configuration>
....
</plugin>
于 2020-09-17T16:30:17.087 に答える
2

ここでの回答とプラグインの公式ドキュメントを組み合わせて、settings.xmlの暗号化されたパスフレーズ(ここに記載)で動作させることができました。

settings.xml:

<?xml version="1.0" encoding="UTF-8"?>
 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
   <servers>
     <server>
       <id>YOUR_KEY_ID</id>
       <passphrase>YOUR_KEY_ENCRYPTED_PASSPHRASE</passphrase>
     </server>
   </servers>
   <profiles>
     <profile>
       <id>my-release</id>
       <activation>
         <!-- I run explicitly with "-Pmy-release". Change this to "true" if you don't want to. -->
         <activeByDefault>false</activeByDefault>
       </activation>
       <properties>
         <gpg.keyname>YOUR_KEY_ID</gpg.keyname>
       </properties>
     </profile>
   </profiles>
 </settings>

pom.xmlのmaven-gpg-pluginセクション:

<!-- Sign with GPG (properties are in ~/.m2/settings.xml) -->
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-gpg-plugin</artifactId>
  <version>1.6</version>
  <executions>
    <execution>
      <id>sign-artifacts</id>
      <phase>verify</phase>
      <goals>
        <goal>sign</goal>
      </goals>
      <configuration>
        <useAgent>true</useAgent>
        <keyname>${gpg.keyname}</keyname>
        <passphraseServerId>${gpg.keyname}</passphraseServerId>
        <gpgArguments>
          <arg>--batch</arg>
          <arg>--pinentry-mode</arg>
          <arg>loopback</arg>
        </gpgArguments>
      </configuration>
    </execution>
  </executions>
</plugin>

Mavenバージョン:3.6.3

于 2021-04-13T04:40:13.103 に答える
1

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)
于 2014-09-21T20:54:21.287 に答える
0

の構成maven-gpg-pluginは多くの場合複雑であり、ネイティブオペレーティングシステムの機能によって異なります。

すべての可能性と戦う代わりにmaven-gpg-plugin、CI/CD環境で使用するために設計された別のプラグインを使用できます。

https://www.simplify4u.org/sign-maven-plugin/を試すことができます。これは、代わりに使用できmaven-gpg-pluginます。

のすべての構成パラメーターはsign-maven-plugin、環境変数として提供できます。

Mavenプロジェクトでは、次のように置き換えmaven-gpg-pluginます。

<plugins>
    <plugin>
        <groupId>org.simplify4u.plugins</groupId>
        <artifactId>sign-maven-plugin</artifactId>
        <version><!-- check releases page --></version>
        <executions>
            <execution>
                <goals>
                    <goal>sign</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>

CIシステムでは、ビルド用の環境変数を設定します。

  • SIGN_KEY-装甲GPG/PGPキー
  • SIGN_KEY_ID -16進形式のキーID-指定されていない場合、SIGN_KEYの最初のキーが使用されます
  • SIGN_KEY_PASS-秘密鍵を復号化するためのパスフレーズ

また、sign-maven-plugin構成アイテムが利用できない場合、デフォルトで署名をアクティブ化/非アクティブ化するための特別なプロファイルは必要ありません。プラグインはエラーなしで実行をスキップします。

于 2021-02-02T15:26:12.787 に答える