Gdzie umieścić konfigurację Gradle (tj. Poświadczenia), której nie należy zatwierdzać?

155

Próbuję wdrożyć artefakt zbudowany przez Gradle do repozytorium Maven i muszę określić poświadczenia do tego. Na razie działa to dobrze:

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

Ale nie lubię przechowywać poświadczeń w kontroli źródła. W Maven zdefiniowałbym konfigurację serwera i przypisałbym poświadczenia w moim ~/.m2/settings.xml. Jak zrobić coś podobnego w Gradle?

Lóránt Pintér
źródło
3
Wiesz, że używanie admin123 jako hasła jest złe z punktu widzenia bezpieczeństwa, prawda;)
jwatkins

Odpowiedzi:

228

~ / .gradle / gradle.properties :

mavenUser=admin
mavenPassword=admin123

build.gradle :

...
authentication(userName: mavenUser, password: mavenPassword)
Peter Niederwieser
źródło
2
Powinno gradle.propertiesnie być sprawdzana w celu VCS?
theblang
24
Nie ten w katalogu domowym użytkownika Gradle (patrz ścieżka powyżej).
Peter Niederwieser
W przypadku niektórych wersji klas ... Użyj mavenPass zamiast mavenPassword
Rodrigo
2
Radzę przekazywać właściwości projektu w następujący sposób uwierzytelnianie (nazwa_użytkownika: projekt.properties.mavenUser, hasło: projekt.properties.mavenPassword). Budowanie nie zakończy się niepowodzeniem, jeśli nie określono właściwości mavenUser / Password.
Dmitry
Musiałem zrobić to samo, ale użyć 2 różnych zmiennych środowiskowych: SONATYPE_NEXUS_USERNAME & SONATYPE_NEXUS_PASSWORD
Snicolas
94

Pierwsza odpowiedź jest nadal aktualna, ale interfejs API zmienił się w przeszłości. Ponieważ moja zmiana nie została zaakceptowana, zamieszczam ją jako oddzielną odpowiedź.

Metoda authentication()służy tylko do podania metody uwierzytelniania (np. Basic), ale nie do podania żadnych poświadczeń.

Nie powinieneś go również używać, ponieważ wyświetla dane uwierzytelniające w przypadku awarii!

Tak to powinno wyglądać w Twoim build.gradle

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

W gradle.propertiesswoim katalogu userhome umieść:

mavenUser=admin
mavenPassword=admin123

Zapewniają również, że GRADLE_USER_HOMEjest ustawiony ~/.gradleinaczej plik właściwości nie zostanie rozwiązany.

Zobacz też:

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

i

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

questionaire
źródło
Czy mógłby Pan wyjaśnić, jak zostanie to wykorzystane przez PO? tj. gdzie by siedział w przestrzeni nazw uploadArchives {repozytoria {mavenDeployer {
Matt C
Przepraszam, ale nie dostaję twojego pytania
ankietowany
4
OP korzysta z uwierzytelniania w przestrzeni nazw uploadArchives> repositories> mavenDeployer> repository> authentication. Zakładam, że nadal chcieliby używać uploadArchives, więc jak wyglądałaby konfiguracja kompilacji OP po zastosowaniu twojego rozwiązania? Czy muszą usunąć uwierzytelnianie i to zadziała?
Matt C
Właściwie nie mogę ci powiedzieć, ponieważ nigdy nie korzystałem z przestrzeni nazw mavenDeployer. Uploadarchives jest nadal prawidłowym zadaniem, ale poświadczenia tego zadania są konfigurowane w przestrzeni nazw maven.
questionaire
Ta odpowiedź jest niezgodna z pytaniem. Używa maven-publishwtyczki, podczas gdy pytanie używa mavenwtyczki.
Chry Cheng
16

Możesz również podać zmienne w wierszu poleceń za pomocą -PmavenUser=user -PmavenPassword=password.

Może to być przydatne, ponieważ z jakiegoś powodu nie możesz użyć pliku gradle.properties. Na przykład na serwerze kompilacji używamy Gradle z -gopcją, aby każdy plan budowy miał swój własny GRADLE_HOME.

lucrussell
źródło
16

Jeśli masz poświadczenia specyficzne dla użytkownika (tj. Każdy programista może mieć inną nazwę użytkownika / hasło), polecam użycie wtyczki gradle-properties-plugin .

  1. Umieść wartości domyślne w gradle.properties
  2. Każdy deweloper zastępuje gradle-local.properties(to powinno być ignorowane przez git).

Jest to lepsze niż zastępowanie używania, $USER_HOME/.gradle/gradle.propertiesponieważ różne projekty mogą mieć takie same nazwy właściwości.

Krishnaraj
źródło
Czy mógłbyś dodać pełną działającą MWE. Jak dołączyć wtyczkę do build.gradle. Jak używać poświadczeń w uploadArchiveskonfiguracji?
koppor
@koppor Nie jestem pewien, czy to nadal działa, ale użyłem go w moim projekcie open source - github.com/krishnaraj/oneclipboard/blob/master/build.gradle
Krishnaraj
7

Możesz umieścić poświadczenia w pliku właściwości i odczytać je, używając czegoś takiego:

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

Innym podejściem jest zdefiniowanie zmiennych środowiskowych na poziomie systemu operacyjnego i odczytanie ich przy użyciu:

System.getenv()['YOUR_ENV_VARIABLE']
David Levesque
źródło
2

Dla tych z Was, którzy budują w systemie MacOS i nie lubią zostawiać hasła w postaci zwykłego tekstu na komputerze, mogą użyć narzędzia pęku kluczy do przechowywania poświadczeń, a następnie wstrzyknąć je do kompilacji. Kredyty trafiają do Viktora Erikssona. https://pilloxa.gitlab.io/posts/safer-passwords-in-gradle/

Gabriel Kohen
źródło