Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to access a secured Nexus with sbt?

Tags:

sbt

nexus

ivy

I'm trying to access a Nexus repository manager which requires some basic authentication. Everything works fine from Maven2 but when I try to configure things in SBT it can't find the artifacts. It is using a custom repository pattern (see this related question) but I don't think that should matter. In any case the relevant configuration is here.

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 

According to a similar discussion in the SBT user group this should work fine but I am getting the following when I try to build.

==== 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 

I'm fairly certain this is a credentials problem and not something else because I can hit the URL it says it is trying directly and download the jar (after authenticating).

I have also tried declaring the credentials inline (even though it is less than ideal) like so:

Credentials.add("Repository Snapshots", "nexusHostIp", "nexususername", "nexuspassword") 
like image 759
Bryan J Swift Avatar asked Dec 03 '10 18:12

Bryan J Swift


People also ask

How do I access Nexus repository?

Available in Nexus Repository OSS and Nexus Repository Pro Users with the nx-repository-view Privilege can access the left navigation item. Click on the Browse button in the main toolbar and then the left navigation Browse item to access the Browse feature.

How do I add Nexus repository to jar?

Click on "Browse Repositories," and you'll see a list of repositories. You will want to right click on the "3rd Party" repository and choose "Upload Artifact." You will then see an "Upload Artifact" form. Choose the JAR to upload, then populate the group id, artifact id, version, and other fields.

What is Nexus Artifact repository?

Nexus Repository OSS is an open source repository that supports many artifact formats, including Docker, Java™, and npm. With the Nexus tool integration, pipelines in your toolchain can publish and retrieve versioned apps and their dependencies by using central repositories that are accessible from other environments.

Is Nexus a binary repository?

"We have had good experience with Nexus as a our binary repository. Because nexus caches all JAR packages form 3rd party repositories, our build are stable and are unaffected if a 3rd party repository is down."


2 Answers

Here's what I did (sbt 0.13 + artifactory - setup should be similar for nexus):

1) Edited the file ~/.sbt/repositories as specified here: 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) Locked down my artifactory to disable anonymous access.

3) Created a credentials file in ~/.sbt/.credentials

realm=Artifactory Realm host=artifactory.mycompany.com user=username password=password 

4) Created a file under ~/.sbt/0.13/plugins/credentials.sbt that wires up the default credentials

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

Now when my project loads sbt hits artifactory like normal.

The reason I did it this way is to keep the repository definitions, etc, out of the project files to enable teams to have flexibility (they can set up an internal server to serve in-progress artifacts, etc).

-Austen

like image 193
Austen Holmes Avatar answered Oct 07 '22 06:10

Austen Holmes


UPDATE: This answer does not work in recent sbt versions - see Austen's answer instead.

Alright I finally got this sorted out.

snapshotsName can be anything. realm in .credentials must be the HTTP Authentication realm that shows up when trying to hit the URL of the repository (nexus in my case). realm is also the first parameter of Credentials.add. So that line should have been

Credentials.add("Sonatype Nexus Repository Manager", "nexusHostIp", "nexususername", "nexuspassword") 

The host name is just the ip or DNS name. So in .credentials host is just nexusHostIp without the port number.

So the working Project configuration is:

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") 

With a .credentials file that looks like:

realm=Sonatype Nexus Repository Manager host=nexusHostIp user=nexususername password=nexuspassword 

Where "Sonatype Nexus Repository Manager" is the HTTP Authentication realm.

like image 32
Bryan J Swift Avatar answered Oct 07 '22 06:10

Bryan J Swift