【发布时间】:2022-07-07 21:47:34
【问题描述】:
我有一个具有以下结构的项目:
-
码头工人/码头工人文件
-
linux/*.xz(内核源代码)
-
*.sh
-
詹金斯文件
基本上,这个管道是在 docker 容器内构建一个 linux 内核。
我们将 bitbucket 与 jenkins 和 artifactory 结合用于 CI/CD。
目前 docker 镜像的构建是手动的:开发者在本地构建并推送到 artifactory。
管道仅拉取预构建的 docker 映像以供执行。
由于这种手动交互很烦人,因此应该自动化。
典型场景可能如下所示:开发人员更改 Dockerfile 和其他一些资源。
这要求我们首先重建容器,将其推送到工件,然后开始构建。
是否有使用上述技术的直接方法来做到这一点?
我的方法是(主要是自己的实现)根据 git 版本标记 docker 图像。
当上述管道启动时,它会查询上次更改的 Dockerfile 的 git-rev 并尝试拉取
容器。如果这是可能的 - 很好。否则运行“docker build”并推送新容器。然后在里面运行内核构建。
这是正确的做法吗?
【问题讨论】:
-
据我了解,这有两个缺点:1)在每次管道运行时构建容器,这似乎有点多余和浪费时间。 2) 不可重现的构建,因为容器在每次运行时都会发生变化。我认为这是容器环境提供稳定条件的主要好处。
-
如果您的 CI 系统以一致的方式构建它,使用签入存储库的源代码,那应该是相当可重现的。
-
我的意思主要是 Dockerfile 中定义的工具。例如。 gcc, debootstrap, ...如果我不使用明确的版本,这些可能会以不同的方式工作,或者今天比明天输出其他二进制文件。