Избегайте подписи подписи gpg при использовании плагина Maven release
У меня есть проект Maven, который я пытаюсь настроить для использования плагина релиза maven. Часть процесса выпуска состоит в том, чтобы использовать Maven GPG Plugin для подписи артефактов, который требует, среди прочего, ключевой фразы ключевого слова GPG для успеха. Поскольку эти сборки необходимо запускать в неинтерактивной среде (CI-Server), эти параметры передаются как аргументы maven в виде
-Dgpg.passphrase=XXX
Для создания моментальных снимков все работает нормально; Maven GPG Plugin видит переданную в кодовой фразе, артефакты строятся, подписываются и развертываются, как ожидалось, однако, когда я пытаюсь использовать плагин release, мне подсказывают пароль для подписи подписи gpg. Я прочитал несколько обсуждений по аналогичным вопросам, которые связаны с выпуском плагина, который разворачивает другой вызов maven, который не получает переданные в params. Наиболее популярным решением является использование параметра "arguments" следующим образом:
-Darguments="-Dgpg.passphrase=XXX"
Предположительно это передается в разветвленный экземпляр, но, к сожалению, для меня это не избавляет от подсказки.
Поскольку подписание артефактов не является необычным предварительным условием для развертывания артефактов выпуска в публичных репозиториях maven, и, по-видимому, большинство организаций, производящих эти артефакты, используют какую-то форму CI. Я не могу себе представить, что я единственный человек, столкнувшийся с этой проблемой. Кто-нибудь нашел обходное решение?
ПРИМЕЧАНИЕ ОБ ПРИНЯТОМ ОТВЕТ:
Принятое решение не будет работать с Maven 3.0 - 3.0.3 и 3.0.3, так что это происходит по умолчанию с установкой java на OSX Mountain Lion. Подробнее см. здесь. Вам нужно будет перейти на 3.0.4.
Ответы
Ответ 1
Просто установите его в профиле в settings.xml и активируйте его по умолчанию:
<settings>
<profiles>
<profile>
<id>gpg</id>
<properties>
<gpg.executable>gpg2</gpg.executable>
<gpg.passphrase>mypassphrase</gpg.passphrase>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>gpg</activeProfile>
</activeProfiles>
</settings>
Как вы можете видеть, вы можете сделать это с любым свойством. также другие имена пользователей и пароли для плагина jarsigner и т.д.
Это должно быть всегда активно. Это может зависеть от использования новой версии Maven, но вы всегда можете отлаживать ее с помощью
mvn help:active-profiles
Шифрование пароля
В комментариях и других ответах указывается, что хранение паролей в файле небезопасно... Это верно в некоторой степени, но, к счастью, Maven позволяет нам сделать это очень безопасным, создав один главный пароль, а затем зашифровав все пароли в settings.xml с ним.
Подробнее см. в мини-путеводителе Шифрование паролей.
Ответ 2
Наличие вашей фразы в GPG в файле в вашем домашнем каталоге - абсолютно ужасная безопасность.
Вместо этого используйте gpg-agent, поэтому вам нужно всего лишь ввести вашу кодовую фразу один раз за сеанс.
После установки вы можете настроить свою оболочку, чтобы сделать что-то вроде:
eval $(gpg-agent --daemon --no-grab --write-env-file $HOME/.gpg-agent-info)
export GPG_TTY=$(tty)
export GPG_AGENT_INFO
затем обновите свой плагин, чтобы активировать агент. Вы можете сделать это либо в pom, либо в профиле в ваших настройках. Xml может быть лучше:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<configuration>
<useAgent>true</useAgent>
</configuration>
</plugin>
или, вероятно, лучше и более переносимо сделать это в ваших настройках:
<profile>
<id>gpg-profile</id>
<properties>
<gpg.useagent>true</gpg.useagent>
</properties>
</profile>
Затем в первый раз в сеансе, где нужна кодовая фраза gpg, открывается диалоговое окно. Каждый раз после этого он использует кодовую фразу от агента.
Ответ 3
Если вы не хотите иметь пароль в текстовом виде в вашем файле settings.xml и не хотите/не можете использовать gpg-agent, вы можете установить пароль для шифрования.
Сначала вам нужно установить главный пароль для maven (предполагая maven 3.2.1+, иначе вам нужно передать пароль в качестве аргумента):
mvn -emp
Это вернет зашифрованную версию пароля. Сохраните этот пароль в ~/.m2/settings-security.xml
- он должен выглядеть так:
<settingsSecurity>
<master>{inY3jdvspkeO2RUTxzQ4xHPelos+9EF1iFQyJQ=}</master>
</settingsSecurity>
Затем зашифруйте пароль ключа с помощью
mvn -ep
И используйте сгенерированный зашифрованный пароль в settings.xml
(идентификатор профиля должен соответствовать профилю, который вы используете, здесь я использовал release
, поэтому вам нужно будет запустить maven как mvn -P release release:prepare etc.
- иначе вы можете сделать его частью активных профилей, как описано в другом ответе):
<servers>
<server>
<id>gpg.passphrase</id>
<passphrase>{inY3jdvspkeO2RUTxzQ4xHPelos}</passphrase>
</server>
</servers>
<profiles>
<profile>
<id>release</id>
<properties>
<gpg.keyname>6DF60995</gpg.keyname>
</properties>
</profile>
</profiles>
Ответ 4
Пароль GPG в settings.xml является рабочим решением, но он открыт, и это плохо.
Альтернативное решение, которое я использовал в моих проектах, выглядит следующим образом:
stty -echo && printf "GPG password: " && read gpgPwd && printf '\n' && stty echo
mvn release:prepare -Darguments="-Dgpg.passphrase=$gpgPwd"
git push
git push --tags
mvn release:perform -Darguments="-Dgpg.passphrase=$gpgPwd"
unset gpgPwd
Дополнительные требуемые конфигурации:
export GPG_TTY=$(tty) (in the ~/.bash_profile)
maven-release-plugin/configuration/pushChanges=false (in the root pom.xml)