Как использовать команды bash с withEnv в конвейерах Jenkins со сценариями?

#jenkins #jenkins-pipeline #jenkins-groovy #jenkins-declarative-pipeline

#Дженкинс #дженкинс-конвейер #дженкинс-заводной #дженкинс-декларативный-конвейер

Вопрос:

В декларативных конвейерах Jenkins довольно легко установить переменную среды в качестве результата команды bash следующим образом.

Например, значения USERNAME , UID и GID устанавливаются как результат их соответствующих команд bash.

 pipeline {
    agent {
        node {
            label 'master'
            customWorkspace "some/path"
        }
    }
    environment {
        USERNAME = sh(script:"whoami", returnStdout: true).trim()
        UID = sh(script:"id -u", returnStdout: true).trim()
        GID = sh(script:"id -g", returnStdout: true).trim()
    }
 

Как мне сделать то же самое при использовании конвейеров со сценариями Дженкинса?

Например, допустим, у меня есть следующий node блок, что мне поместить внутрь withEnv , чтобы добиться того же результата? Цель состоит в том USERNAME , UID чтобы и GID содержать имя пользователя, uid и gid пользователя на моем external-test-server узле.

 node('external-test-server') {
    stage("Test") {
        withEnv([
            // Note that the following does not work and is meant to illustrate what my objective is
            'USERNAME=${sh(script:"whoami", returnStdout: true).trim()}',
            'UID=${sh(script:"id -u", returnStdout: true).trim()}',
            'GID=${sh(script:"id -g", returnStdout: true).trim()}'
        ]) {
            dir("../some_path") {
                sh "pwd"
            }
        }
    }
}
 

Редактировать:

Я также должен быть уверен, что переменные среды в node('external-test-server') должны переопределять ранее установленные переменные среды вне узла.

Ответ №1:

Ваш withEnv блок не работает из-за отсутствия кавычек, как указано ниже, должно работать

 node {
    
    //initiated some values to make sure withEnv block overrides these
    env.USERNAME = "testUser"
    env.UID = "99"
    env.GID = "99"
    
    stage("Test") {
        withEnv([
            // This should now work
            "USERNAME=${sh(script:"whoami", returnStdout: true).trim()}",
            "UID=${sh(script:"id -u", returnStdout: true).trim()}",
            "GID=${sh(script:"id -g", returnStdout: true).trim()}"
        ]) {
            dir("myNewPath") {
                println USERNAME
                println UID
                println GID
            }
        }
    }
}
 

Комментарии:

1. В моем случае в моем конвейере уже USERNAME установлена переменная среды, и node('external-test-server') я хочу USERNAME , чтобы переменная среды переопределяла «внешнюю» USERNAME переменную среды. Я попробовал ваше предложение об использовании env.USERNAME в моем узле; однако, похоже, оно не переопределяет исходную USERNAME переменную среды.

2. Я понимаю, что вы имеете в виду, позвольте мне отредактировать мой ответ, в этом случае, я полагаю, это всего лишь вопрос кавычек