Как получить доступ к защищенному Nexus с помощью sbt? - PullRequest
43 голосов
/ 03 декабря 2010

Я пытаюсь получить доступ к менеджеру репозитория 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, который говорит, что он пытается напрямую, и загрузить jar (после аутентификации).

Я также попытался объявить учетные данные встроенными (даже если они не идеальны) примерно так:

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

Ответы [ 6 ]

70 голосов
/ 25 октября 2013

Вот что я сделал (sbt 0.13 + артефакт - установка должна быть похожа на нексус):

1) Отредактировал файл ~ / .sbt / repositories, как указано здесь: http://www.scala -sbt.org / 0.13.0 / docs / Detail-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) Заблокировал мою артефакту, чтобы отключить анонимный доступ.

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 попадает в артефакт, как обычно.

Причина, по которой я сделал это таким образом, заключается в том, чтобы не допускать определения репозитория и т. Д. К файлам проекта, чтобы обеспечить гибкость командам (они могут настроить внутренний сервер для обслуживания артефактов в процессе выполнения и т. Д.).

-Austen

33 голосов
/ 04 декабря 2010

ОБНОВЛЕНИЕ: Этот ответ не работает в последних версиях sbt - см. Ответ Остина.

Хорошо, я наконец разобрался с этим.

snapshotsName может быть чем угодно. realm в .credentials должен быть областью HTTP-аутентификации, которая появляется при попытке попасть по URL-адресу хранилища (в моем случае это nexus) 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-аутентификации.

5 голосов
/ 28 октября 2016

Если программе запуска SBT не удается загрузить новую версию SBT с вашего прокси-сервера, и ~/.sbt/boot/update.log показывает, что вы получаете 401 ошибку аутентификации, вы можете использовать переменную окружения SBT_CREDENTIALS, чтобы указать, где находится файл учетных данных ivy.

Любой из них должен работать и загрузить новую версию sbt:

  1. SBT_CREDENTIALS='/home/YOUR_USER_NAME/.ivy2/.credentials' sbt
  2. Вставить export SBT_CREDENTIALS="/home/YOUR_USER_NAME/.ivy2/.credentials" в ваш .bashrc (или .zshrc), запустите новый сеанс оболочки и затем запустите sbt

(Вам понадобится настройка файла ~/.ivy2/.credentials, как показано в других ответах)

Источник:https://github.com/sbt/sbt/commit/96e5a7957c830430f85b6b89d7bbe07824ebfc4b

4 голосов
/ 02 июня 2016

Следуя документации SBT :

Существует два способа указать учетные данные для такого хранилища:

Встроенный

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

Внешний файл

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

Файл учетных данных представляет собой файл свойств с ключами realm, host, user и password. Например:

realm=Some Nexus Repository Manager
host=my.artifact.repo.net
user=admin
password=password123
2 голосов
/ 01 ноября 2017

Это сработало для меня. Я использую 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-адрес нексуса с портом):

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/")
)
1 голос
/ 05 июня 2018

Проверить все файлы, содержащие учетные данные.

Для меня у меня был новый проект в sbt 1.0 (вместо старого доброго 0.13), где у меня был ~/.sbt/1.0/global.sbt файл, содержащий мои учетные данные, о которых я забыл. Поэтому после обязательной смены пароля загрузка артефакта была прервана и заблокировала мою учетную запись.

Было бы неплохо, если бы цепочку учетных данных и заполняющих их файлов можно было легко проверить. Было бы также неплохо, если бы SBT был немного более осторожным и сначала проверил правильность аутентификации / авторизации, прежде чем начинать загрузку файлов X и блокировку моей учетной записи после 3 попыток неаутентифицированной аутентификации.

...