У меня есть несколько агентов узла Jenkins, включая «главный», «многоуровневый агент 1» и «cirrus». Я пытаюсь установить узел, на котором выполняется этап, с помощью параметра {}.

У меня есть код конвейера

def BuildAgentLabel='tiering_agent1'

pipeline {

    agent { label 'master' } 

    parameters { 
        string( 
            name:         'NEW_LABEL', 
            defaultValue: '',  
            description:  ''
        )
    }
    stages {
        stage( 'Init') {
            steps {
                script {
                    if ( params.NEW_LABEL != '' ){
                        echo "Setting BuildAgentLabel to '${params.NEW_LABEL}'" 
                        BuildAgentLabel = params.NEW_LABEL
                        echo "BuildAgentLabel is now '${BuildAgentLabel}'" 
                    } 
                } 
            }
        }
        stage( "Build") {
            agent { label BuildAgentLabel } 
            steps {
                echo "Performing Stage '${STAGE_NAME}' on NODE '${env.NODE_NAME}'"
                echo "BuildAgentLabel=${BuildAgentLabel}"
            }
        }
    }
}

Хотя на этапе «Init» для глобальной переменной BuildAgentLabel устанавливается другое значение (если параметры NEW_LABEL представляют собой строку с длиной> 0), этап «Build» всегда выполняется на любом узле, на котором выполняется "def BuildAgentLabel "изначально установлен в.

Консольный вывод прогона повторяет это:

[Pipeline] node
Running on Jenkins in ...
[Pipeline] {
.
.
.
[Pipeline] stage
[Pipeline] { (Init)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Setting BuildAgentLabel to 'master'
[Pipeline] echo
BuildAgentLabel is now 'master'
.
.
.
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] node
Running on tiering_agent1 in /opt/jenkins-agent/workspace/ine-multibranch-test_master-RGJIAQXOIAPL7XDIJW6DOGF4KUE5KBRXCAZ7U4IUW2YOTZVQTWCA
[Pipeline] {
.
.
.
[Pipeline] {
[Pipeline] echo
Performing Stage 'Build' on NODE 'tiering_agent1'
[Pipeline] echo
BuildAgentLabel=master
.
.
.
[Pipeline] End of Pipeline
Finished: SUCCESS

Это похоже на то, как объекты stage {} создаются почти одновременно и в это время захватывают свою метку агента, но после этого следует выполнение стадии.

Я хотел бы, чтобы этап «Инициализация» мог влиять на узел, на котором выполняется этап «Сборка», но не могу заставить его работать. Как я могу получить желаемый результат?

1
jeffrotull 14 Окт 2018 в 20:43

2 ответа

Лучший ответ

Проблема в том, что agent { label BuildAgentLabel } не разрешает переменную BuildAgentLabel в ее значение, возможно, из-за этой ошибки - https://issues.jenkins-ci.org/browse/JENKINS-9665, и я предполагаю, что ваш агент узла tiering_agent1 настроен как Use this node as much as possible и по умолчанию используется этот агент .

Однако установка метки для параметра напрямую работает agent { label "${params.NEW_LABEL}" }

0
ben5556 14 Окт 2018 в 21:27

Если я не ошибаюсь, вы не можете изменить элемент params. По крайней мере, когда я пробовал, я получаю какую-то ошибку "статическая / недоступная карта". Однако вы можете изменять переменные среды, если они не были созданы в родительском декларативном environment (см. полную информацию по этой ссылке). И я также считаю, что вы можете получить доступ к любой переменной param.name как env.name, и эту можно изменить. Это может зависеть от обстоятельств. Если это не так, вы всегда можете установить новую переменную env в качестве значения входящего параметра, и это определенно будет изменяемым.

0
Max Cascone 26 Фев 2021 в 16:09