¿Cómo acceder a un Nexus asegurado con SBT?
Pregunta
Estoy intentando acceder a un administrador de repositorio de Nexus, que requiere un poco de autenticación básica. Todo funciona bien desde Maven2 pero cuando intento cosas configurar en SBT no puede encontrar los artefactos. Está utilizando un patrón repositorio personalizado (véase esta pregunta relacionada ), pero no creo que debería importar. En cualquier caso, la configuración correspondiente está aquí.
Project.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
Según una discusión similar en el grupo de usuarios SBT esto debería funcionar bien, pero me estoy haciendo lo siguiente cuando intento de 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 este es un problema de credenciales y no otra cosa, ya que puede golpear la URL que dice que está tratando directamente y descargar el frasco (después de la autenticación).
También he intentado declarar las credenciales en línea (aunque es menos que ideal) de esta manera:
Credentials.add("Repository Snapshots", "nexusHostIp", "nexususername", "nexuspassword")
Solución
Esto es lo que hice (SBT 0,13 + Artifactory - configuración debería ser similar para Nexus):
1) Editado el archivo ~ / .sbt / repositorios 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 por mi Artifactory a deshabilitar el acceso anónimo.
3) crea un archivo de credenciales en ~ / .sbt / .credentials
realm=Artifactory Realm
host=artifactory.mycompany.com
user=username
password=password
4) crea un archivo en ~ / .sbt / 0,13 / plugins / credentials.sbt que los cables hasta las credenciales por defecto
credentials += Credentials(Path.userHome / ".sbt" / ".credentials")
Ahora, cuando mis cargas de proyecto SBT éxitos Artifactory como normal.
La razón por la que hice de esta manera es mantener las definiciones del repositorio, etc., de los archivos de proyecto para que los equipos puedan tener flexibilidad (que pueden configurar un servidor interno para servir artefactos en curso, etc.).
-Austen
Otros consejos
ACTUALIZACIÓN:. Esta respuesta no funciona en las versiones recientes de SBT - véase la respuesta de Austen lugar
Está bien que finalmente me dieron esta solucionado.
snapshotsName
puede ser cualquier cosa. realm
en .credentials debe ser el ámbito de autenticación HTTP que se presenta al tratar de golpear la URL del repositorio (nexo en mi caso). realm
es también el primer parámetro de Credentials.add
. De manera que la línea debería haber sido
Credentials.add("Sonatype Nexus Repository Manager", "nexusHostIp", "nexususername", "nexuspassword")
El nombre de host es el nombre del IP o DNS. Así que en .credentials host
es sólo nexusHostIp
sin el número de puerto.
Así que la configuración del proyecto de trabajo 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 reino de autenticación HTTP.
Si SBT lanzador está fallando para descargar una nueva versión de SBT de su apoderado, y que ~/.sbt/boot/update.log
está mostrando que está obteniendo 401 errores de autenticación, puede utilizar los SBT_CREDENTIALS variable de entorno para especificar que el archivo de credenciales es la hiedra.
Cualquiera de ellas debe trabajar y descargar la nueva versión SBT:
-
SBT_CREDENTIALS='/home/YOUR_USER_NAME/.ivy2/.credentials' sbt
- Poner
export SBT_CREDENTIALS="/home/YOUR_USER_NAME/.ivy2/.credentials"
en su.bashrc
(o.zshrc
), iniciar una nueva sesión de shell y luego ejecutarsbt
(necesitará tiene la configuración de archivos ~/.ivy2/.credentials
como otras respuestas aquí se muestran)
Fuente: https://github.com/sbt/sbt/commit/96e5a7957c830430f85b6b89d7bbe07824ebfc4b
Tras la SBT Documetation :
Hay dos formas de especificar las credenciales para dicho repositorio:
Inline
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 las llaves dominio, host, usuario y contraseña. Por ejemplo:
realm=Some Nexus Repository Manager
host=my.artifact.repo.net
user=admin
password=password123
Esto funcionó para mí. Estoy usando la versión 0.13.15 SBT:
~/.ivy2/.my-credentials
(host sin puerto):
realm=Sonatype Nexus Repository Manager
host=mynexus.mycompany.com
user=my_user
password=my_password
build.sbt
(url nexo con el 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/")
)
Comprobar si todos los archivos que contienen las credenciales.
Para mí, yo tenía un nuevo proyecto en SBT 1.0 (en lugar de la vieja 0.13), donde tenía un archivo que contiene ~/.sbt/1.0/global.sbt
mis credenciales, que me había olvidado. Así que después de un cambio de contraseña obligatoria, las descargas Artifactory estaba rota y el bloqueo de mi cuenta.
Sería bueno si la cadena de credenciales y archivos llenándolos se puede inspeccionar fácilmente. También sería bueno si SBT era un poco más cuidado y la primera comprobación de si la autenticación / autorización es correcta, antes de iniciar los archivos de descarga tot X y bloquear mi cuenta después de 3 intentos misauthenticated.