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


17

Мені було цікаво перетворити наші замовлені Дженкінс інтеграції в конвеєр. Однак я не можу зрозуміти, як це зробити.

Хтось може мені допомогти зі сценарієм Дженкінса, який міг би зробити наступне?

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 Ви можете використовувати трубопровід і все ще мати різні завдання. Можливо, я щось тут пропускаю.
аві

1
Я намагався зробити щось подібне кілька днів тому. Я міг би змусити його працювати з вкладеними parallelкомандами, але потік не виглядав правильно у BlueOcean.
lawnmowerlatte

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

Щоб повністю скористатися паралельним пробігом, не забудьте призначити достатню кількість виконавців.


Чи працює цей фрагмент без присвоєння значень змінним nodesі apps?
jellenberger

@jellenberger не вийде, якщо ці параметри будуть порожніми (null / empty string). Але чудово пропускати окремі елементи (окрему програму чи вузол) без коми.
biniosuaf
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.