maven-gpg-plugin завершается с ошибкой "Неправильный ioctl для устройства" при работе под Jenkins

Когда Дженкинс срабатывает maven-gpg-plugin в удаленной оболочке Linux это не с gpg: signing failed: Inappropriate ioctl for device, Это раньше работало до недавнего времени. Я не знаю, что изменилось.

Я нашел много онлайн-ссылок, предлагающих export GPG_TTY=$(tty) но это не работает для соединений SSH, как tty является null, Есть идеи?

4 ответа

Решение

Я нашел отличное объяснение на https://myshittycode.com/2017/08/07/maven-gpg-plugin-prevent-signing-prompt-or-gpg-signing-failed-no-such-file-or-directory-error/

Я повторно опубликую суть сообщения, если страница откроется:

Если вы 1) изначально работали с ним в прошлом, и 2) перепробовали все виды решений из Интернета, но все равно не смогли заставить его работать, скорее всего, вы бессознательно обновили версию GPG с 2.0 до 2.1.

Звучит о праве...

Чтобы исправить это, GPG 2.1 требует, чтобы --pinentry-mode был установлен на loopback, чтобы получить значение gpg.passphrase, определенное в Maven settings.xml.

Итак, обновите конфигурацию Maven GPG Plugin в pom.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>
                <gpgArguments>
                    <arg>--pinentry-mode</arg>
                    <arg>loopback</arg>
                </gpgArguments>
            </configuration>
        </execution>
    </executions>
</plugin>

В моем случае помогло обновление до более новой версии maven-gpg-plugin. От 1.5 до 3.0.1.

Надеюсь, это будет хотя бы попытка для кого-то

Чтобы опираться на ответ Гили:

Вместо того, чтобы изменять каждый pom.xml, чтобы сделать Дженкинса счастливым, вы можете добавить следующее в~/.gnupg/gpg.confна рабах Дженкинса с более новым gpg:

      pinentry-mode loopback

Кукольный

Вы также можете автоматизировать это. Я использую марионетку для созданияgpg.confфайлы с этой записью, если версия gpg 2.1 или выше:

Шаблон

      <% if scope.lookupvar("gpg_version").to_f >= 2.1 %>
pinentry-mode loopback
<% end %>

Факт

      Facter.add("gpg_version") do
  setcode do

    result = ''
    begin
      first_line = `gpg --version`.split("\n")[0]
      match = first_line.match /.* ([0-9\.]*)$/
      result = match[1]
    rescue

    end
    result
  end
end

Это сработало для меня:

      <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>3.0.1</version>
<executions>
    <execution>
        <id>sign-artifacts</id>
        <phase>verify</phase>
        <goals>
            <goal>sign</goal>
        </goals>
    </execution>
</executions>
<configuration>
    <gpgArguments>
        <argument>--pinentry-mode</argument>
        <argument>loopback</argument>
    </gpgArguments>
</configuration>
</plugin>
Другие вопросы по тегам