2017-03-02 22 views
5

Przebudowuję istniejący potok budowniczy jako potok deklaratywny jenkinsa (potok rozgałęziony) i mam problem z obsługą propagacji budowania.Jak czekać na dane wejściowe użytkownika w Deklaratywnym potoku bez blokowania executora wagi ciężkiej

Po zapakowaniu i przechowywaniu wszystkich odpowiednich plików, potok powinien czekać na dane wejściowe użytkownika, aby uruchomić wdrożenie.

Jeśli tylko dodasz krok wejściowy, bieżący węzeł kompilacji jest zablokowany. Ponieważ ten executor jest dość ciężki, chciałbym przenieść ten krok na bardziej lekką maszynę.

Początkowo wykonywałem pracę jako skryptowy potok i właśnie utworzyłem dwa różne bloki node('label'). czy istnieje sposób, aby zrobić coś podobnego z deklaratywną składnią?

node('spine') { 
    stage('builder') { 
     sh 'mvn clean compile' 
     stash name: 'artifact', includes: 'target/*.war' 
    } 
} 
node('lightweight') { 
    stage('wait') { 
     timeout(time:5, unit:'DAYS') { 
      input message:'Approve deployment?' 
     } 
    } 
    // add deployment stages 
} 

Próbowałem kilka rzeczy już:

Konfiguracja agenta na najwyższym poziomie i dodanie dodatkowego środka config etapie namnażania, ale potem mam dwa wykonawców blokujące jak najwyższym poziomie zdefiniowany węzeł kompilacji nie jest zatrzymywany.

Ustawienie agent none na najwyższym poziomie i konfigurowanie agentów na krok. następnie nie ma kasy Git w pierwszym węźle.

EDIT 1

i przekonfigurować mój rurociągu po ciebie radę, to obecnie wygląda następująco:

pipeline { 
agent none 
tools { 
    maven 'M3' 
} 
stages { 
    stage('Build') { 
     agent { label 'spine' } 
     steps { 
      checkout scm // needed, otherwise the workspace on the first step is empty 
      sh "mvn clean compile" 
     } 
    } 
    stage('Test') { 
     agent { label 'spine' } 
     steps { 
      sh "mvn verify" // fails because the workspace is empty aggain 
      junit '**/target/surefire-reports/TEST-*.xml' 
     } 
    } 
} 
} 

to kompilacja zakończy się niepowodzeniem, ponieważ obszar roboczy nie przeniesienie między etapami jak nie uruchamiać na tym samym executorze.

EDIT 2

podobno czasami kroki działają na tym samym wykonawca, a czasami nie. (odradzamy budowanie niewolników w naszym klastrze mezos/dcos na żądanie, więc zmiana pośredniej kompilacji executorów byłaby problemem)

Oczekiwano, że jenkins po prostu będzie działał z bieżącym executorem, o ile etykieta w definicji agenta nie będzie zmiana.

Odpowiedz

14

Zobacz best practice 7: Nie: Użyj danych wejściowych w bloku węzła. W deklaratywnym potoku wybór węzła odbywa się poprzez dyrektywę agent.

W dokumentacji here opisano, w jaki sposób można zdefiniować none dla rurociągu, a następnie użyć dyrektywy na poziomie etapu agent do uruchomienia etapów na wymaganych węzłach. Próbowałem też coś przeciwnego (zdefiniuj globalnego agenta na jakimś węźle, a następnie definiuj none na poziomie sceny dla danych wejściowych), ale to nie działa. Jeśli potok przydzielił urządzenie podrzędne, nie można zwolnić urządzenia podrzędnego dla jednego lub więcej określonych etapów.

Jest to struktura our pipeline:

pipeline { 
    agent none 
    stages { 
    stage('Build') { 
     agent { label 'yona' } 
     steps { 
     ... 
     } 
    } 
    stage('Decide tag on Docker Hub') { 
     agent none 
     steps { 
     script { 
      env.TAG_ON_DOCKER_HUB = input message: 'User input required', 
       parameters: [choice(name: 'Tag on Docker Hub', choices: 'no\nyes', description: 'Choose "yes" if you want to deploy this build')] 
     } 
     } 
    } 
    stage('Tag on Docker Hub') { 
     agent { label 'yona' } 
     when { 
     environment name: 'TAG_ON_DOCKER_HUB', value: 'yes' 
     } 
     steps { 
     ... 
     } 
    } 
    } 
} 

Generalnie, etapy budowania wykonać na slave kompilacji oznaczonej „Yona”, ale stopień wejściowy działa na pana.

+0

to nie działa dla deklaratywnych potoków, nie ma bloku węzłów. – Laures

+0

Uzgodnione. Zaktualizowano odpowiedź. – Bert

+0

Próbowałem tego samego co ty i wpadłem na problem. najwyraźniej obszar roboczy nie przejmuje z jednego etapu na drugi, nawet jeśli działa na tym samym agencie. mój drugi krok kompilacji (maven builds) znajduje pusty obszar roboczy – Laures

1

użyć agenta nie na wierzchu i zdefiniuj agenta dla każdego etapu z wyjątkiem etapu zawierającego etap wprowadzania.

źródło: dyskusja w Use a lightweight executor for a declarative pipeline stage (agent none)

Aktualizacja: Co masz na myśli przez „kasie git nie jest obecny na pierwszym węźle”? proszę o przedstawienie dotychczasowych informacji na temat deklaratywnego rurociągu.

Powiązane problemy