使用sbt将工件发布到AWS CodeArtifact

问题描述

我正在尝试使用AWS CodeArtifact将工件发布到sbt,但是遇到了一些麻烦;

给出一个sbt项目,运行命令sbt publish,该软件包已上载到存储库中,但仍处于Unfinished状态。 AWS CodeArtifact documentation说:

未完成:上一次发布尝试未完成。当前,只有Maven软件包版本可以具有未完成状态。当客户端为一个软件包版本上传一个或多个资产,但没有为包含该版本的软件包发布maven-Metadata.xml文件时,就会发生这种情况。

我正在使用sbt版的1.3.3,没有使用插件属性publishMavenStyletrue

我知道sbt-maven-resolverhere回购)解决了这个问题,但是它似乎是“未关注的插件”,而且,使用它,我丢失了有关发布过程的所有日志,不相信。

有人有同样的问题并且以某种方式解决了吗?

解决方法

在SBT中使用CodeArtifact

  1. 使用CodeArtifact设置SBT
  2. 使用SBT发布软件包(还避免了工件处于Unfinished状态。)

1。使用CodeArtifact设置SBT

  1. 使用Maven上游创建CodeArtifact存储库。对于此示例,我们将在域launchops中使用存储库maven-test

  2. 在控制台中打开“连接说明”,然后选择“ mvn”。我们稍后将需要此信息。

  3. 复制从控制台导出“ CODEARTIFACT_AUTH_TOKEN”环境变量的命令,然后在您的环境中运行它。这会将“ CODEARTIFACT_AUTH_TOKEN”设置为我们存储库的密码,用户名始终为aws。

  4. 在build.sbt文件中,导入sbt.Credentials:

     import sbt.{Credentials}
    
  5. 现在我们需要设置凭据。为此,我们首先要读取CODEARTIFACT_AUTH_TOKEN环境变量:

     val repoPass = sys.env.get("CODEARTIFACT_AUTH_TOKEN").getOrElse("")
    
  6. 接下来,我们将使用先前导入的sbt.Credentials设置一组新的凭据:

     credentials += Credentials("launchops/maven-test","launchops-123456789012.d.codeartifact.us-east-1.amazonaws.com","aws",repoPass)
    

传递给Credentials对象的值是(“域名/存储库名称”,“不带协议的存储库主机名”,“用户名”,“密码”),用户名始终为aws,密码始终来自repoPass变量我们只需要修改前两个即可指向我们的存储库。

  1. 现在,我们只需要指示SBT将我们的存储库用作解析器即可。控制台连接说明将生成Maven设置,例如:

     <repository>
     <id>launchops--maven-test</id>
     <url>https://launchops-123456789012.d.codeartifact.us-east-1.amazonaws.com/maven/maven-test/</url>
     </repository>
    

我们将使用这些值在build.sbt文件中创建解析器:

    resolvers += "launchops--maven-test" at "https://launchops-123456789012.d.codeartifact.us-east-1.amazonaws.com/maven/maven-test"

其格式为“控制台中来自maven配置的存储库URL”中的“解析器+ =“来自控制台中maven配置的ID”。

  1. 要完全禁止使用公共Maven存储库(强制使用CodeArtifact),可以将以下行添加到build.sbt文件中:

     externalResolvers := Resolver.combineDefaultResolvers(resolvers.value.toVector,mavenCentral = false)
    

执行完这些设置步骤后,您应该可以运行sbt update并观察通过CodeArtifact下载的软件包。

build.sbt示例以供参考:

import sbt.{Credentials,Path}

name := "scala-test"

version := "0.3.0"

scalaVersion := "2.12.6"

organization := "com.abc.def"

val repoPass = sys.env.get("CODEARTIFACT_AUTH_TOKEN").getOrElse("")
credentials += Credentials("launchops/maven-test",repoPass)

resolvers += "launchops--maven-test" at "https://launchops-123456789012.d.codeartifact.us-east-1.amazonaws.com/maven/maven-test"

libraryDependencies ++= Seq(
        "org.scalatest" %% "scalatest" % "3.0.0" % "test","io.nats" % "jnats" % "2.0.0","org.json4s" %% "json4s-native" % "3.6.0"
)

2。发布程序包

除了提取依赖关系之外,SBT还可以用于发布程序包。要将SBT发布到CodeArtifact,我们首先需要在build.sbt文件中进行设置:

将以下内容添加到文件中:

publishMavenStyle := true
publishTo := Some("launchops--maven-test" at "https://launchops-123456789012.d.codeartifact.us-east-1.amazonaws.com/maven/maven-test")

在这一点上,从技术上讲,运行sbt publish会将程序包推送到CodeArtifact,但是最终将以Unfinished状态运行。我们需要使用sbt-maven-resolver插件来帮助以正确的格式获取软件包:https://github.com/sbt/sbt-maven-resolver

在project / plugins.sbt文件中添加以下行:

addSbtPlugin("org.scala-sbt" % "sbt-maven-resolver" % "0.1.0")

现在,您可以运行sbt publish并将软件包成功发布到CodeArtifact。如果看到错误,请确保您使用的是最新版本的SBT。