¿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:
-
SBT_CREDENTIALS=''/home/YOUR_USER_NAME/.ivy2/.credentials'' sbt
- Poniendo
export SBT_CREDENTIALS="/home/YOUR_USER_NAME/.ivy2/.credentials"
en su.bashrc
(o.zshrc
), inicie una nueva sesión de shell y luego ejecutesbt
(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.