Как запустить одно и то же задание с разными параметрами параллельно, используя шаг [:] - PullRequest
0 голосов
/ 22 января 2019

У меня есть конвейерный скрипт, который должен запустить задание "TEST". Основной параметр (строка) - это SETUP_DESCRIPTION, который я формулирую из файла json, который я создаю. Каждый сервер может иметь различное количество выходных данных в зависимости от ресурсов сервера (некоторые имеют 2 настройки, а некоторые 3).

Код выглядит так:

#!/usr/bin/env groovy
import hudson.model.Result
import hudson.model.Run
import groovy.json.JsonSlurperClassic
import jenkins.model.CauseOfInterruption.UserInterruption
import org.jenkinsci.plugins.workflow.steps.FlowInterruptedException

def projectProperties = [
buildDiscarder(
logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '14', numToKeepStr: '')
),
parameters([
string(defaultValue: '', description: '', name: 'SERVER_NAME'),
string(defaultValue: 'Ubuntu_17.10_x86_64_kvm', description: '', name: 'KVM_TEMPLATE'),
string(defaultValue: 'test@test.com'', description: 'mailing list', name: 'SW_MAIL'),
choice(choices: ['no', 'eth', 'ib'], description: '', name: 'SIMX_SERVER'),
choice(choices: ['cib', 'cx3pro', 'cx4', 'cx4lx', 'cx5', 'cx6'], description: '', name: 'SIMX_BOARD'),
choice(choices: ['os_install', 'provision', 'add_jks_slave', 'add_to_noga', 'tests'], description: '', name: 'RUN_STAGE')
]),
[$class: 'RebuildSettings', autoRebuild: false, rebuildDisabled: false],
[$class: 'ThrottleJobProperty',
categories: [],
limitOneJobWithMatchingParams: true,
maxConcurrentPerNode: 5,
maxConcurrentTotal: 5,
paramsToUseForLimit: '',
throttleEnabled: true,
throttleOption: 'project'
],
]
properties(projectProperties)

def build_sanity (SETUP_DESCRIPTION) {

                    IMAGE = "linux/upstream_devel-x86_64"
                    CLOUD_IP = "dev-l-vrt-storage"
                    TAGS = "test_new_setup"

                if ("$SETUP_DESCRIPTION" != "b2b x86-64 cib cloud_test") {
                    DATA_BASE = "b2b_eth_drivertest_mini_reg_db.json"
                    LINK_LAYER =  "eth"
                }
                else {
                    DATA_BASE = "b2b_ib_drivertest_mini_reg_db.json"
                    LINK_LAYER =  "ib"
                }

            build job: 'SANITY_TESTS/new_cloud_setup_GENERAL_SANITY_CHECK2', propagate: false
            parameters:
            [string(name: 'SETUP_DESCRIPTION', value: "${SETUP_DESCRIPTION}"),
            string(name: 'DATA_BASE', value: "${DATA_BASE}"),
            string(name: 'LINK_LAYER', value: "${LINK_LAYER}"),
            string(name: 'IMAGE', value: "${IMAGE}"),
            string(name: 'CLOUD_IP', value: "${CLOUD_IP}"),
            string(name: 'TAGS', value: "${TAGS}")]
}
try {
ansiColor('xterm') {
timestamps {
node('cloud-slave1'){

            stage('Test Setups') {
               if (params.RUN_STAGE == 'os_install' || params.RUN_STAGE == 'provision' || params.RUN_STAGE == 'add_jks_slave' || params.RUN_STAGE == 'add_to_noga' || params.RUN_STAGE == 'tests') {

                 def stepsForParrallel = [:]
                 def NOGA_DESCRIPTION_LIST = sh (
                    script: "curl -X GET 'https://noga.mellanox.com/app/server/php/rest_api/?api_cmd=get_resources&pattern=${params.SERVER_NAME}&resource_type=Setup&group_name=Yaron&sub_group=Cloud'",
                    returnStdout: true
                    ).trim()

                @NonCPS
                def JSON = new groovy.json.JsonSlurperClassic().parseText(NOGA_DESCRIPTION_LIST)
                def DESCRIPTION_LIST = JSON.data.each{
                    SETUP_NAME = "${it.NAME}"
                    SETUP_DESCRIPTION = "${it.DESCRIPTION}"
                    println "${it.DESCRIPTION}" // PRINT ALL DECRIPTIONS INSIDE DATA

                    stepsForParrallel["${it.NAME}"] = {
                    build_sanity(SETUP_DESCRIPTION)
                    }

              }
              parallel stepsForParrallel
             }
            }
        }
    }
}
}catch (exc) {
def recipient = "${SW_MAIL}"
def subject = "${env.JOB_NAME} (${env.BUILD_NUMBER}) Failed"
def body = """
It appears that build ${env.BUILD_NUMBER} is failing, please check HW or network stability:
${env.BUILD_URL}
"""
mail subject: subject,
to: recipient,
replyTo: recipient,
from: 'cloud-host-provision@mellanox.com',
body: body

throw exc

1) Когда я запускаю его, как показано выше, код build_sanity вызывается один раз и выполняется (вместо 3 раз, как ожидалось).

