如何使用 sbt 访问安全的 Nexus?
Posted
技术标签:
【中文标题】如何使用 sbt 访问安全的 Nexus?【英文标题】:How to access a secured Nexus with sbt? 【发布时间】:2011-05-19 22:15:13 【问题描述】:我正在尝试访问需要一些基本身份验证的 Nexus 存储库管理器。 Maven2 一切正常,但是当我尝试在 SBT 中配置东西时,它找不到工件。它使用自定义存储库模式(请参阅this related question),但我认为这无关紧要。无论如何,相关的配置都在这里。
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
根据a similar discussion in the SBT user group,这应该可以正常工作,但是当我尝试构建时会得到以下结果。
==== 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")
【问题讨论】:
【参考方案1】:这就是我所做的(sbt 0.13 + artifactory - nexus 的设置应该类似):
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 会像平常一样命中工件。
我这样做的原因是将存储库定义等保留在项目文件之外,以使团队具有灵活性(他们可以设置内部服务器来提供正在进行的工件等)。
-奥斯汀
【讨论】:
如果是nexus,领域应该配置为Sonatype Nexus Repository Manager
。
它对我有用,但我不明白“凭据”如何在不指定端口的情况下工作:我的 Nexus 实例正在侦听端口 8082。事实上,我在“publishTo”中指定了端口:=..." 部分。我在这里错过了什么?
在sbt根据build.properties更新自己的情况下不起作用
为了解决这个问题,我已将公共 ivy 存储库添加到存储库文件作为最后一个要检查的存储库:public-ivy-releases: https://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
如果我在规定的文件夹中创建credentials.sbt
,它不起作用,但如果我把它放在一个文件夹(~/.sbt/0.13/credentials.sbt
)上,它就可以。【参考方案2】:
更新:此答案在最近的 sbt 版本中不起作用 - 请参阅奥斯汀的答案。
好吧,我终于解决了这个问题。
snapshotsName
可以是任何东西。 .credentials 中的realm
必须是在尝试访问存储库的 URL 时显示的 HTTP 身份验证领域(在我的例子中是 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 身份验证领域。
【讨论】:
【参考方案3】:关注SBT Documetation:
有两种方法可以为此类存储库指定凭据:
内联
credentials += Credentials("Some Nexus Repository Manager", "my.artifact.repo.net", "admin", "password123")
外部文件
credentials += Credentials(Path.userHome / ".ivy2" / ".credentials")
.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 指定 ivy 凭证文件的位置.
其中任何一个都应该可以工作并下载新的 sbt 版本:
SBT_CREDENTIALS='/home/YOUR_USER_NAME/.ivy2/.credentials' sbt
将export SBT_CREDENTIALS="/home/YOUR_USER_NAME/.ivy2/.credentials"
放入您的.bashrc
(或.zshrc
),启动一个新的shell 会话,然后运行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):
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/")
)
【讨论】:
【参考方案6】:检查所有包含凭据的文件。
对我来说,我在 sbt 1.0(而不是旧的 0.13)中有一个新项目,其中有一个包含我的凭据的 ~/.sbt/1.0/global.sbt
文件,但我忘记了。因此,在强制更改密码后,神器下载被破坏并锁定了我的帐户。
如果可以轻松检查凭据链和填充它们的文件,那就太好了。如果 SBT 更加小心一点,在开始下载 X 文件并在 3 次错误身份验证尝试后锁定我的帐户之前首先检查身份验证/授权是否正确,那也会很好。
【讨论】:
以上是关于如何使用 sbt 访问安全的 Nexus?的主要内容,如果未能解决你的问题,请参考以下文章
使用 sbt.version 1.2.8 发布到 nexus 的 Sbt 插件无法由使用 sbt.version >1.2.8 的 sbt 项目解决
使用 Sbt-native-packager 将 fat.jar + 外部文件创建到单个 tar.gz 文件中以在我的 Nexus 上发布