Как мне заставить maven-gpg-plugin использовать фразу-пароль из переменной среды или свойства командной строки?
Я видел: не используйте подсказку для подписи gpg при использовании плагина релиза Maven, но это для очень старой версии maven, и я использую 3.2.2, поэтому то же решение не применимо.
По сути, независимо от того, какая комбинация свойств в командной строке, свойств в pom.xml или переменных среды, я не могу получить плагин maven gpg, чтобы избежать появления диалогового окна агента.
По соображениям безопасности мы решили не включать парольную фразу в виде обычного текста в файл settings.xml, потому что это ужасная идея. А использование зашифрованного maven-материала просто перемещает мастер-ключ в другой простой текстовый файл.
Версии программного обеспечения:
$ gpg --version
gpg (GnuPG) 2.1.2
libgcrypt 1.6.2
$ mvn --version
Apache Maven 3.2.2 (45f7c06d68e745d05611f7fd14efb6594181933e; 2014-06-17T08:51:42-05:00)
я пытался
mvn -Dgpg.passphrase='lolpassphrase'
Используя свойства в pom.xml, чтобы получить его из среды:
<properties>
<gpg.keyname>E7C89BBB</gpg.keyname>
<gpg.passphrase>${env.GPG_PASSPHRASE}</gpg.passphrase>
</properties>
а потом:
GPG_PASSPHRASE='lolpassphrase' mvn install
РЕДАКТИРОВАТЬ: Очевидно, мой агент gpg мешал и лгал мне, агент GPG будет по- прежнему запрашивать меня, если я установлю фактическую фразу-пароль в свойствах pom.xml:(
<properties>
<gpg.keyname>E7C89BBB</gpg.keyname>
<gpg.passphrase><![CDATA[lolcomplicatedpassphrase]]></gpg.passphrase>
</properties>
Должен быть способ сделать это, не сохраняя пароль где-нибудь в открытом виде, но я не могу использовать правильный гугл, чтобы найти этот ответ, надеясь, что вы, ребята, поможете мне.
2 ответа
РЕДАКТИРОВАТЬ: это решение работает только на gnupg 2.1.x. 2.0.x не распознает параметр командной строки --pinentry-mode, и он взрывается. К сожалению, в mavens нет никакого способа, о котором я знаю, кроме второго профиля, чтобы он правильно делал, в зависимости от версии gnupg. Вероятно, потребуется обновление для плагина, чтобы сделать это "правильным" способом.
Боже, я только что понял это, вы должны указать пару аргументов для gpg, чтобы изменить режим pinentry на 'loopback'. После того, как вы это сделаете, он будет учитывать значение gpg.passphrase, либо из переменной окружения, либо из пользовательское свойство. Вау, это было неясно.
<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>
<!-- This is necessary for gpg to not try to use the pinentry programs -->
<gpgArguments>
<arg>--pinentry-mode</arg>
<arg>loopback</arg>
</gpgArguments>
</configuration>
</execution>
</executions>
</plugin>
Вы можете использовать плагин https://www.simplify4u.org/sign-maven-plugin/ , который не использует
gpg
для подписи, поэтому вам не нужна сложная конфигурация для предоставленной парольной фразы в качестве переменной среды.
sign-maven-plugin
просто поддерживайте все элементы конфигурации как переменную среды.