maven 使用sbt将工件发布到AWS CodeArtifact

gwbalxhn  于 2023-05-06  发布在  Maven
关注(0)|答案(3)|浏览(226)

我尝试使用sbt将工件发布到AWS CodeArtifact,但遇到了一些问题;
给定一个sbt项目,运行命令sbt publish,包被上传到repo,但它仍然处于Unfinished状态。AWS CodeArtifact文档说:

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

我使用的是1.3.3版本的sbt,我没有使用插件,属性publishMavenStyletrue
我知道sbt-maven-resolverhere仓库)解决了这个问题,但它似乎是一个“未关注的插件”,而且,使用它我失去了所有关于发布过程的日志,我不相信它。
有没有人遇到过同样的问题,并以某种方式解决了这个问题?

yx2lnoni

yx2lnoni1#

使用CodeArtifact和SBT

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

1.使用CodeArtifact设置SBT

1.使用Maven上游创建CodeArtifact存储库。在这个例子中,我们将在域启动中使用repository maven-test
1.在控制台中打开连接说明并选择mvn。我们稍后会需要这方面的信息。
1.从控制台复制导出“CODEARTIFACT_AUTH_TOKEN”环境变量的命令,并在您的环境中运行它。这将设置“CODEARTIFACT_AUTH_TOKEN”作为我们的存储库的密码,用户名始终是aws。
1.在build.sbt文件中导入sbt.Credentials:

import sbt.{Credentials}

1.现在我们需要设置凭据。为此,我们首先要读取CODEARTIFACT_AUTH_TOKEN环境变量:

val repoPass = sys.env.get("CODEARTIFACT_AUTH_TOKEN").getOrElse("")

1.接下来,我们将使用之前导入的sbt.Credentials设置一组新的Credentials:

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

传递给Credentials对象的值是(“domain-name/repository-name”,“repository hostname without protocol”,“username”,“password”),username始终是aws,password来自repoPass变量,我们只需要修改前两个来指向我们的repository。
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。

ipakzgxi

ipakzgxi2#

你可以在不使用sbt-maven-resolver插件的情况下通过以下shariqmaws的答案来实现同样的效果。
发布将导致工件处于“未发布”状态。
然后使用aws codeartifact cli发布它(https://docs.aws.amazon.com/codeartifact/latest/ug/maven-curl.html

kpbwa7wx

kpbwa7wx3#

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

libraryDependencies += Defaults.sbtPluginExtra("org.scala-sbt" % "sbt-maven-resolver" % sbtVersion.value,
  sbtBinaryVersion.value, scalaBinaryVersion.value)

相关问题