如何在Travis和sbt 0.13下的master分支上发布

sch*_*mmd 16 sbt travis-ci

我正在使用Travis进行持续构建和集成.

after_success:
- sbt publish
Run Code Online (Sandbox Code Playgroud)

虽然我们希望Travis构建我们所有的分支并提取请求,但我们只希望它publishmaster分支时.

publishTo <<= version { (v: String) =>
  val nexus = s"asdf"
  /* Don't let Travis publish when building pull requests.
   * $TRAVIS_PULL_REQUEST == "false" if it's not a pull request.  So we wan't publishTo to be
   * None when TRAVIS_PULL_REQUEST != false.
   */
  if(Try(sys.env("TRAVIS_PULL_REQUEST")).getOrElse("false") != "false")
    None
  /* Don't let Travis publish except when building master. */
  if(Try(sys.env("TRAVIS_BRANCH")).map(_ != "master").getOrElse(false))
    None
  else if(v.trim.endsWith("SNAPSHOT"))
    Some("snapshots" at nexus + "snapshots")
  // don't let Travis publish releases, either
  else if(Try(sys.env("TRAVIS")).getOrElse("false") == "true")
    None
  else
    Some("releases"  at nexus + "releases")
})
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是Travis编译分支两次,因为它在最后一步发布失败.

如何sbt publish在非master分支上完全阻止Travis运行?

Ben*_*ini 44

您可以考虑在发布脚本之外处理此问题:

after_success:
  - test $TRAVIS_PULL_REQUEST == "false" && test $TRAVIS_BRANCH == "master" && sbt publish
Run Code Online (Sandbox Code Playgroud)

  • 这是一个更简单的答案,IMO. (2认同)

Eug*_*ota 7

我为它做了一个新的任务,并在特拉维斯打电话给我.

val publishMasterOnTravis = taskKey[Unit]("publish master on travis")

def publishMasterOnTravisImpl = Def.taskDyn {
  import scala.util.Try
  val travis   = Try(sys.env("TRAVIS")).getOrElse("false") == "true"
  val pr       = Try(sys.env("TRAVIS_PULL_REQUEST")).getOrElse("false") == "true"
  val branch   = Try(sys.env("TRAVIS_BRANCH")).getOrElse("??")
  val snapshot = version.value.trim.endsWith("SNAPSHOT")
  (travis, pr, branch, snapshot) match {
    case (true, false, "master", true) => publish
    case _                             => Def.task ()
  }
}

publishMasterOnTravis := publishMasterOnTravisImpl.value

publishTo := {
  val nexus = s"asdf"
  if (version.value.trim.endsWith("SNAPSHOT")) 
    Some("snapshots" at nexus + "snapshots") 
  else
    Some("releases" at nexus + "releases")
}
Run Code Online (Sandbox Code Playgroud)

这里的关键是使用Def.taskDyn,这让我可以publish在尾部位置调用而不依赖它.publishTo这将是明显的逻辑.

  • @JacekLaskowski更新为sbt 0.13语法. (2认同)