gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:35:11 24 4
gpt4 key购买 nike

我正在开发一个将放入 Docker 镜像中的 React 应用程序。我想使用 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. Jenkins 会在每次构建时下载我的 package.json 中的所有依赖项吗?2. Jenkins 会在每次构建时下载所有层吗?

或者 Jenkins 会注意到依赖项和/或图像层已经存在吗?

最佳答案

长话短说

这取决于您的构建代理使用哪个 docker 守护进程。每个 docker 守护进程都有自己的缓存。


更详细的解释

您正在使用某个插件 (docker-workflow?),它为您的管道提供 docker.build() 步骤。默认情况下,此函数尝试在代理的本地主机上使用 docker 守护程序(通常尝试使用套接字 /var/run/docker.sock)。您还可以在管道内部配置哪个 docker 守护进程与 docker.withServer() {} block 一起使用。

守护进程存储/缓存你的层,所以只要你在构建中使用相同的守护进程,那么它们也都共享一个公共(public)缓存。

如果您将构建分布在多个代理上,并且每个代理都使用自己的本地主机 docker 守护进程,那么它们不会共享公共(public)缓存。

official documentation更详细地解释了这一点。他们提到的另一种技术是在构建代理上与您的 docker 镜像构建共享本地卷(为容器缓存数据部分)。例如,您可以将带有 node deps 的卷挂载到连续的 docker 镜像构建中。这样,即使您清理了 docker 缓存,您也不会在每次构建时重新下载所有 Node dep。

底线仍然是:Jenkins 不会自动为您缓存。缓存在您正在使用的构建工具的范围内。您必须注意将其正确地合并到您的 CI 环境的需求中。但是当然是可以实现的。

小型网站注意事项:在您的 CI 构建中拥有一个干净的 docker 构建缓存可能是个好主意。过去,我们遇到了损坏图像的旧 docker 构建缓存的问题。但是,如果您有一个很长的构建,那么缓存清理可能不是一个选项 - 至少不是在每次构建之后。

关于node.js - Jenkins 在构建时是否缓存依赖项和 Docker 层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54557906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com