Как получить доступ к защищенному Nexus с помощью sbt?
Я пытаюсь получить доступ к менеджеру репозитория Nexus, который требует некоторой базовой проверки подлинности. Все отлично работает с Maven2, но когда я пытаюсь настроить вещи в SBT, он не может найти артефакты. Он использует шаблон пользовательского репозитория (см. этот связанный вопрос), но я не думаю, что это имеет значение. В любом случае соответствующая конфигурация здесь.
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
В соответствии с аналогичным обсуждением в группе пользователей SBT это должно работать нормально, но я получаю следующее, когда пытаюсь построить.
==== 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
Я уверен, что это проблема учетных данных, а не что-то еще, потому что я могу ударить по URL-адресу, в котором говорится, что он пытается напрямую и загрузить банку (после аутентификации).
Я также попробовал объявить учетные данные inline (даже если он меньше идеала):
Credentials.add("Repository Snapshots", "nexusHostIp", "nexususername", "nexuspassword")
Ответы
Ответ 1
Вот что я сделал (sbt 0.13 + artifactory - настройка должна быть похожа на нексус):
1) Отредактировал файл ~/.sbt/repositories, как указано здесь: 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) Заблокировал мой artifactory, чтобы отключить анонимный доступ.
3) Создал файл учетных данных в ~/.sbt/.credentials
realm=Artifactory Realm
host=artifactory.mycompany.com
user=username
password=password
4) Создал файл под ~/.sbt/0.13/plugins/credentials.sbt, который связывает учетные данные по умолчанию
credentials += Credentials(Path.userHome / ".sbt" / ".credentials")
Теперь, когда мой проект загружает sbt, нажмите artifactory как обычно.
Причина, по которой я делал это, заключается в том, чтобы сохранить определения хранилища и т.д. из файлов проекта, чтобы позволить группам иметь гибкость (они могут настроить внутренний сервер для обслуживания прогрессивных артефактов и т.д.).
-Austen
Ответ 2
ОБНОВЛЕНИЕ: этот ответ не работает в последних версиях sbt - см. вместо ответа Austen.
Хорошо, я наконец-то выяснил это.
snapshotsName
может быть что угодно. realm
в .credentials должен быть область аутентификации HTTP, которая появляется при попытке попасть в URL-адрес репозитория (связь в моем случае). realm
также является первым параметром Credentials.add
. Так что эта строка должна была быть
Credentials.add("Sonatype Nexus Repository Manager", "nexusHostIp", "nexususername", "nexuspassword")
Имя хоста - это только имя ip или DNS. Таким образом, в .credentials host
находится только nexusHostIp
без номера порта.
Таким образом, рабочая конфигурация проекта:
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")
С файлом .credentials, который выглядит так:
realm=Sonatype Nexus Repository Manager
host=nexusHostIp
user=nexususername
password=nexuspassword
Где "Sonatype Nexus Repository Manager" является областью аутентификации HTTP.
Ответ 3
Следуя SBT Documetation:
Существует два способа указать учетные данные для такого репозитория:
Инлайн
credentials += Credentials("Some Nexus Repository Manager", "my.artifact.repo.net", "admin", "password123")
Внешний файл
credentials += Credentials(Path.userHome / ".ivy2" / ".credentials")
Файл учетных данных - это файл свойств с областями ключей, хостом, пользователем и паролем. Например:
realm=Some Nexus Repository Manager
host=my.artifact.repo.net
user=admin
password=password123
Ответ 4
Если пусковая установка SBT не загружает новую версию SBT из вашего прокси-сервера и что ~/.sbt/boot/update.log
показывает, что вы получаете ошибки проверки подлинности 401, вы можете использовать переменную среды SBT_CREDENTIALS, чтобы указать, где находится файл удостоверения плюща.
Любой из них должен работать и загружать новую версию sbt:
-
SBT_CREDENTIALS='/home/YOUR_USER_NAME/.ivy2/.credentials' sbt
- Поместите
export SBT_CREDENTIALS="/home/YOUR_USER_NAME/.ivy2/.credentials"
в .bashrc
(или .zshrc
), запустите новый сеанс оболочки и запустите sbt
(Вам понадобится установка файла ~/.ivy2/.credentials
, как показано здесь, другие ответы)
Источник: https://github.com/sbt/sbt/commit/96e5a7957c830430f85b6b89d7bbe07824ebfc4b
Ответ 5
Это сработало для меня. Я использую версию SBT 0.13.15:
~/.ivy2/.my-credentials
(хост без порта):
realm=Sonatype Nexus Repository Manager
host=mynexus.mycompany.com
user=my_user
password=my_password
build.sbt
(URL-адрес nexus с портом):
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/")
)