¿Dónde colocar la configuración de Gradle (es decir, credenciales) que no se debe confirmar?

155

Estoy tratando de implementar un artefacto construido por Gradle en un repositorio de Maven, y necesito especificar las credenciales para eso. Esto funciona bien por ahora:

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

Pero no me gusta tener que almacenar las credenciales en el control de código fuente. Con Maven, definiría una configuración de servidor y asignaría credenciales en mi ~/.m2/settings.xml. ¿Cómo hago algo similar con Gradle?

Lóránt Pintér
fuente
3
Sabes que usar admin123 como contraseña es malo desde una perspectiva de seguridad, cierto;)
jwatkins

Respuestas:

228

~ / .gradle / gradle.properties :

mavenUser=admin
mavenPassword=admin123

build.gradle :

...
authentication(userName: mavenUser, password: mavenPassword)
Peter Niederwieser
fuente
2
¿ gradle.propertiesNo debe registrarse en VCS?
theblang
24
No el que está en la página de inicio de usuario de Gradle (consulte la ruta anterior).
Peter Niederwieser
Para algunas versiones de graduados ... Use mavenPass en lugar de mavenPassword
Rodrigo
2
Aconsejo pasar las propiedades del proyecto de la siguiente manera (nombre de usuario: project.properties.mavenUser, contraseña: project.properties.mavenPassword). Esto no fallará en una compilación cuando no se especifiquen las propiedades mavenUser / Password.
Dmitry
Tuve que hacer lo mismo pero usar 2 variables de entorno diferentes: SONATYPE_NEXUS_USERNAME y SONATYPE_NEXUS_PASSWORD
Snicolas
94

La primera respuesta sigue siendo válida, pero la API ha cambiado en el pasado. Como mi edición no fue aceptada, la publico como respuesta por separado.

El método authentication()solo se utiliza para proporcionar el método de autenticación (por ejemplo, Básico) pero no ninguna credencial.

¡Tampoco deberías usarlo ya que está imprimiendo las credenciales en caso de falla!

Así es como debería verse en tu build.gradle

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

En gradle.propertiessu directorio de inicio de usuario, ponga:

mavenUser=admin
mavenPassword=admin123

También asegúrese de que GRADLE_USER_HOMEesté configurado para que, de lo ~/.gradlecontrario, el archivo de propiedades no se resuelva.

Ver también:

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

y

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

cuestionario
fuente
¿Podría aclarar cómo utilizaría esto el OP? es decir, dónde se ubicaría en el espacio de nombres uploadArchives {repositorios {mavenDeployer {
Matt C
Lo siento pero no recibo tu pregunta
cuestionario
44
El OP utiliza la autenticación dentro del espacio de nombres uploadArchives> repositorios> mavenDeployer> repositorio> autenticación. Supongo que aún querrían usar uploadArchives, entonces, ¿cómo se vería la configuración de compilación del OP con su solución aplicada? ¿Necesitan eliminar la autenticación y funcionará?
Matt C
En realidad no puedo decírtelo ya que nunca usé el espacio de nombres mavenDeployer. Uploadarchives sigue siendo una tarea válida, pero las credenciales para esa tarea se configuran dentro del espacio de nombres de Maven.
cuestionario
Esta respuesta es incompatible con la pregunta. Está usando el maven-publishcomplemento mientras que la pregunta está usando el mavencomplemento.
Chry Cheng
16

También puede proporcionar variables en la línea de comando con -PmavenUser=user -PmavenPassword=password.

Esto puede ser útil si no puede usar un archivo gradle.properties por alguna razón. Por ejemplo, en un servidor de compilación, estamos usando Gradle con la -gopción para que cada plan de compilación tenga el suyo GRADLE_HOME.

lucrussell
fuente
16

Si tiene credenciales específicas de usuario (es decir, cada desarrollador puede tener un nombre de usuario / contraseña diferente), entonces recomendaría usar el complemento gradle-properties .

  1. Poner valores predeterminados en gradle.properties
  2. Cada desarrollador anula con gradle-local.properties(esto debe ignorarse).

Esto es mejor que anular el uso $USER_HOME/.gradle/gradle.propertiesporque diferentes proyectos pueden tener los mismos nombres de propiedad.

Krishnaraj
fuente
¿Podría agregar un MWE completo que funcione? Cómo incluir el complemento en build.gradle. ¿Cómo usar las credenciales en la uploadArchivesconfiguración?
koppor
@koppor No estoy seguro de si esto todavía funciona, pero lo he usado en mi proyecto de código abierto - github.com/krishnaraj/oneclipboard/blob/master/build.gradle
Krishnaraj
7

Puede poner las credenciales en un archivo de propiedades y leerlo usando algo como esto:

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

Otro enfoque es definir variables de entorno a nivel del sistema operativo y leerlas usando:

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

Para aquellos de ustedes que están construyendo en un MacOS, y no les gusta dejar su contraseña en texto claro en su máquina, pueden usar la herramienta de llavero para almacenar las credenciales y luego inyectarla en la compilación. Los créditos van a Viktor Eriksson. https://pilloxa.gitlab.io/posts/safer-passwords-in-gradle/

Gabriel Kohen
fuente