我有一个项目,结构如下:
-
码头工人/Dockerfile
linux/* 。Xz(内核源代码)
* . shJenkinsfile
基本上这管道正在建设一个linux内核的码头工人容器。
我们将bitbucket与jenkins和artifactory结合使用。
目前docker镜像的构建是手动的:开发人员在本地构建它并将其推送到artifactory。
管道只拉预构建的docker映像执行。
由于这种手动交互很烦人,所以应该自动进行。
典型的场景可能是这样的:开发人员更改了Dockerfile和其他一些资源。
这要求我们首先重新构建容器,将其推送到artifactory,然后开始构建。
是否有一种使用上述技术的直接方法来做到这一点?
我的方法是(这主要是我自己实现的)根据docker映像的git版本来标记它们。
当上面提到的管道启动时,它会查询上次更改的Dockerfile的git-rev,并尝试拉出
容器。如果这是可能的——很好。否则,运行"docker build"并推送新容器。然后运行内核构建。
这样做合适吗?
选项如下:
选项1
为了确定是否必须构建一个新映像,您可以依赖Jenkins Changeset。您可以检查docker/Dockerfile
文件是否与上次构建相比发生了变化,如果是,您可以执行构建步骤或直接跳过它。
另外,当标记图像时,您可以创建两个图像标记。一个带有修订版本(或任何其他唯一标识符)的标记,并将latest
标记替换为构建的最新映像。这将允许您在管道的连续步骤中具有简单的逻辑,因为我们知道最新构建映像位于最新标记中。下面是示例管道。
pipeline {
agent any
stages {
stage('BuildImage') {
when { changeset "**/Dockerfile" }
steps {
script {
def image = docker.build("my-image:REVISION", "docker/Dockerfile")
image.push() // Pushes the tagged image with revision
image.push('latest') // Change the tag and push
}
}
}
stage('Other Build') {
steps {
docker.image('my-image:latest').inside {
// Do other stuff within the Docker image
}
}
}
stage('Other Build option 2') {
agent {
docker { image 'node:16.13.1-alpine' }
}
steps {
// Do other stuff within the Docker image
}
}
}
}
选项2
另一个选择是总是用你的Docker文件启动一个新的Jenkins Agent/Container,或者总是构建镜像,然后用容器执行构建命令。这可能是有效Dockerfile如果你频繁变化。下面是示例管道。
pipeline {
agent { dockerfile { dir 'docker' } }
stage('Other Build') {
steps {
// Do other stuff within the Docker image
}
}
}
}
}