Несколько Jenkinsfiles, одна метка агента - PullRequest
0 голосов
/ 15 октября 2018

У меня есть проект, в котором есть несколько конвейеров сборки, позволяющих использовать различные типы сборок (нет, у меня нет возможности сделать из него одну сборку; это вне моего контроля).

Каждый из этих конвейеров представлен репозиторием Jenkinsfile в репозитории проекта, и каждый из них должен использовать одну и ту же метку агента сборки (им также необходимо использовать другие части конфигурации, но текущая проблема - это метка агента сборки).,Я пытаюсь поместить метку в какой-то файл конфигурации в репозитории проекта, чтобы все Jenkinsfiles могли его прочитать.

Я ожидал, что это будет просто, поскольку вам не нужна эта конфигурацияданные, пока вы уже не проверили копию источников для чтения Jenkinsfile.Насколько я могу судить, это невозможно.

Мне кажется, что Jenkinsfile не может читать файлы из SCM, пока проект не выполнит шаг SCM.Однако, уже слишком поздно: аргумент агента {label} читается перед запуском любых этапов.

Вот минимальный случай:

final def config
pipeline {
    agent none
    stages {
        stage('Configure') {
            agent {
                label 'master'
            }
            steps {
                checkout scm // we don't need all the submodules here
                echo "Reading configuration JSON"
                script { config = readJSON file: 'buildjobs/buildjob-config.json' }
                echo "Read configuration JSON"
            }
        }
        stage('Build and Deploy') {
            agent {
                label config.agent_label
            }
            steps {
                echo 'Got into Stage 2'
            }
        }
    }
}

Когда я запускаю это, я получаю: java.lang.NullPointerException: Cannot get property 'agent_label' on null object Я не получаю ни одного эха со стадии «Настройка».

Если я поменяю метку для стадии «Сборка и развертывание» на «мастер», сборка завершится успешно и распечатает все триоператоры echo.

Есть ли способ прочитать файл из рабочей области Git до того, как нужно установить метки агента?

1 Ответ

0 голосов
/ 15 октября 2018

Пожалуйста, посмотрите https://stackoverflow.com/a/52807254/7983309. Я думаю, что вы столкнулись с этой проблемой.Метка не может преобразовать config.agent_label в его обновленное значение.Все, что установлено в первой строке, отправляется на второй этап.

EDIT1:

env.agentName = ''
pipeline {
    agent none
    stages {
        stage('Configure') {
            agent {
                label 'master'
            }
            steps {
                script {
                    env.agentName = 'slave'
                    echo env.agentName
                }    
            }
        }
        stage('Finish') {
            steps {
                node (agentName as String) { println env.agentName }
                script {
                    echo agentName
                }
            }
        }
    }
}

Источник - В декларативном конвейере jenkins - можетЯ устанавливаю метку агента динамически?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...