我正在开发一个React应用程序,它将被放入Docker映像中。我想使用Jenkins自动化构建图像的步骤。
这是我当前的Jenkinsfile
...
pipeline {
agent any
stages {
stage('Build') {
steps {
script {
def commitHash = GIT_COMMIT.take(7)
echo 'Building Docker image for commit hash: ' + commitHash
def customImage = docker.build("myImage")
}
}
}
}
}
图像本身已成功创建。我现在想知道:
1.詹金斯会为每个版本下载我的package.json
中的所有依赖项吗?
2. Jenkins会在每个版本中下载所有层吗?
还是詹金斯会注意到依赖关系和/或图像层已经存在?
答案 0 :(得分:2)
TL; DR
这取决于您的构建代理使用哪个docker守护程序。每个docker守护程序都有自己的缓存。
更多详细说明
您正在使用某个插件(docker-workflow
?),该插件为您的管道提供了docker.build()
步骤。默认情况下,此函数尝试在代理的本地主机上使用docker守护进程(通常尝试使用套接字/var/run/docker.sock
)。您还可以在管道内部配置与docker.withServer() {}
块一起使用的docker守护程序。
该守护程序存储/缓存您的图层,因此,只要您在构建之间使用相同的守护程序,它们都将共享一个公共缓存。
如果您将构建分布在多个代理上,并且每个代理使用其自己的localhost docker守护程序,则它们不会共享公共缓存。
official documentation对此进行了详细说明。他们提到的另一种技术是与docker映像构建共享构建代理上的本地卷(第Caching data for containers
节)。例如,您可以将具有节点Deps的卷装入连续的Docker映像构建中。这样,即使您清理了docker缓存,也不会在每个版本上重新下载所有节点deps。
最重要的是:Jenkins不会自动为您缓存。缓存在您使用的构建工具的范围之内。您必须注意将其正确地结合到CI环境的需求中。但是当然可以实现。
小型站点说明:在CI构建中拥有一个干净的docker构建缓存可能是个好主意。过去,我们在使用旧的Docker构建缓存时遇到了麻烦,这些缓存破坏了我们的映像。但是,如果构建时间很长,那么缓存清理可能不是一个选择-至少在每次构建之后都不会。