2013-12-18 9 views
15

Używam Travis do ciągłego budowania i integracji.Jak opublikować tylko w gałęzi głównej pod Travis i sbt 0.13

after_success: 
- sbt publish 

ile chcemy zbudować Travis wszystkich naszych oddziałów i wyciągnąć wnioski, tylko chcemy go publish gdy na master gałęzi.

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") 
}) 

Problem z tym podejściem polega na tym, że Travis dwa razy kompiluje gałęzie, ponieważ nie powielają publikacji na ostatnim etapie.

W jaki sposób można zupełnie zapobiec uruchomieniu Travis w trybie sbt publish w oddziale innego niż master?

+0

Czy ta SBT 0.13+? –

+0

Tak, używamy sbt 0.13. – schmmd

Odpowiedz

6

Zrobiłbym dla niego nowe zadanie i zadzwonię do niego w Travis.

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") 
} 

Kluczem tutaj jest za pomocą Def.taskDyn, który pozwala mi zadzwonić publish w pozycji ogonowej bez zależności od niego. publishTo byłoby zwykłą logiką.

+0

Świetna odpowiedź, Eugene. Wiele się nauczyć. Odkąd sbt 0.13 jest w użyciu, jestem trochę zaniepokojony 'publishTo << = version {}' construct, a nie ': =' i 'version.value' wewnątrz. Czy to jest celowe, czy tylko nieodłączne od kopiowania ciała pytania? –

+0

Opuściłem 'publishTo' celowo w stylu oldschoolowym, ponieważ OP wygląda tak, jakby już go znał. Polecam ': =' esp dla nowo przybyłych, ale nie demonizuję '<< ='. –

+1

Myślę, że "styl starej szkoły" pozostanie dłużej w użyciu, gdy zostanie użyty przez ciebie i innych w odpowiedziach jako gotowe do skopiowania i wklejenia rozwiązanie. Myślę, że powinno to zostać zakazane w celu lepszego zrozumienia sbt (i przestać mylić nowych użytkowników). –

43

Można rozważyć do pracy poza swoim publikuje skrypt:

after_success: 
    - test $TRAVIS_PULL_REQUEST == "false" && test $TRAVIS_BRANCH == "master" && sbt publish 
+0

Dzięki! to działało. – ChrisWren

+2

To jest znacznie prostsza odpowiedź, IMO. – smurthas

Powiązane problemy