Как построить сложный параллельный трубопровод Дженкинса?

17

Я был заинтересован в преобразовании наших сделанных на заказ интеграций Jenkins в конвейер. Тем не менее, я не могу понять, как это сделать.

Может кто-нибудь помочь мне со сценарием Дженкинс, который может сделать следующее?

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

Это вообще возможно? Или я должен просто присоединиться после 3, 4, 5? Как это:

1---2---3-------6-------9---10
    |       |   |   |
    |---4---|   7---|
    |       |
    |---5---|
Берт Геталс
источник
1
Я бы проголосовал за второй вариант, звучит реже, и его легче продлить, если возникнет такая необходимость.
Тенсибай
2
возможно быть плотным, но я еще не понял, что добавляет более сложная версия. Можете ли вы документировать, что делает "9" и от чего это зависит? там нет 8, на случай, если вы хотите пересмотреть и добавить это. :)
burnettk
1
@BertGoethals Вы можете использовать Pipeline и при этом выполнять разные задания. Возможно, я что-то здесь упускаю.
avi
1
Я пытался сделать нечто подобное несколько дней назад. Я мог заставить его работать с вложенными parallelкомандами, но поток не выглядел правильно в BlueOcean.
газонокосилка
1
@BertGoethals Не можете ли вы запустить другой конвейер, делающий 5, а затем 6 и 7 из вашего основного конвейера?
Тенсибай

Ответы:

9

Основываясь на комментариях к моему вопросу и некотором базовом тестировании, кажется, что следующее работает:

Берт Геталс
источник
4

У меня была похожая ситуация, в которой я хотел вложить другие параллельные потоки заданий в другой параллельный. Этот код работал для меня:

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

Чтобы в полной мере извлечь выгоду из параллельного запуска, не забудьте назначить достаточно исполнителей.

biniosuaf
источник
Означает ли это сниппета работу без присвоения значений к nodesи appsпеременным?
jellenberger
@jellenberger не будет работать, если эти переменные будут пустыми (пустая / пустая строка). Но хорошо передавать отдельные элементы (одно приложение или узел) без запятых.
biniosuaf