web-dev-qa-db-fra.com

Comment accéder à un Nexus sécurisé avec sbt?

J'essaie d'accéder à un gestionnaire de référentiel Nexus qui nécessite une authentification de base. Tout fonctionne bien depuis Maven2, mais lorsque j'essaie de configurer les choses dans SBT, il ne trouve pas les artefacts. Il utilise un modèle de référentiel personnalisé (voir cette question connexe ) mais je ne pense pas que cela devrait avoir d'importance. Dans tous les cas, la configuration appropriée est ici.

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

Selon ne discussion similaire dans le groupe d'utilisateurs SBT cela devrait fonctionner correctement mais j'obtiens ce qui suit lorsque j'essaye de construire.

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

Je suis à peu près certain que c'est un problème d'informations d'identification et pas autre chose car je peux frapper l'URL, il dit qu'il essaie directement et télécharger le pot (après l'authentification).

J'ai également essayé de déclarer les informations d'identification en ligne (même si ce n'est pas idéal) comme ceci:

Credentials.add("Repository Snapshots", "nexusHostIp", "nexususername", "nexuspassword")
43
Bryan J Swift

Voici ce que j'ai fait (sbt 0.13 + artifactory - la configuration devrait être similaire pour nexus):

1) Édité le fichier ~/.sbt/repositories comme spécifié ici: 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) Verrouillé mon artificiel pour désactiver l'accès anonyme.

3) Création d'un fichier d'informations d'identification dans ~/.sbt/.credentials

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

4) Création d'un fichier sous ~/.sbt/0.13/plugins/credentials.sbt qui relie les informations d'identification par défaut

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

Maintenant, lorsque mon projet se charge, sbt atteint un artificiel comme d'habitude.

La raison pour laquelle je l'ai fait de cette façon est de garder les définitions du référentiel, etc., hors des fichiers de projet pour permettre aux équipes d'avoir de la flexibilité (elles peuvent configurer un serveur interne pour servir les artefacts en cours, etc.).

-Austen

72
Austen Holmes

MISE À JOUR: Cette réponse ne fonctionne pas dans les versions récentes de sbt - voir plutôt la réponse d'Austen.

D'accord, j'ai finalement réussi à régler ce problème.

snapshotsName peut être n'importe quoi. realm in .credentials doit être le domaine d'authentification HTTP qui s'affiche lorsque vous essayez d'appuyer sur l'URL du référentiel (nexus dans mon cas). realm est également le premier paramètre de Credentials.add. Donc, cette ligne aurait dû être

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

Le nom d'hôte est simplement le nom IP ou DNS. Donc dans .credentials Host est juste nexusHostIp sans le numéro de port.

La configuration de travail du projet est donc:

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

Avec un fichier .credentials qui ressemble à:

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

Où "Sonatype Nexus Repository Manager" est le domaine d'authentification HTTP.

33
Bryan J Swift

Si le lanceur SBT ne parvient pas à télécharger une nouvelle version de SBT à partir de votre proxy, et que ~/.sbt/boot/update.log indique que vous obtenez des erreurs d'authentification 401, vous pouvez utiliser la variable d'environnement SBT_CREDENTIALS pour spécifier l'emplacement du fichier d'informations d'identification ivy.

L'un ou l'autre devrait fonctionner et télécharger la nouvelle version de sbt:

  1. SBT_CREDENTIALS='/home/YOUR_USER_NAME/.ivy2/.credentials' sbt
  2. En mettant export SBT_CREDENTIALS="/home/YOUR_USER_NAME/.ivy2/.credentials" dans ton .bashrc (ou .zshrc), démarrez une nouvelle session Shell, puis exécutez sbt

(Vous aurez besoin du ~/.ivy2/.credentials configuration du fichier comme d'autres réponses ici ont montré)

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

5
Jacob Wang

Après la SBT Documetation :

Il existe deux façons de spécifier les informations d'identification pour un tel référentiel:

En ligne

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

Fichier externe

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

Le fichier d'informations d'identification est un fichier de propriétés avec le domaine des clés, l'hôte, l'utilisateur et le mot de passe. Par exemple:

realm=Some Nexus Repository Manager
Host=my.artifact.repo.net
user=admin
password=password123
4
luckydonald

Cela a fonctionné pour moi. J'utilise la version 0.13.15 de SBT:

~/.ivy2/.my-credentials (Hôte sans port):

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

build.sbt (URL nexus avec 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/")
)
2
Leonardo Bayona

Vérifiez tous les fichiers contenant des informations d'identification.

Pour moi, j'avais un nouveau projet dans sbt 1.0 (au lieu du bon vieux 0.13), où j'avais un ~/.sbt/1.0/global.sbt fichier contenant mes informations d'identification, que j'ai oublié. Ainsi, après un changement de mot de passe obligatoire, les téléchargements artificiels ont été interrompus et ont bloqué mon compte.

Ce serait bien si la chaîne d'informations d'identification et les fichiers qui les remplissaient pouvaient être facilement inspectés. Ce serait aussi bien si SBT était un peu plus prudent et vérifiait d'abord si l'authentification/l'autorisation est correcte, avant de commencer à télécharger les fichiers X et de verrouiller mon compte après 3 tentatives mal authentifiées.

1
dr jerry