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

时间:2019-02-06 16:10:58

标签: node.js docker jenkins 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")
                }
            }
        }
    }

}

图像本身已成功创建。我现在想知道: 1.詹金斯会为每个版本下载我的package.json中的所有依赖项吗? 2. Jenkins会在每个版本中下载所有层吗?

还是詹金斯会注意到依赖关系和/或图像层已经存在?

1 个答案:

答案 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构建缓存时遇到了麻烦,这些缓存破坏了我们的映像。但是,如果构建时间很长,那么缓存清理可能不是一个选择-至少在每次构建之后都不会。