Rob*_*uch 7 node.js jenkins docker jenkins-pipeline
我正在开发一个 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")
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
图像本身已成功创建。我现在想知道: 1. Jenkins 会在package.json每次构建时下载我的所有依赖项吗?2. Jenkins 会在每次构建时下载所有层吗?
或者 Jenkins 会注意到依赖项和/或图像层已经存在吗?
fis*_*x01 11
TL; 博士
这取决于您的构建代理使用哪个 docker 守护进程。每个 docker 守护进程都有自己的缓存。
更详细的解释
您正在使用一些插件 ( docker-workflow?),它docker.build()为您的管道提供了步骤。默认情况下,此函数尝试在代理的本地主机上使用 docker 守护程序(通常尝试使用 socket /var/run/docker.sock)。您还可以在管道内配置哪个 docker 守护程序与docker.withServer() {}块一起使用。
守护程序存储/缓存您的层,因此只要您跨构建使用相同的守护程序,它们也会共享一个公共缓存。
如果您将构建分发到多个代理,并且每个代理都使用自己的本地主机 docker 守护程序,则它们不会共享公共缓存。
在官方文件中详细说明了这一点。他们提到的另一种技术是在构建代理上与您的 docker 镜像构建(部分Caching data for containers)共享本地卷。例如,您可以使用节点 deps 将卷挂载到连续的 docker 映像构建中。这样,即使您清理了 docker 缓存,也不会在每次构建时重新下载所有节点依赖项。
底线仍然是:Jenkins 不会自动为您缓存。缓存在您使用的构建工具的范围内。您必须注意将其正确地合并到您的 CI 环境需求中。但是当然可以实现。
小站点注意:在您的 CI 构建中拥有一个干净的 docker 构建缓存可能是个好主意。过去,我们在使用旧的 docker 构建缓存时遇到了问题,这些缓存损坏了我们的图像。但是,如果您的构建时间很长,那么缓存清理可能不是一种选择 - 至少不是在每次构建之后。