Come accedere a un Nexus protetto con sbt?

Sto cercando di accedere a un gestore di repository Nexus che richiede alcune autenticazioni di base. Tutto funziona bene da Maven2 ma quando provo a configurare le cose in SBT non riesco a trovare gli artefatti. Sta usando un modello di repository personalizzato (vedi questa domanda correlata ) ma non penso che dovrebbe essere importante. In ogni caso la configurazione rilevante è qui.

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 

Secondo una discussione simile nel gruppo di utenti SBT, questo dovrebbe funzionare bene, ma sto cercando di build quanto segue.

 ==== 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 

Sono abbastanza certo che si tratta di un problema di credenziali e non di qualcos’altro perché posso raggiungere l’URL che dice che sta provando direttamente e scaricare il jar (dopo l’autenticazione).

Ho anche provato a dichiarare le credenziali in linea (anche se non è l’ideale) in questo modo:

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

Ecco cosa ho fatto (sbt 0.13 + artifactory – setup dovrebbe essere simile per nexus):

1) Modificato il file ~ / .sbt / repository come specificato qui: 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) Bloccato il mio artifactory per disabilitare l’accesso anonimo.

3) Creato un file di credenziali in ~ / .sbt / .credentials

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

4) Creato un file sotto ~ / .sbt / 0.13 / plugins / credentials.sbt che collega le credenziali predefinite

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

Ora, quando il mio progetto carica sbt colpi come normale.

La ragione per cui l’ho fatto in questo modo è di mantenere le definizioni del repository, ecc., Dai file di progetto per consentire ai team di avere flessibilità (possono configurare un server interno per servire artefatti in corso, ecc.).

-Austen

AGGIORNAMENTO: questa risposta non funziona nelle versioni di sbt recenti – vedi invece la risposta di Austen.

Bene, finalmente ho risolto questo problema.

snapshotsName può essere qualsiasi cosa. realm in .credentials deve essere il realm di autenticazione HTTP che viene visualizzato quando si tenta di colpire l’URL del repository (nexus nel mio caso). realm è anche il primo parametro di Credentials.add . Quindi quella linea avrebbe dovuto essere

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

Il nome host è solo l’ip o il nome DNS. Quindi in .credentials host è solo nexusHostIp senza il numero di porta.

Quindi la configurazione del progetto di lavoro è:

 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 file .credentials che assomiglia a:

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

Dove “Sonatype Nexus Repository Manager” è il dominio di autenticazione HTTP.

Seguendo la documentazione SBT :

Esistono due modi per specificare le credenziali per tale repository:

In linea

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

File esterno

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

Il file delle credenziali è un file delle proprietà con le chiavi realm, host, utente e password. Per esempio:

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

Se l’avvio di SBT non riesce a scaricare una nuova versione di SBT dal proprio proxy e quel ~/.sbt/boot/update.log mostra che si stanno ottenendo errori di autenticazione 401, è ansible utilizzare la variabile d’ambiente SBT_CREDENTIALS per specificare dove il file delle credenziali ivy è.

Ognuno di questi dovrebbe funzionare e scaricare la nuova versione di sbt:

  1. SBT_CREDENTIALS='/home/YOUR_USER_NAME/.ivy2/.credentials' sbt
  2. Mettere l’ export SBT_CREDENTIALS="/home/YOUR_USER_NAME/.ivy2/.credentials" nel tuo .bashrc (o .zshrc ), avviare una nuova sessione di shell e quindi eseguire sbt

(Avrai bisogno della configurazione del file ~/.ivy2/.credentials come mostrato in altre risposte qui)

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

Questo ha funzionato per me. Sto usando la versione 0.13.15 di SBT:

~/.ivy2/.my-credentials (host senza porta):

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

build.sbt (nexus url con port):

 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/") ) 

Controlla tutti i file contenenti le credenziali.

Per me ho avuto un nuovo progetto in SBT 1.0 (invece del buon vecchio 0.13), dove avevo un file ~/.sbt/1.0/global.sbt contenente le mie credenziali, di cui mi ero dimenticato. Quindi, dopo una modifica obbligatoria della password, i download di artefatti sono stati interrotti e il blocco del mio account.

Sarebbe bello se la catena di credenziali e file che li riempiono possano essere facilmente controllati. Sarebbe anche bello se SBT fosse un po ‘più attento e prima verificasse se l’autenticazione / authorization è corretta, prima di iniziare a scaricare i file X e bloccare il mio account dopo 3 tentativi non autenticati.