Jenkins - матричные задания - переменные на разных ведомых устройствах перезаписывают друг друга? - PullRequest
0 голосов
/ 06 февраля 2020

Я думаю, я не понимаю, как работает матричная сборка. Когда я устанавливаю некоторую переменную на некотором этапе в зависимости от того, какой узел я запускаю, то на остальной части этапа иногда эта переменная устанавливается так, как должно, а иногда она получает значения от других узлов (осей). В приведенном ниже примере аналогичное задание, которое выполняется на ub18-1, иногда имеет VARIABLE1 = 'Linux узел', а иногда VARIABLE1 = 'Windows узел'. Или гитметод, иногда он создается из LinuxGitInfo, а иногда и WindowsGitInfo.

Источник i на основе https://jenkins.io/doc/book/pipeline/syntax/#declarative -матрицы

Скрипт практически такой же, как и реальный

@Library('firstlibrary') _
import mylib.shared.*
pipeline {
    parameters {
        booleanParam name: 'AUTO', defaultValue: true, description: 'Auto mode sets some parameters for every slave separately'
        choice(name: 'SLAVE_NAME', choices:['all', 'ub18-1','win10'],description:'Run on specific platform')
        string(name: 'BRANCH',defaultValue: 'master', description: 'Preferably common label for entire group')
        booleanParam name: 'SONAR', defaultValue: false, description: 'Scan and gateway'
        booleanParam name: 'DEPLOY', defaultValue: false, description: 'Deploy to Artifactory'

    }

    agent none

    stages{
        stage('BuildAndTest'){
            matrix{
                agent {
                    label "$NODE"
                }
                when{ anyOf{
                    expression { params.SLAVE_NAME == 'all'}
                    expression { params.SLAVE_NAME == env.NODE}  
                }}
                axes{
                    axis{
                        name 'NODE'
                        values 'ub18-1', 'win10'
                    }
                }
                stages{
                    stage('auto mode'){
                        when{
                            expression { return params.AUTO }
                        }
                        steps{
                            echo "Setting parameters for each slave"
                            script{
                                nodeLabelsList = env.NODE_LABELS.split()

                                if (nodeLabelsList.contains('ub18-1')){
                                    println("Setting params for ub18-1");
                                    VARIABLE1 = 'Linux node'
                                }

                                if (nodeLabelsList.contains('win10')){
                                    println("Setting params for Win10");
                                    VARIABLE1 = 'Windows node'
                                }

                                if (isUnix()){
                                    gitmethod = new LinuxGitInfo(this,env)
                                } else {
                                    gitmethod = new WindowsGitInfo(this, env)
                                }
                            }
                        }
                    }

                    stage('GIT') {
                        steps {                
                            checkout scm
                        }
                    }

                    stage('Info'){
                        steps{
                            script{
                                sh 'printenv' 

                                echo "branch: " +  env.BRANCH_NAME
                                echo "SLAVE_NAME: " + env.NODE_NAME
                                echo VARIABLE1


                                gitinfo = new GitInfo(gitmethod)
                                gitinfo.init()
                                echo gitinfo.author
                                echo gitinfo.id
                                echo gitinfo.msg
                                echo gitinfo.buildinfo
                            }
                        }
                    }

                    stage('install'){
                        steps{
                            sh 'make install'
                        }
                    }

                    stage('test'){
                        steps{
                            sh 'make test'
                        }
                    }

                }
            }
        }

    }
}

1 Ответ

0 голосов
/ 17 февраля 2020

Хорошо, я решил проблему, определив карты переменных с именами узлов / ведомых в качестве ключей. Некоторые друзья даже предложили определить переменные в файле yml / json в репозитории и проанализировать их. Может быть, я буду, но пока это хорошо работает

пример:

перед конвейерами

def DEPLOYmap = [
    'ub18-1': false,
    'win10': true
    ]

в несколько этапов

when {
        equals expected: true, actual: DEPLOYmap[NODE]
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...