Подтвердить что ты не робот

Как получить доступ к защищенному 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")
4b9b3361

Ответ 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/")
)