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

How can I separate my Jenkins build in a docker container and keep it clean?

我在 docker 容器中安装了 Jenkins 运行ning。现在我想在 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/**'
                }
            }
        }
    }
}

Docker 文件:

FROM gcc:10.2.0 AS builder

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

我不认为 Jenkins 会共享同一个工作空间如果并发构建发生在一个工作上。如果没有并发,它使用相同的工作空间。 检查我下面的例子和观察

詹金斯文件

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

jenkins_home 中的工作区看起来像

在屏幕截图中,您可以观察到对于同一个并发作业,Jenkins 使用不同的工作区文件夹,并且 Jenkins 遵循的命名约定是 @

使用Docker构建代理,场景相同

詹金斯文件

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

Workspace 文件夹结构