Artifactory returns 409 for pom when 运行 sbt publish

Artifactory returns 409 for pom when running sbt publish

我正在尝试将项目发布到人工 Maven 存储库,但出现以下错误(409 冲突):

[error] (kamon-cloudwatch/*:publish) java.io.IOException: PUT operation to URL https://[org].artifactoryonline.com/[org]/libs-release-local/kamon-cloudwatch/kamon-cloudwatch_2.11/0.6.5-SNAPSHOT/kamon-cloudwatch_2.11-0.6.5-SNAPSHOT.pom failed with status code 409: Conflict

这是我 build.sbt

的相关部分
publishTo := sys.env.get("BUILD_NUMBER")
    .map(_ => Some("Artifactory Realm" at "https://[org].artifactoryonline.com/[org]/libs-snapshot-local;build.timestamp=" + new java.util.Date().getTime))
    .getOrElse(Some("Artifactory Realm" at "https://[org].artifactoryonline.com/[org]/libs-release-local")),
credentials += Credentials(
  "Artifactory Realm",
  "[org].artifactoryonline.com",
  sys.env.get("ARTIFACTORY_USER").getOrElse(""),
  sys.env.get("ARTIFACTORY_KEY").getOrElse("")
)

涉及在人工方面修改设置的解决方案不是一个选项,因为我不是存储库的管理员。

(也不介意存储凭据的更好解决方案)

原来 artifactory 不喜欢我的发行版中的 -SNAPSHOT。这是我最后做的:

version := "0.6.5" + sys.env.get("BUILD_NUMBER").map("." + _ + "-SNAPSHOT").getOrElse(""),

publishTo := {
  if (isSnapshot.value) {
    Some("Artifactory Realm" at "https://[org].artifactoryonline.com/[org]/libs-snapshot-local")
  } else {
    Some("Artifactory Realm" at "https://[org].artifactoryonline.com/[org]/libs-release-local")
  }
},
credentials += Credentials(Path.userHome / ".ivy2" / ".credentials")

我的发布版本将 $BUILD_NUMBER 留空,因此没有版本号或 -SNAPSHOT,所以它现在可以工作了。

.credentials 文件如下所示:

realm=Artifactory Realm
host=[org].artifactoryonline.com
user=[user]
password=[api-key]

实际上,这是您可以配置的 Artifactory 中 Maven/SBT 存储库的设置。请尝试通过转到 Admin->Repositories->Local 然后单击您尝试部署到的 Maven 存储库来编辑存储库。然后,只需选中 "Handle Snapshots" 复选框以在该存储库中启用快照,或选中 "Handle Releases" 以允许发布,或两者都没有限制。

作为第二条评论的旁注,您还可以将凭据直接配置到 build.sbt 而不是像您那样设置环境变量,下面是一个示例:

publishTo := Some("Artifactory Realm" at "http://localhost:8081/artifactory/") credentials += Credentials("Artifactory Realm", "localhost", "admin", "password")

其中admin 是用户,password 是密码。请注意,在文件中存储纯文本(或 encrypted/api 密钥)密码存在潜在的安全风险。但是,这由您决定管理安全性的最佳方式。