2016-07-04 15 views
7

Rozważamy użycie wtyczki Jenkins Pipeline do złożonego projektu składającego się z kilku dostaw, które muszą zostać zbudowane przy użyciu różnych narzędzi (na różnych komputerach) przed ich scaleniem. Mimo to wydaje się, że łatwo jest wykonać kompletną kompilację z pojedynczym Jenkinsfile i lubię automatyczne wykrywanie gałęzi git dostarczanych z Pipeline.Uruchamiaj części potoku jako osobne zadanie

Jednak w tym momencie mamy zlecenia dla każdej dostawy i używamy "meta" pracy opartej na przepływie budowy w celu aranżacji poszczególnych zadań. Zaletą jest to, że umożliwia on również rozpoczęcie tylko jednego pojedynczego zadania, jeśli dokonano tylko niewielkich zmian, aby sprawdzić, czy ta dostawa nadal się kompiluje.

Aby to naśladować niektóre pomysły przyszedł do głowy:

  • używać różnych Jenkinsfile s dla dostaw i load je na najwyższym poziomie Jenkinsfile; wydaje się, że zadanie Pipeline Multibranch nie pozwala jeszcze na skonfigurowanie funkcji Jenkinsfile (https://issues.jenkins-ci.org/browse/JENKINS-35415), więc tworzenie zadań dla poszczególnych dostaw jest nadal otwarte.
  • Podaj opcję konfiguracji dla zadania "najwyższego poziomu" i uzyskaj if s dla wszystkich dostaw w Jenkinsfile, aby móc wybrać, które elementy mają zostać zbudowane. W ten sposób można łączyć różne typy kompilacji w jednym potoku, a przynajmniej zepsuć oszacowanie czasu kompilacji.

Czy są to możliwe opcje, czy jest lepszy?

+1

To pytanie jest bardzo podobne do http://stackoverflow.com/questions/38129745/jenkins-build-pipeline-restart-at-stage, chociaż dotyczy ono ponownego uruchomienia. Mimo to odpowiedzi na to pytanie również dotyczą tego pytania. – olenz

Odpowiedz

5

Co można zrobić, to napisać skrypt, który ma ma potokowe „czy” -guards wokół pojedynczych etapach, na przykład:

stage "s1" 
if (theStage in ["s1","all"]) { 
    sleep 2 
} 

stage "s2" 
if (theStage in ["s2", "all"]) { 
    sleep 2 
} 

stage "s3" 
if (theStage in ["s3", "all"]) { 
    sleep 2 
} 

Następnie można dokonać „main” pracę, która wykorzystuje ten skrypt i uruchamia wszystkie etapy naraz, ustawiając parametr "theStage" na "all". Zadanie to zbierze statystyki, gdy wszystkie etapy zostaną uruchomione na raz i poda użyteczne czasy szacowania.

Ponadto można wykonać zadanie "częściowe uruchomienie", które korzysta z tego skryptu i jest parametryzowane ze sceną, którą chcesz uruchomić. Oszacowanie nie będzie jednak zbyt przydatne.

Zauważ, że umieściłem scenę w głównym skrypcie i umieściłem tylko kod wykonawczy w trybie warunkowym, zgodnie z sugestią Martina Ba. Daje to pewność, że wizualizacja pracy jest bardziej niezawodny

+0

Ten * jest * dobry pomysł, jednak: ["Etapy dynamiczne: ogólnie rzecz biorąc, jeśli chcesz wizualizować dynamicznie zmieniające się etapy, uzależnij je od wykonania zawartości sceny, a nie uwarunkowania dołączenia do etapu"] (https: // wiki.jenkins-ci.org/display/JENKINS/Pipeline+Stage+View+Plugin) –

+0

Dobra rada. Dodam to do mojej odpowiedzi. – olenz

0

jako rozszerzenie poprzedniej odpowiedzi, chciałbym zaproponować coś takiego:

def stageIf(String name, Closure body) { 
if (params.firstStage <= name && params.lastStage >= name) { 
    stage(name, body) 
} else { 
    stage(name) { 
     echo "Stage skipped: $name" 
    } 
} 
} 

node('linux') { 
properties([ 
     parameters([ 
       choiceParam(
         name: 'firstStage', 
         choices: '1.Build\n' + 
           '2.Docker\n' + 
           '3.Deploy', 
         description: 'First stage to start', 
         defaultValue: '1.Build', 
       ), 
       choiceParam(
         name: 'lastStage', 
         choices: '3.Deploy\n' + 
           '2.Docker\n' + 
           '1.Build', 
         description: 'Last stage to start', 
         defaultValue: '3.Deploy', 
       ), 
     ]) 
]) 

stageIf('1.Build') { 
    // ... 
} 
stageIf('3.Deploy') { 
    // ... 
} 
} 

Nie tak idealne jak chcę, ale przynajmniej jego pracy.