Jak zbudować złożony równoległy rurociąg Jenkins?

17

Byłem zainteresowany przekształceniem naszych niestandardowych integracji Jenkins w potok. Nie mogę jednak wymyślić, jak to zrobić.

Czy ktoś może mi pomóc ze skryptem Jenkins, który mógłby wykonać następujące czynności?

1---2---3-----------9---10
    |           |
    |---4-------|
    |           |
    |---5---6---|
        |       |
        |---7---|

1: Start pipeline
10: End pipeline
5: Build some files
   * needed by 6, 7,
   * needed as artifacts at the end
2, 3, 4, 6, 7: Have jUnit result files, should be available at end of
   test (somewhere), even if one failed

Czy to w ogóle możliwe? A może powinienem dołączyć po 3, 4, 5? Lubię to:

1---2---3-------6-------9---10
    |       |   |   |
    |---4---|   7---|
    |       |
    |---5---|
Bert Goethals
źródło
1
Głosowałbym na drugą opcję, brzmi to mniej podatne na złamanie i łatwiejsze do przedłużenia, jeśli zajdzie taka potrzeba.
Tensibai 21.04.17
2
być może gęsty, ale jeszcze nie zrozumiałem, co dodaje bardziej złożona wersja. czy możesz udokumentować, co robi „9” i od czego to zależy? nie ma 8, na wypadek gdybyś chciał to poprawić i dodać. :)
burnettk
1
@BertGoethals Możesz korzystać z Pipeline i nadal mieć różne zadania. Możliwe, że coś tu brakuje.
avi
1
Kilka dni temu próbowałem zrobić coś podobnego. Mogłem zmusić go do pracy z zagnieżdżonymi parallelpoleceniami, ale przepływ nie wyglądał poprawnie w BlueOcean.
lawnmowerlatte
1
@BertGoethals Czy nie możesz rozpocząć innego rurociągu wykonując 5, a następnie 6 i 7 z głównego rurociągu?
Tensibai

Odpowiedzi:

9

W oparciu o komentarze do mojego pytania i niektóre podstawowe testy wydają się działać:

Bert Goethals
źródło
4

Miałem podobną sytuację, w której chciałem zagnieździć inne wątki równoległych zadań wewnątrz innego równoległego. Ten kod działał dla mnie:

def performDeploymentStages(String node, String app) {
    stage("build") {
        echo "Building the app [${app}] on node [${node}]"
    }
    stage("deploy") {
        echo "Deploying the app ${app}] on node [${node}]"
    }
    stage("test") {
        echo "Testing the app [${app}] on node [${node}]"
    }
}

pipeline {
    agent {
        label 'master'
    }
    parameters {
        string(name: 'NODES', defaultValue: '1,2,3', description: 'Nodes to build, deploy and test')
        choice(name: 'ENV', choices: 'qa', description: 'Environment')
        string(name: 'APPS', defaultValue: 'app01,app02', description: 'App names')
    }

    stages {
        stage('parallel stage') {
            steps {
                script {
                    def nodes = [:]
                    for (node in params.NODES.tokenize(',')) {
                        def apps = [:]
                        for (app in params.APPS.tokenize(',')) {
                            performDeploymentStages(node, app)
                        }
                        parallel apps
                    }
                    parallel nodes
                }
            }
        }
    }
}

Aby w pełni skorzystać z pracy równoległej, pamiętaj o przypisaniu wystarczającej liczby programów wykonawczych.

biniosuaf
źródło
Czy ten fragment kodu działa bez przypisywania wartości do zmiennych nodesi apps?
jellenberger
@jellenberger nie będzie działać, jeśli te zmienne będą puste (łańcuch pusty / pusty). Ale dobrze jest przekazywać pojedyncze elementy (pojedynczą aplikację lub węzeł) bez przecinków.
biniosuaf