使用 sbt 将工件发布到 AWS CodeArtifact

问题描述 投票:0回答:3

我正在尝试使用

AWS CodeArtifact
将工件发布到
sbt
,但我遇到了一些麻烦;

给定一个

sbt
项目,运行命令
sbt publish
包被上传到 repo 但它仍然处于
Unfinished
状态。 AWS CodeArtifact 文档 说:

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

我使用

sbt
版本
1.3.3
,我没有使用插件,属性
publishMavenStyle
true
.

我知道

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

有没有人遇到同样的问题并以某种方式解决了它?

amazon-web-services maven sbt publishing aws-codeartifact
3个回答
12
投票

将 CodeArtifact 与 SBT 结合使用

  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"

这个格式是“resolvers +=”ID From maven configuration in console at “Repository URL from maven configuration in console”。

  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", "launchops-123456789012.d.codeartifact.us-east-1.amazonaws.com", "aws", 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。


0
投票

您可以在不使用 sbt-maven-resolver 插件的情况下通过遵循 shariqmaws 的回答而不使用插件来实现相同的目的。

发布将导致工件处于“未发布”状态。

然后使用aws codeartifact cli发布它(https://docs.aws.amazon.com/codeartifact/latest/ug/maven-curl.html


0
投票

对我有用的是添加到 project/plugins.sbt:

libraryDependencies += Defaults.sbtPluginExtra("org.scala-sbt" % "sbt-maven-resolver" % sbtVersion.value,
  sbtBinaryVersion.value, scalaBinaryVersion.value)
© www.soinside.com 2019 - 2024. All rights reserved.