web-dev-qa-db-ja.com

sbtでセキュアなNexusにアクセスする方法は?

基本認証が必要な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

これは資格情報の問題であり、他の何かではないことはかなり確信しています.

また、資格情報をインラインで宣言しようとしました(理想的ではありませんが)。

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

私がやったことは次のとおりです(sbt 0.13 +アーティファクト-ネクサスのセットアップは似ているはずです):

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)匿名アクセスを無効にするためにアーティファクトをロックしました。

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をロードすると、通常のようにアーティファクトがヒットします。

このようにした理由は、リポジトリの定義などをプロジェクトファイルに入れないようにして、チームに柔軟性を持たせることです(進行中のアーティファクトなどを処理するために内部サーバーをセットアップできます)。

-オースティン

72
Austen Holmes

更新:この回答は最近のsbtバージョンでは機能しません。代わりにオースティンの回答を参照してください。

さて、私はついにこれを整理しました。

snapshotsNameは任意です。 .credentialsのrealmは、リポジトリ(私の場合はネクサス)のURLにアクセスしようとしたときに表示されるHTTP認証領域でなければなりません。 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認証レルムです。

33
Bryan J Swift

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

5
Jacob Wang

SBT Documetation の後に:

このようなリポジトリの資格情報を指定するには、2つの方法があります。

列をなして

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
luckydonald

これは私のために働いた。私は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/")
)
2
Leonardo Bayona

資格情報を含むすべてのファイルを確認します。

私にとっては、sbt 1.0で(古き良き0.13の代わりに)新しいプロジェクトがあり、~/.sbt/1.0/global.sbt忘れていた資格情報を含むファイル。そのため、パスワードを強制的に変更した後、アーティファクトのダウンロードが破損し、アカウントがロックされました。

資格情報のチェーンとそれらを埋めるファイルを簡単に検査できると便利です。また、SBTがもう少し慎重で、最初に認証/承認が正しいかどうかを確認してから、Xファイルのダウンロードを開始し、3回の誤認証の試行後にアカウントをロックする場合もいいでしょう。

1
dr jerry