4

我有一个 SBT 项目和一个 CD 管道,我想要执行以下步骤序列:

  1. 从 git repo 签出我的项目
  2. 标记提交
  3. 运行测试
  4. 打包我的应用

现在,我还不想发布任何东西,因为我会将二进制文件提升到另一个环境以运行端到端测试。只有当它们成功完成时,我才会想要推送 git 标签并将我的人工制品上传到远程人工制品存储库。我真正想要实现的是能够首先运行sbt prepereRelease,然后我将提升到我的 TEST 环境,然后,如果一切顺利,运行sbt doRelease. 所以我想要在我的 build.sbt 中有类似的东西:

releaseProcess := Seq[ReleaseStep](
      checkSnapshotDependencies,
      inquireVersions,
      runClean,
      runTest,
      setReleaseVersion,
      commitReleaseVersion,
      tagRelease,
      setNextVersion,
      commitNextVersion
)

commands += Command.command("prepareRelease")((state:State) => {
  val newState = Command.process("release",state)
  println("Release called from prepareRelease...")
  newState
})

releaseProcess := Seq[ReleaseStep](
      publishArtifacts,
      setNextVersion,
      commitNextVersion,
      pushChanges
)

commands += Command.command("doRelease")((state:State) => {
  val newState = Command.process("release",state)
  println("Release called from doRelease...")
  newState
})

我几乎觉得我必须定义两个自定义命令,每个命令都必须sbt-release使用不同的设置从插件调用原始发布命令releaseProcess——这就是我不知道该怎么做的地方。不幸的是,上述设置将不起作用,因为releaseProcess设置会累积步骤,并且您仍然会一次执行所有步骤。

4

2 回答 2

1

我最终实现它的方式是创建两个自定义命令并将releaseProcess设置附加到state我然后传递给release插件的对象:

// Defines the release process
releaseIgnoreUntrackedFiles := true

commands += Command.command("prepareRelease")((state: State) => {
  println("Preparing release...")
  val extracted = Project extract state
  val customState = extracted.append(Seq(releaseProcess := Seq[ReleaseStep](
    checkSnapshotDependencies,
    inquireVersions,
    runClean,
    setReleaseVersion,
    commitReleaseVersion,
    tagRelease,
    runTest
  )), state)
  val newState = Command.process("release with-defaults", customState)
  Command.process("dist", newState)
})

commands += Command.command("completeRelease")((state: State) => {
  println("Completing release...")
  val extracted = Project extract state
  val customState = extracted.append(Seq(releaseProcess := Seq[ReleaseStep](
    inquireVersions,
    setNextVersion,
    commitNextVersion,
    pushChanges
  )), state)
  val newState = Command.process("release with-defaults", customState)
  newState
})

所以我的管道做了类似于以下的事情:

  1. sbt prepareRelease

  2. 此时我将二进制文件部署到我的测试环境

  3. 如果一切顺利,那么我会sbt completeRelease

  4. 最终curl我的拉链进入了关系

于 2018-03-05T21:55:42.083 回答
0

您已将prepareRelease和定义doReleasesetting。这意味着设置的值只会在加载或重新加载构建时计算一次。此外,该ReleaseStep类型仅描述要作为发布过程的一部分执行的功能,并且不会自行执行任何操作。

看起来您正在使用sbt-release插件。按照文档,您必须releaseProcess使用自定义步骤重新定义密钥,并运行release命令来执行它们。

于 2018-03-05T13:19:20.257 回答