Я использую контейнеры 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
}