web-dev-qa-db-fra.com

SBT ne parvient pas à trouver les informations d'identification lors d'une tentative de téléchargement à partir d'un référentiel virtuel Artifactory

J'essaie d'exécuter SBT derrière un pare-feu d'entreprise. Une autre équipe a configuré un proxy Artifactory. Ce proxy fonctionne très bien avec un accès anonyme activé, mais lorsque nous lui demandons un mot de passe, il commence à mal tourner.

Lorsque j'exécute SBT sur mon poste de travail, j'obtiens l'erreur suivante:

[error] Unable to find credentials for [Artifactory Realm @ coderepo.xxx.amrs.bigco.com]

Le résultat de ceci est que je ne peux pas bootstrap sbt:

[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: org.scala-lang#scala-library;2.10.6: not found
[warn]  :: org.scala-sbt#sbt;0.13.12: not found
[warn]  :: org.scala-lang#scala-compiler;2.10.6: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::

J'ai essayé de mettre un fichier .credentials dans ~/.sbt et aussi ~/.ivy2: j'ai testé des variations sur les éléments suivants, qui ne fonctionnent pas tous:

realm=Artifactory Realm @ coderepo.xxx.amrs.bigco.com
Host=coderepo.xxx.amrs.bigco.com
user=<username>
password=<pwd>

Je suppose que cette erreur signifie qu'il n'a pas été en mesure de localiser une définition d'informations d'identification correspondant au domaine, j'ai donc essayé un certain nombre de versions de la première ligne dans les deux emplacements:

realm=Artifactory Realm
realm=[Artifactory Realm @ coderepo.xxx.amrs.bigco.com]
realm=coderepo.xxx.amrs.bigco.com

Aucun d'entre eux ne semble avoir d'impact du tout.

Alors, quelle est la bonne façon d'autoriser SBT à s'authentifier avec un nom d'utilisateur et un mot de passe dans un référentiel Artifactory protégé par mot de passe?

UPDATE0 : Selon la documentation Ivy, le nom de domaine le plus probable est simplement "Domaine artificiel". Selon la documentation SBT, l'emplacement par défaut correct du fichier d'informations d'identification doit être% USERPROFILE% /. Sbt/.credentials (oui, j'utilise Windows). Même après avoir supprimé le fichier .credentials dans mon répertoire .ivy2, cela ne fonctionne toujours pas.

UPDATE1 : pertinent mais pas vraiment utile:

UPDATE2 : Je commence à soupçonner qu'il s'agit d'un bogue dans sbt - J'ai ajouté un problème ici: https: // github.com/sbt/sbt/issues/2817

12
Salim Fadhley

Voir cette question pour plus de détails sur la configuration des informations d'identification globales.

Pour résumer:

Si vous devez démarrer SBT à partir d'un référentiel proxy, définissez la propriété système sbt.boot.credentials pour pointer vers votre fichier d'informations d'identification. Vous pouvez le faire dans votre %CSIDL_PROGRAM_FILESX86%/sbt/conf/sbtconfig.txt, par exemple:

-Dsbt.boot.credentials=/Users/my-user-name/.sbt/credentials

Vous pouvez également utiliser le SBT_CREDENTIALS variable d'environnement dans le même but.

Pour Artifactory, le domaine du fichier credentials doit être défini sur:

realm=Artifactory Realm

Pour authentifier la récupération des artefacts de dépendance, créez un fichier comme %USERPROFILE%/.sbt/0.13/plugins/my-credentials.sbt avec un paramètre credentials. Par exemple:

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

Je pense que l'emplacement par défaut de ce fichier est ${HOME}/.sbt/<sbt-version>/.credentials; bien que j'espère qu'il existe une documentation publiée à ce sujet, je l'ai confirmé en cliquant dans le code.
@ salim-fadhley, il semble que la version SBT vous manque dans le chemin.

EDIT: Vous devez ajouter DefaultOptions.addCredentials à votre build.sbt; vous pouvez ensuite vérifier ce que SBT ramasse avec show credentials.

Mis à part l'emplacement des fichiers, il semble y avoir une confusion entre les noms de référentiel (ne signifie rien) et les domaines de sécurité (signifie tout).

Le défi d'authentification qui revient du serveur de référentiel inclura le nom du domaine de sécurité ; en tant que client/développeur, vous n'avez aucun contrôle sur ce que c'est et je suppose qu'il doit correspondre au domaine que vous (client/développeur) spécifiez dans votre .credentials fichier (où que ce soit).

Pendant ce temps, le nom du référentiel (comme indiqué dans build.sbt) ne signifie en fait rien pour quiconque en dehors du développement du projet correspondant, par exemple les administrateurs du serveur de référentiel ne pouvaient pas se soucier d'un projet à l'autre.

3
Darren Bishop