Подтвердить что ты не робот

Избегайте подписи подписи 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.

4b9b3361

Ответ 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)