Выполнение этапов параллельно с рабочим процессом / конвейером Jenkins

Обратите внимание: вопрос основан на старом, теперь называемом "скриптовом" формате конвейера. При использовании «декларативных конвейеров» параллельные блоки могут быть вложены внутри блоков stage (см. Параллельные этапы с Declarative Pipeline 1.2).

Мне интересно, как параллельные шаги должны работать с плагином рабочего процесса / конвейера Jenkins, особенно. как смешивать их с этапами сборки. Я знаю об общей закономерности:

parallel(firstTask: {
  // Do some stuff
}, secondTask: {
  // Do some other stuff in parallel
})

Однако я хотел бы запустить несколько этапов параллельно (на одном узле, у которого есть несколько исполнителей), поэтому я попытался добавить такие этапы:

stage 'A'
// Do some preparation stuff

parallel(firstTask: {
  stage 'B1'
  // Do some stuff
}, secondTask: {
  stage 'B2'
  // Do some other stuff in parallel
})

stage 'C'
// Finalizing stuff

Это не работает должным образом. Задачи «сделать что-то» выполняются параллельно, но параллельные этапы завершаются немедленно и не включают в себя то, что они должны содержать. Как следствие, Stage View не показывает правильный результат, а также не связывает журналы.

Могу ли я строить разные этапы параллельно, или «параллельный» этап предназначен только для использования в рамках одного этапа?


person ami    schedule 26.04.2016    source источник
comment
Что именно не работает? Я попробовал ваш фрагмент в Jenkins несколько минут назад, и, похоже, он работает нормально.   -  person Joerg S    schedule 27.04.2016
comment
Как я уже сказал, этапы работы на самом деле не выполняются как часть этапов, то есть в представлении этапа не отображается потраченное на них время, а также нет журналов. Если вы выполните те же действия, не параллельно, вы увидите разницу.   -  person ami    schedule 28.04.2016
comment
Понятно - значит, проблему можно увидеть только в виде сцены, верно?   -  person Joerg S    schedule 29.04.2016
comment
Думаю, ситуация изменилась: jenkins.io/blog/2017/09/25 / declarative-1   -  person Quartz    schedule 16.10.2017
comment
См. Мой ответ на stackoverflow.com/questions/46834998/   -  person Ed Randall    schedule 23.07.2019


Ответы (5)


Вы не можете помещать устаревший stage без ограничения области видимости (как в исходном вопросе) внутри parallel.

Начиная с JENKINS-26107, stage принимает аргумент блока. Вы можете поместить parallel внутри stage или stage внутри parallel или stage внутри stage и т. Д. Однако не гарантируется, что визуализация сборки поддерживает все вложения; особенно

  • Встроенный Шаги конвейера («древовидная таблица», в которой перечислены все шаги, выполняемые сборкой) показывает произвольное stage вложение.
  • Плагин Pipeline Stage View в настоящее время отображает только линейный список этапов в порядке их начала, независимо от структуры вложенности.
  • Blue Ocean отобразит этапы верхнего уровня, а также parallel ветки внутри этапа верхнего уровня, но в настоящее время их больше нет.

JENKINS-27394, если он реализован, будет отображать произвольно вложенные stages.

person Jesse Glick    schedule 27.04.2016
comment
Я только что прочитал здесь, что начиная с версии 2.1 stage step внутри параллели не может использоваться, так как никогда не поддерживался. Подскажите, пожалуйста, в каком сейчас состоянии? - person Daniel Hiller; 06.03.2017
comment
В v2.2 плагина этапы конвейера-этапа-шага принимают блоки. Хотя у него все еще есть проверка, чтобы увидеть, находится ли он внутри параллельного, я не видел, чтобы он генерировал исключение. Обычно я тоже использую блок parallel([thingA: { stage('A') { echo('A') } }]). Обратите внимание, что это будет выглядеть странно как в стандартном интерфейсе, так и в синем океане. См. JENKINS-38442. - person ZombieDev; 20.03.2017
comment
@ZombieDev, v2.2 выдает исключение для меня с использованием декларативного конвейера. Это использование не проходит декларативный линтер. - person Yichun; 08.06.2017

этот синтаксис устарел, вы получите следующую ошибку:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 14: Expected a stage @ line 14, column 9.
       parallel firstTask: {
       ^

WorkflowScript: 14: Stage does not have a name @ line 14, column 9.
       parallel secondTask: {
       ^

2 errors

Вы должны сделать что-то вроде:

stage("Parallel") {
    steps {
        parallel (
            "firstTask" : {
                //do some stuff
            },
            "secondTask" : {
                // Do some other stuff in parallel
            }
        )
    }
}

Просто добавьте сюда использование узла для распределения заданий по нескольким серверам сборки / виртуальным машинам:

pipeline {
  stages {
    stage("Work 1"){
     steps{
      parallel ( "Build common Library":   
            {
              node('<Label>'){
                  /// your stuff
                  }
            },

        "Build Utilities" : {
            node('<Label>'){
               /// your stuff
              }
           }
         )
    }
}

Все виртуальные машины должны быть помечены как пул.

person PRF    schedule 06.04.2017

Я только что протестировал следующий конвейер, и он работает

parallel firstBranch: {
    stage ('Starting Test') 
    {
        build job: 'test1', parameters: [string(name: 'Environment', value: "$env.Environment")]
    }
}, secondBranch: {
    stage ('Starting Test2') 
    {
        build job: 'test2', parameters: [string(name: 'Environment', value: "$env.Environment")]
    }
}

Это задание с именем 'trigger-test' принимает один параметр с именем 'Environment'.

Задания test1 и test2 - это простые задания:

Пример для test1

  • Один параметр с именем "Environment"
  • Конвейер: echo "$ env.Environment-TEST1"

При выполнении я могу видеть, что оба этапа выполняются одновременно

person OlivierTerrien    schedule 30.03.2017
comment
какая версия Дженкинса? - person joao cenoura; 21.05.2017
comment
согласно @ joao-cenoura - я действительно хочу, чтобы это работало, но это не работает в 2.58, и я не вижу ничего в примечаниях к выпуску для 2.61 или текущих плагинах, которые звучат так, как будто они заставят его работать. Какую версию Jenkins и подключаемых модулей конвейера вы используете? - person Typhlosaurus; 22.05.2017
comment
Мой - Jenkins ver. 2.46.2 - person OlivierTerrien; 23.05.2017
comment
У меня это работает с версией 2.65. Вы также можете иметь несколько этапов в определениях параллельных блоков. - person philbert; 25.07.2017
comment
работал в Jenkins ver. 2,193 - person Shubham Jain; 11.03.2021
comment
здесь также указано jenkins.io/doc/pipeline/steps/workflow-cps - person Shubham Jain; 11.03.2021

Как упоминалось в @Quartz, вы можете сделать что-то вроде

stage('Tests') {
    parallel(
        'Unit Tests': {
            container('node') {
                sh("npm test --cat=unit")
            }
        },
        'API Tests': {
            container('node') {
                sh("npm test --cat=acceptance")
            }
        }
    )
}
person Anoop Philip    schedule 19.03.2018

Я думаю, что сейчас это официально реализовано: https://jenkins.io/blog/2017/09/25/declarative-1/

person Quartz    schedule 16.10.2017