Дженкинс параллельно строит на разных агентах - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть небольшой пример декларативного конвейера Jenkins, который должен параллельно работать на агентах «Windows» и «Linux».Цель состоит в том, чтобы динамически построить матрицу конфигурации (например, конфигурации Release / Debug; различные параметры CMake и т. Д.) И позволить всем комбинациям работать параллельно.Однако я застрял в построении конвейера, который выполняет параллельные шаги из подготовленной переменной.

Это версия скрипта, в которой параллельные этапы явно указаны в блоке parallel{}:

pipeline {
    agent any
    stages {
        stage ("Parallel Build") {
            parallel {
                stage ("Windows") {
                    steps {
                        echo "TEST Windows"
                    }
                }
                stage ("Linux") {
                    steps {
                        echo "TEST Linux"
                    }
                }
            }
        }
    }
}

Мой план состоит в том, чтобы динамически создавать этапы в блоке parallel{}(в зависимости от требуемых конфигураций), но я не уверен насчет синтаксиса или возможного вообще.

Примерно так:

def stage_list = {
    stage ("Windows") {          <=== How to correctly create the stage_list?
        steps {
            echo "TEST Windows"
        }
    }
    stage ("Linux") {
        steps {
            echo "TEST Linux"
        }
    }
}

pipeline { 
    agent any
    stages {    
        stage ("Parallel Build") {
                parallel stage_list <== How to replace a block with variable?
        }
    }
}

Выше приведено сообщение об ошибкев Дженкинс:

WorkflowScript: 17: Expected a block for parallel @ line 17, column 9.
           stage ("Parallel Build") {
           ^

WorkflowScript: 17: Expected one of "steps", "stages", or "parallel" for stage "Parallel Build" @ line 17, column 9.
           stage ("Parallel Build") {
           ^

Кто-нибудь есть идеи, как это можно сделать?


Редактировать : После первых двух ответов я хотел бы обновитьмой вопрос немного.

Я проверил предложенный способ создания переменной stage_list.Однако, если я добавлю этот вызов parallel stage_list в мою исходную структуру, я получу ту же ошибку, что и раньше.Он работает хорошо при использовании с script, как это

pipeline { 
    agent any
    stages {    
        stage ("Parallel Build") {
            steps {
                script {
                    parallel stepsForParallel
                }
            }            
        }
    }
}

Может кто-нибудь объяснить мне разницу?Почему он работает с steps и script, но не без них?


Редактировать 2: По соображениям документации я хотел закончить свой вопрос тем, что сделал срешить проблему:

Ответ SmartToms и официальная документация Дженкинса по Синтаксис конвейера с Docker ясно дал понять, что декларативный конвейер и скриптовый конвейер - это два отдельных подхода, которые необходимо обрабатывать по-разному (обратите внимание нассылка «Переключить конвейер сценариев» под каждым примером).

Одним из способов решения моего вопроса является использование скриптового конвейера - если кому-то интересен пример для этого, вот ссылка на гистологию с конвейерным скриптом , которая показывает принцип.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

На основе примера SmartTom, но этот вы можете копировать / вставлять, и он работает:

// Creation of the stage_list
def node_list = ["win7", "linux"]

// Creation of a map of stages
def stepsForParallel = node_list.collectEntries {
    ["echoing ${it}" : transformIntoStage(it)]
}

// Run the stages in parallel
parallel stepsForParallel

// Creation of the stage
def transformIntoStage(inputString) {
    return {
        node (inputString) {
          echo "TEST "+inputString
        }
    }
}

Я бы порекомендовал вам использовать синтаксис конвейерного сценария, который гораздо более мощный и гибкий

0 голосов
/ 28 февраля 2019

Из этой документации это можно сделать следующим образом:

// Creation of the stage_list
def stage_list = ["Windows", "Linux"]

// Creation of a map of stages
def stepsForParallel = stage_list.collectEntries {
    ["echoing ${it}" : transformIntoStage(it)]
}

// Run the stages in parallel
parallel stepsForParallel

// Creation of the stage
def transformIntoStage(inputString) {
    return {
        stage (inputString) {
            steps {
                echo "TEST "+inputString
            }
        }
    }
}

Более подробную информацию о параллельном декларативном конвейере Jenkins можно найти здесь .


Редактировать :

Почему он работает с steps и script, но не без них?

В соответствии с этой документацией , я думаю, что использование parallel со списком - это старый метод (предыдущий декларативный конвейер 1.2), который требовал использования скриптового конвейера в декларативном конвейере.

Кажется, что новый метод parallel (из декларативного конвейера 1.2) нельзя использовать со списком.Итак, чтобы сделать это, вы должны использовать старый Scripted Pipeline метод, поэтому вам нужно инкапсулировать вашу команду pipeline stage_list с script, которая должна быть сама инкапсулирована с steps.

Более подробную информацию о скриптовом конвейере и декларативном конвейере можно найти здесь .

...