2) Когда я беру содержимое функции build_sanity и запускаю его внутри цикла ech на этапе тестирования, оно запускается 3 раза, как и ожидалось, но не выбирает другие параметры, как ожидалось.

1 Ответ

0 голосов
/ 22 января 2019

так что мне удалось разобраться.

1) Я напечатал некоторые параметры и увидел, что моя функция не получила переменные в порядке поэтому я изменил задание на сборку: часть, и это решило эту проблему.

2) У меня также была проблема в части сцены. я поместил «параллельный запуск» внутри каждого цикла, который заставляет его работать несколько раз. так что я опустил его на один} вниз, и это исправило проблему с циклом

вот код функции + этап, если кто-нибудь столкнется с такой проблемой в будущем

def build_sanity (SETUP_DESCRIPTION) {

              if ("$SETUP_DESCRIPTION" != "b2b x86-64 cib cloud_test") {
                  DATA_BASE = "b2b_eth_drivertest_mini_reg_db.json"
                  LINK_LAYER =  "eth"
              }
              else {
                  DATA_BASE = "b2b_ib_drivertest_mini_reg_db.json"
                  LINK_LAYER =  "ib"
              }
                  IMAGE = "linux/upstream_devel-x86_64"
                  CLOUD_IP = "dev-l-vrt-storage"
                  TAGS = "test_new_setup"

              build job: 'SANITY_TESTS/new_cloud_setup_GENERAL_SANITY_CHECK',
              parameters: [
              string(name: 'SETUP_DESCRIPTION', value: "${SETUP_DESCRIPTION}"),
              string(name: 'DATA_BASE', value: "${DATA_BASE}"),
              string(name: 'LINK_LAYER', value: "${LINK_LAYER}"),
              string(name: 'IMAGE', value: "${IMAGE}"),
              string(name: 'TAGS', value: "${TAGS}"),
              ]

}

stage («Тестовые настройки») { if (params.RUN_STAGE == 'os_install' || params.RUN_STAGE == 'provision' || params.RUN_STAGE == 'add_jks_slave' || params.RUN_STAGE == 'add_to_noga' || params.RUN_STAGE == 'tests' ) {

                 def stepsForParrallel = [:]
                 def NOGA_DESCRIPTION_LIST = sh (
                    script: "curl -X GET 'https://noga.mellanox.com/app/server/php/rest_api/?api_cmd=get_resources&pattern=${params.SERVER_NAME}&resource_type=Setup&group_name=Yaron&sub_group=Cloud'",
                    returnStdout: true
                    ).trim()

                @NonCPS
                def JSON = new groovy.json.JsonSlurperClassic().parseText(NOGA_DESCRIPTION_LIST)
                def DESCRIPTION_LIST = JSON.data.each{
                def SETUP_NAME = "${it.NAME}"

                    stepsForParrallel["${it.NAME}"] = {
                    build_sanity("${it.DESCRIPTION}")
               }
              }
             parallel stepsForParrallel
             }
            } 
...