Jenkins 在构建时是否缓存依赖项和 Docker 层?

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 构建缓存时遇到了问题,这些缓存损坏了我们的图像。但是,如果您的构建时间很长,那么缓存清理可能不是一种选择 - 至少不是在每次构建之后。