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>