Этап Jenkins Pipeline начнется слишком рано

У меня проблема с конвейером. (Версия Дженкинса 1.165.1)

У меня есть:

  • 3 клиента: («AAA», «BBB» и «CCC»).
  • 2 параметризованных задания сборки: (Deploy_PrepDB_SHELL и Deploy_TargetDB_SHELL)

Конвейер (перечисленный ниже состоит из 2 этапов, по одному для каждой параметризованной сборки. Каждая параметризованная сборка запускается 3 раза, по одному разу для каждого клиента. На каждом этапе 3 клиента могут работать параллельно.

Однако я хочу, чтобы этап № 2 запускался ТОЛЬКО ПОСЛЕ того, как все 3 сборки из этапа № 1 завершены и успешно завершились. Моя проблема в том, что этап № 2 начинается, как только все сборки из этапа №1 были начаты.

Этап №2 не учитывает окончательный статус этих сборок ... Итак, этап №2 начинается, когда сборки из этапа №1 выполняются, и это вызывает ошибки.

FWIW, использование сборок с жестко запрограммированными клиентскими значениями фактически решает эту проблему. Но мне нужно использовать параметризованные сборки. У нас более 3-х клиентов и 2 строительных рабочих. Жестко запрограммированные сборки приводят к увеличению количества сборок.

Как я могу сделать так, чтобы на этапе № 2 (в процессе разработки) было известно о результатах сборок на этапе № 1? И продолжать только после успешной сборки Этапа №1?

Решение, о котором я думаю, состоит в использовании предварительных действий и пост-действий в параметризованных сборках для чтения / записи статусов в таблицу БД. Но это кажется неуклюжим, и я думаю, что у Дженкинса, вероятно, есть какой-то более простой механизм для обработки этого сценария.

Кто-нибудь из вас смог реализовать что-то подобное?

Спасибо

/* Jenkins Pipeline in Groovy */

def clientlist = ['AAA', 'BBB', 'CCC']


/*
    Stage #1
*/

stage concurrency: 3, name: '1. Deploying Prep Database'
    echo 'Deploying Prep Database DacPac'

    for(item in clientlist)         
    {             
        build job: 'Deploy_PrepDB_SHELL', parameters: [[$class: 'StringParameterValue', name: 'CLIENT_NAME', value: item]], wait: false       
        Thread.sleep(1000)           
    }


/*
    Stage #2
    Should not start until all 3 builds from previous stage have successfully finished!
*/

stage concurrency: 3, name: '2. Deploying Target Database'
    echo 'Deploying Target Database DacPac'            

    for(item in clientlist)      
    {         
        build job: 'Deploy_TargetDB_SHELL', parameters: [[$class: 'StringParameterValue', name: 'CLIENT_NAME', value: item]], wait: false       
        Thread.sleep(1000)      
    }

person bjones1831    schedule 27.03.2017    source источник
comment
Вы пытались установить для параметра wait значение true, чтобы дождаться вывода заданий перед переходом к следующему этапу? Не уверен, что он будет работать с параллелизмом ...   -  person Pom12    schedule 27.03.2017
comment
Я никогда не устанавливал для него значение true, но я удалил его. И вы правы, это не совсем работает с параллелизмом. IIRC, каждая итерация в цикле for ожидала завершения предыдущей.   -  person bjones1831    schedule 28.03.2017


Ответы (1)


Я не уверен, что ваш синтаксис подходит для вашего примера с конвейером - похоже, вам не хватает фигурных скобок после каждого stage. Кроме того, в текущем синтаксисе для stage нет параметра concurrency (о котором я знаю.

Вместо concurrency, вы хотите сделать шаг parallel и использовать wait: true (по умолчанию) в своих build вызовах.

/* Jenkins Pipeline in Groovy */

def clientlist = ['AAA', 'BBB', 'CCC']

def deployPrep = [:]
def deployTarget = [:]

// Create a map of name-closure pairs
for(item in clientlist)         
{
    // Closures will be executed later by "parallel" step later in pipeline
    deployPrep[item] = {
        // "wait: true" is the default           
        build job: 'Deploy_PrepDB_SHELL',
            parameters: [[$class: 'StringParameterValue', name: 'CLIENT_NAME', value: item]]      
        // Probably don't need this sleep, but including for parity
        Thread.sleep(1000)
    }

    // We can build up multiple maps using one loop.
    // Closures will be executed later by "parallel" step later in pipeline
    deployTarget[item] = {
        build job: 'Deploy_TargetDB_SHELL', 
            parameters: [[$class: 'StringParameterValue', name: 'CLIENT_NAME', value: item]]      
        Thread.sleep(1000)
    }
}

/*
    Stage #1
*/

stage ('1. Deploying Prep Database') {
    echo 'Deploying Prep Database DacPac'
    parallel deployPrep
}

/*
    Stage #2
    Will not start until all 3 builds from previous stage have successfully finished!
*/

stage ('2. Deploying Target Database') {
    echo 'Deploying Target Database DacPac'
    parallel deployTarget
}
person BitwiseMan    schedule 27.03.2017
comment
В настоящее время задания жестко запрограммированы, и мы используем параллельный синтаксис. Когда я впервые создал этот конвейер оболочки, я попытался использовать параллельный синтаксис, но не смог заставить его работать ... Я не думаю, что мы используем фигурные скобки ни на одном из наших этапов. И настройка параллелизма, похоже, позволяет нам обрабатывать параллельно. Имейте в виду, что мы используем Jenkins 1.165.1 (похоже, что Jenkins 2.x может иметь немного другую конфигурацию конвейера) .... Я все же попробую ваше решение и дам вам знать, что происходит. Большое спасибо! - person bjones1831; 28.03.2017