使用sbt将构件发布到AWS CodeArtifact

5
我正在尝试使用sbt将构件发布到AWS CodeArtifact,但遇到了一些问题;在sbt项目中运行sbt publish命令后,该包被上传到存储库,但仍处于未完成状态。 AWS CodeArtifact documentation指出:

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

我正在使用sbt 1.3.3版本,没有使用插件,属性publishMavenStyletrue
我知道 sbt-maven-resolver这里的仓库)可以解决这个问题,但它似乎是一个“未跟踪的插件”,而且使用它会丢失有关发布过程的所有日志,我不信任它。
有没有人遇到过相同的问题,并找到了解决方法?
3个回答

13

使用 CodeArtifact 和 SBT

  1. 设置 SBT 和 CodeArtifact
  2. 使用 SBT 发布包(同时避免将构件处于“未完成”状态)

1. 设置 SBT 和 CodeArtifact

  1. 创建一个具有 Maven 上游的 CodeArtifact 存储库。在此示例中,我们将使用域名 launchops 中的存储库 maven-test。

  2. 打开控制台中的连接说明并选择 mvn。稍后我们需要从中获取信息。

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

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

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

  •  val repoPass = sys.env.get("CODEARTIFACT_AUTH_TOKEN").getOrElse("")
    
  • 接下来,我们将使用之前导入的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 += "从maven配置中获取的ID在控制台中" at "从maven配置中获取的仓库URL在控制台中"。

    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,但是它将以未完成的状态结束。我们需要使用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。


    我一定漏掉了什么,因为在尝试发布时出现了错误: org.eclipse.aether.deployment.DeploymentException: Failed to deploy artifacts Server redirected too many times (20) 检查生成的pom文件时,我注意到id没有遵循{domain}--{repository}模式,而是只有<id>{domain}{repository}</id>。 这可能是问题所在吗? - refaktor
    我添加了文件 project/mvn.sbt,并加入了以下内容 addMavenResolverPlugin,然后问题得到了解决。 - zperee
    我也尝试过这个,但是我无法使用addMavenResolverPlugin - 遇到了以下问题:sbt.librarymanagement.ResolveException: Error downloading org.scala-sbt:sbt-maven-resolver;sbtVersion=1.0;scalaVersion=2.12:1.5.5 - Alex Eftimie
    发布设置插件与库有所不同吗?因为对于库,它可以正常工作,但是对于插件,我需要使用addSbtPlugin("com.myorg" % "my-plugin-name" % "0.0.39")导入,但在CodeArtifact中找不到它。@shariqmaws - JohnBigs

    0

    0

    对我有效的方法是在project/plugins.sbt中添加:

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

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接