Où mettre la configuration Gradle (c'est-à-dire les informations d'identification) qui ne doivent pas être validées?

155

J'essaie de déployer un artefact construit par Gradle dans un repo Maven, et je dois spécifier des informations d'identification pour cela. Cela fonctionne bien pour le moment:

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

Mais je n'aime pas avoir à stocker les informations d'identification dans le contrôle de code source. Avec Maven, je définirais une configuration de serveur et attribuerais des informations d'identification dans mon ~/.m2/settings.xml. Comment faire quelque chose de similaire avec Gradle?

Lóránt Pintér
la source
3
Vous savez que l'utilisation de admin123 comme mot de passe est mauvaise du point de vue de la sécurité, à droite;)
jwatkins

Réponses:

228

~ / .gradle / gradle.properties :

mavenUser=admin
mavenPassword=admin123

build.gradle :

...
authentication(userName: mavenUser, password: mavenPassword)
Peter Niederwieser
la source
2
Ne devrait gradle.propertiespas être enregistré à VCS?
theblang
24
Pas celui de la page d'accueil de l'utilisateur Gradle (voir chemin ci-dessus).
Peter Niederwieser
Pour certaines versions de gradles ... Utilisez mavenPass au lieu de mavenPassword
Rodrigo
2
Je conseille de transmettre les propriétés du projet comme suit l'authentification (userName: project.properties.mavenUser, mot de passe: project.properties.mavenPassword) Cela n'échouera pas une construction lorsqu'aucune propriété mavenUser / Password n'est spécifiée.
Dmitry
J'ai dû faire la même chose mais utiliser 2 variables d'environnement différentes: SONATYPE_NEXUS_USERNAME & SONATYPE_NEXUS_PASSWORD
Snicolas
94

La première réponse est toujours valable, mais l'API a changé dans le passé. Comme ma modification n'a pas été acceptée, je la poste comme réponse séparée.

La méthode authentication()n'est utilisée que pour fournir la méthode d'authentification (par exemple, de base) mais pas les informations d'identification.

Vous ne devriez pas non plus l'utiliser car il imprime les informations d'identification en cas d'échec!

C'est à quoi ça devrait ressembler dans votre build.gradle

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

Dans gradle.propertiesvotre répertoire userhome, mettez:

mavenUser=admin
mavenPassword=admin123

Assurez-vous également que le GRADLE_USER_HOMEest défini sur, ~/.gradlesinon le fichier de propriétés ne sera pas résolu.

Voir également:

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

et

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

questionaire
la source
Pourriez-vous préciser comment cela serait utilisé par le PO? c'est-à-dire où se trouverait-il dans l'espace de noms uploadArchives {repositories {mavenDeployer {
Matt C
Désolé mais je ne comprends pas votre question
questionaire
4
L'OP utilise l'authentification dans l'espace de noms uploadArchives> repositories> mavenDeployer> repository> authentication. Ils voudraient toujours utiliser uploadArchives, je suppose, alors à quoi ressemblerait la configuration de construction de l'OP avec votre solution appliquée? Ont-ils besoin de supprimer l'authentification, et cela fonctionnera?
Matt C
En fait, je ne peux pas vous le dire car je n'ai jamais utilisé l'espace de noms mavenDeployer. Uploadarchives est toujours une tâche valide, mais les informations d'identification pour cette tâche sont configurées dans l'espace de noms maven.
questionaire
Cette réponse est incompatible avec la question. Il utilise le maven-publishplugin tandis que la question utilise le mavenplugin.
Chry Cheng
16

Vous pouvez également fournir des variables sur la ligne de commande avec -PmavenUser=user -PmavenPassword=password.

Cela peut être utile, vous ne pouvez pas utiliser un fichier gradle.properties pour une raison quelconque. Par exemple, sur un serveur de build, nous utilisons Gradle avec l' -goption pour que chaque plan de build ait le sien GRADLE_HOME.

lucratif
la source
16

Si vous avez des informations d'identification spécifiques à l'utilisateur (c'est-à-dire que chaque développeur peut avoir un nom d'utilisateur / mot de passe différent), je vous recommande d'utiliser le plugin gradle-properties-plugin .

  1. Mettre les valeurs par défaut dans gradle.properties
  2. Chaque développeur remplace par gradle-local.properties(cela doit être git ignoré).

C'est mieux que de remplacer l'utilisation $USER_HOME/.gradle/gradle.propertiescar différents projets peuvent avoir les mêmes noms de propriété.

Krishnaraj
la source
Pourriez-vous ajouter un MWE fonctionnel complet. Comment inclure le plugin dans build.gradle. Comment utiliser les informations d'identification dans la uploadArchivesconfiguration?
koppor
@koppor Je ne sais pas si cela fonctionne toujours mais je l'ai utilisé dans mon projet open source - github.com/krishnaraj/oneclipboard/blob/master/build.gradle
Krishnaraj
7

Vous pouvez mettre les informations d'identification dans un fichier de propriétés et le lire en utilisant quelque chose comme ceci:

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

Une autre approche consiste à définir les variables d'environnement au niveau du système d'exploitation et à les lire en utilisant:

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

Pour ceux d'entre vous qui construisent sur un MacOS et n'aiment pas laisser votre mot de passe en texte clair sur votre ordinateur, vous pouvez utiliser l'outil de trousseau pour stocker les informations d'identification, puis les injecter dans la construction. Les crédits vont à Viktor Eriksson. https://pilloxa.gitlab.io/posts/safer-passwords-in-gradle/

Gabriel Kohen
la source