Запретить парольную фразу при подписании 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 активируется в командной строке или через конфигурацию активации.

Это вызвало у меня "веселые" сеансы отладки, и я видел, что это ловило и многих других ничего не подозревающих разработчиков.

Другие вопросы по тегам