Wo soll die Gradle-Konfiguration (dh die Anmeldeinformationen) abgelegt werden, die nicht festgeschrieben werden soll?

155

Ich versuche, ein von Gradle erstelltes Artefakt für ein Maven-Repo bereitzustellen, und ich muss dafür Anmeldeinformationen angeben. Dies funktioniert vorerst gut:

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

Aber ich mag es nicht, die Anmeldeinformationen in der Quellcodeverwaltung speichern zu müssen. Mit Maven würde ich eine Serverkonfiguration definieren und Anmeldeinformationen in meinem zuweisen ~/.m2/settings.xml. Wie mache ich etwas Ähnliches mit Gradle?

Lóránt Pintér
quelle
3
Sie wissen, dass die Verwendung von admin123 als Passwort aus Sicherheitsgründen schlecht ist, richtig;)
jwatkins

Antworten:

228

~ / .gradle / gradle.properties :

mavenUser=admin
mavenPassword=admin123

build.gradle :

...
authentication(userName: mavenUser, password: mavenPassword)
Peter Niederwieser
quelle
2
Sollte gradle.propertiesnicht eingecheckt werden VCS?
Theblang
24
Nicht der im Gradle-Benutzerheim (siehe Pfad oben).
Peter Niederwieser
Für einige Versionen von Gradles ... Verwenden Sie mavenPass anstelle von mavenPassword
Rodrigo
2
Ich empfehle, die Projekteigenschaften wie folgt zu authentifizieren (Benutzername: project.properties.mavenUser, Kennwort: project.properties.mavenPassword). Dies schlägt bei einem Build nicht fehl, wenn keine Eigenschaften mavenUser / Password angegeben sind.
Dmitry
Ich musste dasselbe tun, aber 2 verschiedene Umgebungsvariablen verwenden: SONATYPE_NEXUS_USERNAME & SONATYPE_NEXUS_PASSWORD
Snicolas
94

Die erste Antwort ist noch gültig, aber die API hat sich in der Vergangenheit geändert. Da meine Bearbeitung dort nicht akzeptiert wurde, poste ich sie als separate Antwort.

Die Methode authentication()wird nur verwendet, um die Authentifizierungsmethode (z. B. Basic) bereitzustellen, jedoch keine Anmeldeinformationen.

Sie sollten es auch nicht verwenden, da es die Anmeldeinformationen bei einem Fehler einfach druckt!

So sollte es in deinem aussehen build.gradle

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

In gradle.propertiesIhrem Userhome-Verzeichnis setzen Sie:

mavenUser=admin
mavenPassword=admin123

Achten Sie auch darauf , dass die GRADLE_USER_HOMEeingestellt ist ~/.gradlesonst die Eigenschaften dort Datei wird nicht aufgelöst werden.

Siehe auch:

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

und

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

Fragebogen
quelle
Könnten Sie klarstellen, wie dies vom OP verwendet werden würde? dh wo würde es im Namespace uploadArchives {repositories {mavenDeployer {
Matt C
Entschuldigung, aber ich verstehe Ihre Frage nicht
Fragebogen
4
Das OP verwendet die Authentifizierung im Namespace uploadArchives> Repositorys> mavenDeployer> Repository> Authentifizierung. Ich nehme an, sie möchten weiterhin uploadArchives verwenden. Wie würde also die Build-Konfiguration des OP aussehen, wenn Ihre Lösung angewendet wird? Müssen sie die Authentifizierung entfernen, und es wird funktionieren?
Matt C
Eigentlich kann ich es Ihnen nicht sagen, da ich nie den mavenDeployer-Namespace verwendet habe. Uploadarchives ist immer noch eine gültige Aufgabe, aber die Anmeldeinformationen für diese Aufgabe werden im Maven-Namespace konfiguriert.
Fragebogen
Diese Antwort ist mit der Frage nicht kompatibel. Es verwendet das maven-publishPlugin, während die Frage das mavenPlugin verwendet.
Chry Cheng
16

Sie können auch Variablen in der Befehlszeile mit angeben -PmavenUser=user -PmavenPassword=password.

Dies kann nützlich sein, wenn Sie aus irgendeinem Grund keine gradle.properties-Datei verwenden können. Zum Beispiel verwenden wir auf einem Build-Server Gradle mit der -gOption, dass jeder Build-Plan seinen eigenen hat GRADLE_HOME.

lucrussell
quelle
16

Wenn Sie benutzerspezifische Anmeldeinformationen haben (dh jeder Entwickler hat möglicherweise einen anderen Benutzernamen / ein anderes Passwort), würde ich die Verwendung des Gradle-Properties-Plugins empfehlen .

  1. Setzen Sie die Standardeinstellungen gradle.properties
  2. Jeder Entwickler überschreibt mit gradle-local.properties(dies sollte ignoriert werden).

Dies ist besser als das Überschreiben der Verwendung, $USER_HOME/.gradle/gradle.propertiesda verschiedene Projekte möglicherweise dieselben Eigenschaftsnamen haben.

Krishnaraj
quelle
Könnten Sie eine voll funktionsfähige MWE hinzufügen. So fügen Sie das Plugin ein build.gradle. Wie verwende ich Anmeldeinformationen in der uploadArchivesKonfiguration?
Koppor
@koppor Ich bin mir nicht sicher, ob dies noch funktioniert, aber ich habe es in meinem Open Source-Projekt verwendet - github.com/krishnaraj/oneclipboard/blob/master/build.gradle
Krishnaraj
7

Sie können die Anmeldeinformationen in eine Eigenschaftendatei einfügen und sie folgendermaßen lesen:

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

Ein anderer Ansatz besteht darin, Umgebungsvariablen auf Betriebssystemebene zu definieren und sie zu lesen, indem Sie:

System.getenv()['YOUR_ENV_VARIABLE']
David Levesque
quelle
2

Für diejenigen unter Ihnen, die auf einem MacOS aufbauen und Ihr Kennwort nicht gerne im Klartext auf Ihrem Computer belassen, können Sie die Anmeldeinformationen mithilfe des Schlüsselbund-Tools speichern und dann in den Build einfügen. Credits gehen an Viktor Eriksson. https://pilloxa.gitlab.io/posts/safer-passwords-in-gradle/

Gabriel Kohen
quelle