Запретить парольную фразу при подписании JAR
Я пытаюсь настроить сборку Maven так, чтобы она автоматически подписывала JAR без необходимости вручную вводить фразу-пароль, как бы я ни пытался настроить maven-gpg-plugin
он либо терпит неудачу, либо всегда запрашивает пароль.
Я использовал эту страницу в качестве руководства по настройке Maven settings.xml
:
<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 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<profiles>
<profile>
<id>ossrh</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<gpg.executable>gpg2</gpg.executable>
<gpg.keyname>${env.GPG_KEY_NAME}</gpg.keyname>
<gpg.passphrase>${env.GPG_PASS_PHRASE}</gpg.passphrase>
</properties>
</profile>
</profiles>
<servers>
<server>
<id>ossrh</id>
<username>${env.OSSRH_JIRA_USERNAME}</username>
<password>${env.OSSRH_JIRA_PASSWORD}</password>
</server>
</servers>
</settings>
Переменные среды, указанные выше, задаются в среде.
И maven-gpg-plugin
Конфигурация из этого вопроса я попытался настроить POM следующим образом:
<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>
<gpgArguments>
<arg>--pinentry-mode</arg>
<arg>loopback</arg>
</gpgArguments>
</configuration>
</execution>
</executions>
</plugin>
Но при сборке я получаю следующую ошибку:gpg: setting pinentry mode 'loopback' failed: Not supported
Я пытался добавить allow-loopback-pinentry
в gpg-agent.conf, но результат тот же. Если я удалю <gpgArguments>
из конфигурации плагина Maven я получаю всплывающее окно с просьбой ввести пароль.
Я использую gpg2 версии 2.1.11
2 ответа
Проблема возникает из-за того, что я пытался использовать gpg2
вместо gpg
как я предполагал, что gpg2
было лучше (без фактического исследования). Страница man для gpg 2 гласит:
В отличие от автономной команды gpg из GnuPG 1.x, которая может лучше подходить для серверных и встраиваемых платформ, версия 2.x обычно устанавливается под именем gpg2 и ориентирована на рабочий стол, поскольку для нее требуется несколько других модулей. установлены.
gpg2
нацелена на рабочий стол, и поэтому я предполагаю, что "жестко запрограммирован" запрашивать пароль, и на самом деле я должен использовать gpg
,
Плагины говорят, что исполняемый файл по умолчанию gpg
, Если профиль не включен, он выбирает нужный gpg2
? useAgent
== true по умолчанию, следует оставить таким образом gpg2 для документов.
Для использования агента попробуйте настроить исполняемый файл прямо в плагине вместо профиля.
<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>
<executable>gpg2</executable>
<gpgArguments>
<arg>--pinentry-mode</arg>
<arg>loopback</arg>
</gpgArguments>
</configuration>
</execution>
</executions>
</plugin>
Чтобы сделать это без агента, используя 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>
<executable>gpg2</executable>
<keyname>${gpg.keyname}</keyname>
<passphraseServerId>${gpg.keyname}</passphraseServerId>
</configuration>
</execution>
</executions>
</plugin>
<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 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<properties>
<gpg.keyname>${env.GPG_KEY_NAME}</gpg.keyname>
</properties>
<servers>
<server>
<id>${env.GPG_KEY_NAME}</id>
<passphrase>${env.GPG_PASS_PHRASE}</passphrase>
</server>
</servers>
</settings>
Обратите внимание, я не использовал профиль, как они предложили, потому что в соответствии с документами профиля Maven (выделение мое):
будет автоматически активен для всех сборок, если другой профиль в том же POM не активирован одним из ранее описанных методов. Все профили, которые активны по умолчанию, автоматически деактивируются, когда профиль в POM активируется в командной строке или через конфигурацию активации.
Это вызвало у меня "веселые" сеансы отладки, и я видел, что это ловило и многих других ничего не подозревающих разработчиков.