在 Jenkins 作业中设置来自 build.sbt 的变量值

Setting the value of a variable from build.sbt in the Jenkins job

我是 Jenkins 和 Sbt 的新手,我想在 build.sbt 中声明的 jenkins 中设置一个变量的值。 为了解释,我正在尝试在 artifactory 存储库中发布 jar。 我有两个存储库,一个用于发布,另一个用于快照。 在 build.sbt 中:

publishTo := Some("Artifactory Realm" at "https://artifactory.mycloud.something.com/artifactory/sbt-handlereleases")
credentials += Credentials(Path.userHome / ".sbt" / ".credentials")
resolvers += "Artifactory" at "https://artifactory.mycloud.something.com/artifactory/sbt-handlereleases/"

在 Jenkins 作业中(构建 > 执行 shell):

sbt clean compile package publish

此代码使我能够在 artifactory 的发布存储库中发布 jar。 但是,如果我想在快照存储库中发布,我将不得不为快照存储库 (https://artifactory.mycloud.something.com/artifactory/sbt-handlesnapshots).

修改 build.sbt 和正确的 url。

我如何在 build.sbt ($URL_REPO) 中设置变量并通过为快照或发布分配 url 来指定它在 jenkins 作业中的值? 任何帮助是极大的赞赏。 谢谢

要定义存储库,您应该使用 publishTo 设置。这是来自 Publishing docs:

的示例
// in build.sbt
publishTo := {
  val nexus = "https://my.artifact.repo.net/"
  if (isSnapshot.value)
    Some("snapshots" at nexus + "content/repositories/snapshots")
  else
    Some("releases"  at nexus + "service/local/staging/deploy/maven2")
}

快照和发布存储库之间的这种切换基于 isSnapshot 设置,通常只检查 version 设置是否具有 -SNAPSHOT 后缀。

如果这适用于您的用例,这就是可行的方法。如果没有,你需要根据一些外部因素(例如你如何触发你的 Jenkins 管道)来切换它,你可以在 Jenkins 中引入一个环境变量并在 publishTo 定义中检查它:

// in build.sbt
publishTo := {
  if (sys.env.get("IS_SNAPSHOT").isDefined)
    Some("snapshots" at "...")
  else
    Some("releases"  at "...")
}

或者如果您想动态设置 URL:

publishTo := sys.env.get("URL_REPO").map{ url =>
  "publishing repository" at url
}