sbt ivy nexus

¿Cómo acceder a un Nexus seguro con sbt?



ivy (6)

Estoy intentando acceder a un administrador de repositorios Nexus que requiere una autenticación básica. Todo funciona bien desde Maven2, pero cuando intento configurar cosas en SBT no puedo encontrar los artefactos. Está utilizando un patrón de repositorio personalizado (consulte esta pregunta relacionada ) pero no creo que eso deba importar. En cualquier caso la configuración relevante está aquí.

Proyecto.scala:

val snapshotsName = "Repository Snapshots" val snapshotsUrl = new java.net.URL("http://nexusHostIp:8081/nexus/content/repositories/snapshots") val snapshotsPattern = "[organisation]/[module]/[revision]-SNAPSHOT/[artifact]-[revision](-[timestamp]).[ext]" val snapshots = Resolver.url(snapshotsName, snapshotsUrl)(Patterns(snapshotsPattern)) Credentials(Path.userHome / ".ivy2" / ".credentials", log) val dep = "group" % "artifact" % "0.0.1" extra("timestamp" -> "20101202.195418-3")

~ / .ivy2 / .credentials:

realm=Snapshots Nexus host=nexusHostIp:8081 user=nexususername password=nexuspassword

De acuerdo con una discusión similar en el grupo de usuarios de SBT, esto debería funcionar bien, pero obtengo lo siguiente cuando intento construir.

==== Repository Snapshots: tried [warn] -- artifact group#artifact;0.0.1!artifact.jar: [warn] http://nexusHostIp:8081/nexus/content/repositories/snapshots/group/artifact/0.0.1-SNAPSHOT/artifact-0.0.1-20101202.195418-3.jar

Estoy bastante seguro de que se trata de un problema de credenciales y no de otra cosa porque puedo acceder a la URL que dice que está intentando directamente y descargar el archivo (después de autenticar)

También he intentado declarar las credenciales en línea (aunque no son las ideales) de esta manera:

Credentials.add("Repository Snapshots", "nexusHostIp", "nexususername", "nexuspassword")


Compruebe todos los archivos que contienen credenciales.

Para mí tenía un nuevo proyecto en sbt 1.0 (en lugar de los viejos 0.13), donde tenía un ~/.sbt/1.0/global.sbt que contenía mis credenciales, que olvidé. Así que después de un cambio de contraseña obligatorio, se rompieron las descargas de artefactos y se bloqueó mi cuenta.

Sería bueno si la cadena de credenciales y los archivos que los llenan puedan ser inspeccionados fácilmente. También sería bueno si SBT fuera un poco más cuidadoso y primero verificara si la autenticación / autorización es correcta, antes de comenzar a descargar archivos X y bloquear mi cuenta después de 3 intentos de autenticado.


Esto es lo que hice (sbt 0.13 + artifactory - la configuración debería ser similar para el nexo):

1) Edite el archivo ~ / .sbt / repositories como se especifica aquí: http://www.scala-sbt.org/0.13.0/docs/Detailed-Topics/Proxy-Repositories.html

[repositories] local my-ivy-proxy-releases: http://repo.company.com/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext] my-maven-proxy-releases: http://repo.company.com/maven-releases/

2) Bloqueado mi artefacto para deshabilitar el acceso anónimo.

3) Creó un archivo de credenciales en ~ / .sbt / .credentials

realm=Artifactory Realm host=artifactory.mycompany.com user=username password=password

4) Creé un archivo en ~ / .sbt / 0.13 / plugins / credentials.sbt que conecta las credenciales predeterminadas

credentials += Credentials(Path.userHome / ".sbt" / ".credentials")

Ahora, cuando mi proyecto carga, sbt llega a artefactos como de costumbre.

La razón por la que lo hice de esta manera es para mantener las definiciones del repositorio, etc., fuera de los archivos del proyecto para permitir que los equipos tengan flexibilidad (pueden configurar un servidor interno para servir artefactos en progreso, etc.).

-Austen


Esto funcionó para mí. Estoy usando SBT versión 0.13.15:

~/.ivy2/.my-credentials (host sin puerto):

realm=Sonatype Nexus Repository Manager host=mynexus.mycompany.com user=my_user password=my_password

build.sbt (nexus url con puerto):

import sbt.Credentials ... credentials += Credentials(Path.userHome / ".ivy2" / ".my-credentials") ... resolvers in ThisBuild ++= Seq( MavenRepository("my-company-nexus", "https://mynexus.mycompany.com:8081/repository/maven-releases/") )


Si el iniciador de SBT no puede descargar una nueva versión de SBT desde su proxy, y ~/.sbt/boot/update.log muestra que está obteniendo 401 errores de autenticación, puede usar la variable de entorno SBT_CREDENTIALS para especificar dónde archivo de credenciales de hiedra es.

Cualquiera de estos debería funcionar y descargar la nueva versión de sbt:

  1. SBT_CREDENTIALS=''/home/YOUR_USER_NAME/.ivy2/.credentials'' sbt
  2. Poniendo export SBT_CREDENTIALS="/home/YOUR_USER_NAME/.ivy2/.credentials" en su .bashrc (o .zshrc ), inicie una nueva sesión de shell y luego ejecute sbt

(Necesitará tener la configuración del archivo ~/.ivy2/.credentials como se muestra en otras respuestas aquí)

Fuente: https://github.com/sbt/sbt/commit/96e5a7957c830430f85b6b89d7bbe07824ebfc4b


Siguiendo la Documetación SBT :

Hay dos formas de especificar las credenciales para dicho repositorio:

En línea

credentials += Credentials("Some Nexus Repository Manager", "my.artifact.repo.net", "admin", "password123")

Archivo externo

credentials += Credentials(Path.userHome / ".ivy2" / ".credentials")

El archivo de credenciales es un archivo de propiedades con el dominio de claves, host, usuario y contraseña. Por ejemplo:

realm=Some Nexus Repository Manager host=my.artifact.repo.net user=admin password=password123


ACTUALIZACIÓN: esta respuesta no funciona en versiones recientes de sbt; en su lugar, vea la respuesta de Austen.

Bien, finalmente conseguí esto resuelto.

snapshotsName puede ser cualquier cosa. realm en .credentials debe ser el reino de autenticación HTTP que aparece cuando se intenta acceder a la URL del repositorio (nexo en mi caso). realm es también el primer parámetro de Credentials.add . Así que esa línea debería haber sido

Credentials.add("Sonatype Nexus Repository Manager", "nexusHostIp", "nexususername", "nexuspassword")

El nombre del host es solo el nombre de la ip o del DNS. Entonces, en .credentials el host es solo nexusHostIp sin el número de puerto.

Así que la configuración de trabajo del proyecto es:

val snapshotsName = "Repository Snapshots" val snapshotsUrl = new java.net.URL("http://nexusHostIp:8081/nexus/content/repositories/snapshots") val snapshotsPattern = "[organisation]/[module]/[revision]-SNAPSHOT/[artifact]-[revision](-[timestamp]).[ext]" val snapshots = Resolver.url(snapshotsName, snapshotsUrl)(Patterns(snapshotsPattern)) Credentials(Path.userHome / ".ivy2" / ".credentials", log) val dep = "group" % "artifact" % "0.0.1" extra("timestamp" -> "20101202.195418-3")

Con un archivo .credentials que se parece a:

realm=Sonatype Nexus Repository Manager host=nexusHostIp user=nexususername password=nexuspassword

Donde "Sonatype Nexus Repository Manager" es el dominio de autenticación HTTP.