Где разместить конфигурацию Gradle (то есть учетные данные), которые не следует фиксировать?

155

Я пытаюсь развернуть артефакт Gradle в репозитории Maven, и мне нужно указать для этого учетные данные. Это работает отлично на данный момент:

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "http://.../nexus/content/repositories/snapshots/") {
                authentication(userName: "admin", password: "admin123")
            }
        }
    }
}

Но мне не нравится хранить учетные данные в системе контроля версий. С Maven я бы определил конфигурацию сервера и назначил учетные данные в моем ~/.m2/settings.xml. Как мне сделать нечто подобное с Gradle?

Лоран Пинтер
источник
3
Вы знаете, что использование admin123 в качестве пароля плохо с точки зрения безопасности, верно;)
jwatkins

Ответы:

228

~ / .gradle / gradle.properties :

mavenUser=admin
mavenPassword=admin123

build.gradle :

...
authentication(userName: mavenUser, password: mavenPassword)
Питер Нидервизер
источник
2
Не должен gradle.propertiesбыть зарегистрирован в VCS?
Theblang
24
Не тот, что в доме пользователя Gradle (см. Путь выше).
Питер Нидервизер
Для некоторых версий gradles ... используйте mavenPass вместо mavenPassword
Родриго
2
Я советую передать свойства проекта следующим образом: аутентификация (userName: project.properties.mavenUser, password: project.properties.mavenPassword) Это не приведет к сбою сборки, если не указаны свойства mavenUser / Password.
Дмитрий
Мне нужно было сделать то же самое, но использовать две разные переменные среды: SONATYPE_NEXUS_USERNAME & SONATYPE_NEXUS_PASSWORD
Snicolas
94

Первый ответ все еще действителен, но API изменился в прошлом. Поскольку мое редактирование не было принято, я публикую его как отдельный ответ.

Этот метод authentication()используется только для предоставления метода аутентификации (например, Basic), но не для каких-либо учетных данных.

Вы также не должны использовать его, поскольку он печатает учетные данные в случае сбоя!

Это его, как это должно выглядеть в вашем build.gradle

    maven {
        credentials {
            username "$mavenUser"
            password "$mavenPassword"
        }
        url 'https://maven.yourcorp.net/'
   }

В gradle.propertiesвашем домашнем каталоге dir введите:

mavenUser=admin
mavenPassword=admin123

Кроме того , убедитесь , что GRADLE_USER_HOMEустановлен в ~/.gradleпротивном случае файл свойств не будет решена.

Смотрите также:

https://docs.gradle.org/current/userguide/build_environment.html

и

https://docs.gradle.org/current/userguide/dependency_management.html (23.6.4.1)

Опросник
источник
Не могли бы вы уточнить, как это будет использоваться ФП? т.е. где он будет находиться в пространстве имен uploadArchives {repositories {mavenDeployer {
Matt C
Извините, но я не понимаю ваш вопрос
Анкета
4
OP использует аутентификацию в пространстве имен uploadArchives> репозитории> mavenDeployer> репозиторий> аутентификация. Полагаю, они все равно захотят использовать uploadArchives, так как будет выглядеть конфигурация сборки OP при применении вашего решения? Нужно ли удалять аутентификацию, и она будет работать?
Мэтт C
На самом деле я не могу вам сказать, так как я никогда не использовал пространство имен mavenDeployer. Uploadarchives по-прежнему является действительной задачей, но учетные данные для этой задачи настраиваются в пространстве имен maven.
Анкета
Этот ответ несовместим с вопросом. Он использует maven-publishплагин, в то время как вопрос использует mavenплагин.
Чри Ченг
16

Вы также можете указать переменные в командной строке с помощью -PmavenUser=user -PmavenPassword=password.

Это может быть полезно, вы не можете использовать файл gradle.properties по какой-то причине. Например, на сервере сборки мы используем Gradle с -gопцией, чтобы у каждого плана сборки был свой GRADLE_HOME.

lucrussell
источник
16

Если у вас есть пользовательские учетные данные (т. Е. У каждого разработчика могут быть разные имя пользователя и пароль), я бы порекомендовал использовать плагин gradle-properties-plugin .

  1. Положить значения по умолчанию в gradle.properties
  2. Каждый разработчик переопределяет gradle-local.properties(это следует игнорировать).

Это лучше, чем переопределение использования, $USER_HOME/.gradle/gradle.propertiesпотому что разные проекты могут иметь одинаковые имена свойств.

Krishnaraj
источник
Не могли бы вы добавить полноценный рабочий MWE. Как включить плагин в build.gradle. Как использовать учетные данные в uploadArchivesконфиге?
Коппор
@koppor Не уверен, что это все еще работает, но я использовал его в своем проекте с открытым исходным кодом - github.com/krishnaraj/oneclipboard/blob/master/build.gradle
Кришнарадж
7

Вы можете поместить учетные данные в файл свойств и прочитать его, используя что-то вроде этого:

Properties props = new Properties() 
props.load(new FileInputStream("yourPath/credentials.properties")) 
project.setProperty('props', props)

Другой подход заключается в определении переменных среды на уровне ОС и их чтении с использованием:

System.getenv()['YOUR_ENV_VARIABLE']
Дэвид Левеск
источник
2

Для тех из вас, кто использует MacOS и не любит оставлять пароль в виде открытого текста на своем компьютере, вы можете использовать инструмент цепочки для ключей, чтобы сохранить учетные данные, а затем внедрить их в сборку. Кредиты достаются Виктору Эрикссону. https://pilloxa.gitlab.io/posts/safer-passwords-in-gradle/

Габриэль Коэн
источник