Jenkinsfile(脚本化)将shell$HOME设置为${env.WORKSPACE}

Jenkinsfile(脚本化)将shell$HOME设置为${env.WORKSPACE},jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,我正在为我的构建使用Docker容器,$HOME变量当然指向Jenkins用户主页(/HOME/Jenkins),这可能会导致问题,例如,如果作业并行运行并试图将内容写入$HOME等 在脚本文件中全局地将$$HOME设置为${env.WORKSPACE}所需的方法是什么 用env([“HOME=${WORKSPACE}]){…}包装中的所有shell步骤似乎很奇怪 下面是脚本化管道的缩小版本,它处理多个Docker图像,并将$HOME的设置包装为withEnv: #!groovy DOCKER_

我正在为我的构建使用Docker容器,
$HOME
变量当然指向Jenkins用户主页(
/HOME/Jenkins
),这可能会导致问题,例如,如果作业并行运行并试图将内容写入
$HOME

在脚本文件中全局地将
$$HOME
设置为
${env.WORKSPACE}
所需的方法是什么

用env([“HOME=${WORKSPACE}]){…}包装
中的所有shell步骤似乎很奇怪

下面是脚本化管道的缩小版本,它处理多个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
}
#!groovy
DOCKER_IMAGES=[“python:3.5.0”,“python:3.6.5”]
def get_阶段(docker_图像){
阶段={
docker.image(docker\u image).内部{
//下面这行引起了一个奇怪的问题,pip试图解决这个问题
//安装到/usr/local/…而不是虚拟环境中。
//我们非常感谢您能帮我们弄清楚发生了什么。
//
//def PYTHON_VENV=docker_image.replaceAll('[:.]','')+'VENV'
//
//因此,我们现在为所有并行构建将其设置为“venv”
def PYTHON_VENV='VENV'
withEnv([“HOME=${env.WORKSPACE}”]){
舞台(${docker_image}){
echo“在${docker_image}中运行”
}
阶段(“准备”){
sh“echo”Home设置为:“$Home”
sh“echo”工作区是:“${env.Workspace}”
sh“rm-rf${PYTHON\u VENV}”
sh“python-m venv${python\u venv}”
嘘
.${PYTHON\u VENV}/bin/activate
pip安装-U pip设置工具轮
"""
}
}
}
}
返回阶段
}
节点(“主节点”){
cleanWs()
def stages=[:]
对于(int i=0;i
在withEnv([“HOME=${WORKSPACE}]){…}中包装所有shell步骤似乎很奇怪

当然,这看起来很奇怪,但它设置了容器的工作目录,并进行了卷绑定以将必要的文件传输到容器中。你可以在日志中看到它

docker运行-t-d-u 996:994-w/var/lib/jenkins/workspace/python测试-pipeline@2-v/var/lib/jenkins/workspace/python测试-pipeline@2:/var/lib/jenkins/workspace/python test-pipeline@2:rw,z-v/var/lib/jenkins/workspace/python测试-pipeline@2@tmp:/var/lib/jenkins/workspace/python测试-pipeline@2@tmp:rw,*********************************************************************************************************************************男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生男生************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************-e************-e*********-e*********-e************-e*********-e*********-e*********-e*********-e*********-e*********-e*********-e*********-e******-e***-e******-e******-e******-e******--e*********-e*********-e*********python:alpine cat