Декларативное имя блокировки конвейера Jenkins с переменной - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть декларативный трубопровод Дженкинса с замком, e. г.

pipeline {
    environment {
        BRANCH = 'master'
    }
    agent any
    stages{
        stage('stage') {
            options {
                lock(resource: "lock-${env.BRANCH}")
            }
            steps {
                echo "Something"
            }
        }
    }
}

Но когда я запускаю конвейер, в журнале написано

[Pipeline] lock
Trying to acquire lock on [lock-null]
Lock acquired on [lock-null]
[Pipeline] {
[Pipeline] echo
master
[Pipeline] }
Lock released on resource [lock-null]

Кажется, что переменная окружения не установлена ​​при оценке имени замка, но когда вычисляется аргумент echo, он установлен правильно.

Этот ответ на несколько связанный вопрос дал подсказку использовать лениво оцененную строку GString вместо обычной строки GString. Попытка это:

pipeline {
    environment {
        BRANCH = 'master'
    }
    agent any
    stages{
        stage('stage') {
            options {
                lock(resource: "lock-${->env.BRANCH}" as String)
            }
            steps {
                echo "${->env.BRANCH}" as String
            }
        }
    }
}

дает мне следующие сообщения журнала

[Pipeline] lock
Trying to acquire lock on [[no resource/label specified - probably a bug]]
Lock acquired on [[no resource/label specified - probably a bug]]
[Pipeline] {
[Pipeline] echo
master
[Pipeline] }
Lock released on resource [[no resource/label specified - probably a bug]]

Итак, похоже, что переменная не может быть правильно разрешена.

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

Как мне это решить?

Ответы [ 2 ]

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

Я недавно столкнулся с этим сам.${env} недоступен в блоке options, но ${currentBuild} есть.Итак, сначала я сделал println("$currentBuild") и получил название класса.После этого я гуглил документы по исходному коду Java и следил за функциями, пока не получил то, что мне нужно.

В моем случае я хотел ${env.NODE_NAME}, и в итоге я получил ${currentBuild.getRawBuild().getExecutor().getOwner().getDisplayName()}

0 голосов
/ 14 сентября 2018

Вы можете просто использовать lock в качестве step вместо option:

pipeline {
    environment {
        BRANCH = 'master'
    }
    agent any
    stages{
        stage('stage') {
            steps {
                lock("lock-${env.BRANCH}" as String) {
                    echo "${env.BRANCH}" as String
                }
            }
        }
    }
}

Поскольку в steps установлена ​​переменная env.BRANCH, это должно работать.

Также см. документацию для lock step .

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