我如何将我的Jenkins build分离到docker容器中并保持其清洁?

我如何将我的Jenkins build分离到docker容器中并保持其清洁?,docker,jenkins,jenkins-pipeline,Docker,Jenkins,Jenkins Pipeline,我让Jenkins在docker容器中运行。现在我想在docker上开始构建。但我在日志中看到的是,工作区的卷被装载到用于构建的docker容器上 这是否意味着我的所有构建都在同一个工作区文件夹中运行?这正是我想要阻止的 如何确保git签出在docker容器中完成,并且在运行该构建后将其删除 +docker build -t c477d0c74731a417e6e0ba1563a397aad8ab76ee --target builder -f cpp/Dockerfile cpp Sendin

我让Jenkins在docker容器中运行。现在我想在docker上开始构建。但我在日志中看到的是,工作区的卷被装载到用于构建的docker容器上

这是否意味着我的所有构建都在同一个工作区文件夹中运行?这正是我想要阻止的

如何确保git签出在docker容器中完成,并且在运行该构建后将其删除

+docker build -t c477d0c74731a417e6e0ba1563a397aad8ab76ee --target builder -f cpp/Dockerfile cpp
Sending build context to Docker daemon  1.307MB
...  
Successfully built 4bc8ce7a4ad3
Jenkins seems to be running inside container 11e315121188683c9e1c7e02d5924a7a550324b8f9957f6cae580f80d04359db
$ docker run -t -d -u 1000:1000 -w /var/jenkins_home/jobs/Docker-Cpp-Demo/branches/master/workspace --volumes-from 11e315121188683c9e1c7e02d5924a7a550324b8f9957f6cae580f80d04359db
我从这个日志中看到,
--volumes from
正在装载来自Jenkins实例的卷。并且工作区位于
/var/…
中。这是否意味着它是一个共享卷,因此在生成后不会被清理

詹金斯档案:

pipeline {
    agent { 
        dockerfile {
            dir 'cpp'
            additionalBuildArgs '--target builder'
        }
    }
    stages {
        stage('Build') {
            steps {
                dir('cpp') {
                    sh 'cmake -S . -B build -DCMAKE_INSTALL_PREFIX=install'
                    sh 'cmake --build build --target install'
                }
            }
            post {
                success {
                    archiveArtifacts artifacts: 'cpp/install/**'
                }
            }
        }
    }
}
Dockerfile:

FROM gcc:10.2.0 AS builder

# Install cmake
RUN apt-get update && apt-get -y install cmake

我认为如果一个作业发生并发构建,Jenkins永远不会共享同一个工作区。如果没有并发,则使用相同的工作区。 检查我下面的例子和观察

Jenkinsfile

node("master") {
    stage('one') {
        sh """
            echo "Hello World - $BUILD_ID" >> file.txt
            sleep 5
            ls -al
            cat file.txt
        """
    }
}    

pipeline {
    agent {
        docker {
            image 'alpine:latest'
            label 'master'
        }
    }
    stages {
        stage('one'){
            steps {
                sh """
                    echo "Hello World - $BUILD_ID" >> file.txt
                    sleep 5
                    ls -al
                    cat file.txt
                """
            }
        }
    }
}

jenkins_家中的工作区看起来像

在屏幕截图上,您可以观察到Jenkins使用不同的工作区文件夹执行相同的并发作业,并且Jenkins遵循了命名约定@

对于Docker build agent,场景是相同的

Jenkinsfile

node("master") {
    stage('one') {
        sh """
            echo "Hello World - $BUILD_ID" >> file.txt
            sleep 5
            ls -al
            cat file.txt
        """
    }
}    

pipeline {
    agent {
        docker {
            image 'alpine:latest'
            label 'master'
        }
    }
    stages {
        stage('one'){
            steps {
                sh """
                    echo "Hello World - $BUILD_ID" >> file.txt
                    sleep 5
                    ls -al
                    cat file.txt
                """
            }
        }
    }
}

生成日志

docker run -t -d -u 1000:1000 -w /var/jenkins_home/workspace/declarative-pipeline -v /var/jenkins_home/workspace/declarative-pipeline:/var/jenkins_home/workspace/declarative-pipeline:rw,z -v /var/jenkins_home/workspace/declarative-pipeline@tmp:/var/jenkins_home/workspace/declarative-pipeline@tmp:rw,z -e ******** alpine:latest cat

docker run -t -d -u 1000:1000 -w /var/jenkins_home/workspace/declarative-pipeline@2 -v /var/jenkins_home/workspace/declarative-pipeline@2:/var/jenkins_home/workspace/declarative-pipeline@2:rw,z -v /var/jenkins_home/workspace/declarative-pipeline@2@tmp:/var/jenkins_home/workspace/declarative-pipeline@2@tmp:rw,z -e ******** alpine:latest cat

ocker run -t -d -u 1000:1000 -w /var/jenkins_home/workspace/declarative-pipeline@3 -v /var/jenkins_home/workspace/declarative-pipeline@3:/var/jenkins_home/workspace/declarative-pipeline@3:rw,z -v /var/jenkins_home/workspace/declarative-pipeline@3@tmp:/var/jenkins_home/workspace/declarative-pipeline@3@tmp:rw,z -e ******** alpine:latest cat
工作区文件夹结构

node("master") {
    stage('one') {
        sh """
            echo "Hello World - $BUILD_ID" >> file.txt
            sleep 5
            ls -al
            cat file.txt
        """
    }
}    

pipeline {
    agent {
        docker {
            image 'alpine:latest'
            label 'master'
        }
    }
    stages {
        stage('one'){
            steps {
                sh """
                    echo "Hello World - $BUILD_ID" >> file.txt
                    sleep 5
                    ls -al
                    cat file.txt
                """
            }
        }
    }
}


您可以使用deleteDir()自定义您的工作区,也可以使用deleteDir()清理post dsl中的工作区,这样即使管道在jenkins默认工作区目录中签出您的源代码,它也会清理。但这仍然意味着同一分支的两个版本不能同时运行,因为它共享工作区。我希望docker能帮我解决这个问题。你能解释一下你的场景吗,我是说你的构建步骤?所以我将试着做一个例子。如果我理解正确,您希望在两个不同的场景中运行相同的分支构建,但不希望Jenkins共享工作区?您的场景对我来说很有趣,并且喜欢尝试演示。@SamitKumarPatel假设有人在一个接一个地进行两次提交。我的Jenkins实例能够并行运行8个构建。因此,在同一分支上的两个构建可以同时启动。它们将在同一个工作区中运行。这是我想避免的事情。在这种情况下,构建步骤本身并不重要。哇,我没有意识到这一点。谢谢你的洞察力。这对我有很大帮助。