Como construir um complexo pipeline Jenkins paralelo?


17

Estou interessado em converter nossas integrações Jenkins sob medida em um pipeline. No entanto, não consigo descobrir como fazê-lo.

Alguém pode me ajudar com o script Jenkins que pode fazer o seguinte?

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

Isso é possível? Ou devo entrar depois de 3, 4, 5? Como isso:

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

1
Eu votaria na segunda opção, parece menos provável de quebrar e mais fácil de estender, se necessário.
Tensibai

2
possivelmente sendo denso, mas ainda não entendi o que a versão mais complexa acrescenta. você pode documentar o que "9" faz e do que depende? não há 8, caso você queira revisar e adicionar isso. :)
burnettk

1
@BertGoethals Você pode usar o Pipeline e ainda ter trabalhos diferentes. É possível que eu esteja perdendo alguma coisa aqui.
avi

1
Eu estava tentando fazer algo semelhante há alguns dias atrás. Eu poderia fazê-lo funcionar com parallelcomandos aninhados , mas o fluxo não parecia certo no BlueOcean.
lawnmowerlatte

1
@BertGoethals Você não pode iniciar outro pipeline fazendo 5 e 6 e 7 a partir do pipeline principal?
Tensibai

Respostas:



4

Eu tive uma situação semelhante na qual queria aninhar outros threads de trabalhos paralelos dentro de outro paralelo. Este código funcionou para mim:

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

Para se beneficiar totalmente da execução paralela, lembre-se de atribuir executores suficientes.


Esse snippet funciona sem atribuir valores às variáveis nodese apps?
jellenberger

@jellenberger, não funcionará se esses vars estiverem vazios (string nula / vazia). Mas é bom passar itens únicos (aplicativo único ou nó) sem vírgulas.
biniosuaf
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.