Jenkinsfile (по сценарию) устанавливает для оболочки $ HOME значение $ {env.WORKSPACE} - PullRequest
0 голосов
/ 21 мая 2018

Я использую контейнеры Docker для своих сборок, а переменная $HOME, конечно, указывает на домашнюю страницу пользователя Jenkins (/home/jenkins), что может вызвать проблемы, например, если задания выполняются параллельно и пытаются записывать данные в $HOME и т. д.

Каков желаемый способ установить $HOME на ${env.WORKSPACE} глобально в скриптовом Jenkinsfile?

Заключение всех шагов оболочки в withEnv(["HOME=${WORKSPACE}]){ ... } кажется довольно странным.

Вот уменьшенная версия скриптового конвейера, который обрабатывает несколько образов Docker и переносит настройку $HOME с помощью withEnv:

#!groovy
DOCKER_IMAGES = ["python:3.5.0", "python:3.6.5"]

def get_stages(docker_image) {
    stages = {
        docker.image(docker_image).inside {

            // The following line causes a weird issue, where pip tries to 
            // install into /usr/local/... instead of the virtual env.
            // Any help figuring out what's happening is appreciated.
            //
            // def PYTHON_VENV = docker_image.replaceAll('[:.]', '') + 'venv'
            //
            // So we set it to 'venv' for all parallel builds now
            def PYTHON_VENV = 'venv'
            withEnv(["HOME=${env.WORKSPACE}"]){
                stage("${docker_image}") {
                    echo "Running in ${docker_image}"
                }
                stage("Prepare") {
                    sh "echo 'Home is set to:' $HOME"
                    sh "echo 'Workspace is:' ${env.WORKSPACE}"

                    sh "rm -rf ${PYTHON_VENV}"
                    sh "python -m venv ${PYTHON_VENV}"
                    sh """
                        . ${PYTHON_VENV}/bin/activate
                        pip install -U pip setuptools wheel
                    """
                }
            }
        }
    }
    return stages
}


node('master') {

    cleanWs()

    def stages = [:]
    for (int i = 0; i < DOCKER_IMAGES.size(); i++) {
        def docker_image = DOCKER_IMAGES[i]
        stages[docker_image] = get_stages(docker_image)
    }

    parallel stages
}
...