如何将我的 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 文件夹结构
我在 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 文件夹结构