总结评论:目标是将两个其他存储库的内容构建为Docker镜像。因此,我们希望在同一构建阶段同时使用git和docker,或者至少尝试这样做。我提供了不同的选项,可以用来实现这一目标。
选项1:将提取逻辑迁移到Dockerfile中
与其在构建镜像上胡闹,我更愿意将此逻辑迁移到我的Dockerfile中。通常情况下,我有更容易处理此类事情的方法,在Dockerfile中添加一个层以进行git和删除操作比尝试在包含docker和git的构建镜像中更快。
但这取决于您的Dockerfile和您正在使用的Docker基本图像,使用debian/alpine等系统很容易实现,它们有自己的软件包管理器。
选项2:构建包含docker和git的Docker镜像
我最不喜欢的是这种选择。始终存在正确设置docker或另外安装git的问题。但我也会在这里概述该过程。
在这种情况下,您需要拥有自己的Docker镜像,其中您要么:
- 选择Docker镜像并安装Git
- 选择Git镜像并安装Docker
- 从头开始构建一个全新的镜像
- (您可以尝试找出使用的软件包管理器,并在脚本块中安装它)
但这增加了复杂性,比执行Option 1.更费力,而且提供的安全性较Option 3.较低。
Option 3: 使用API而非GIT(我推荐的方式)
不使用git来获取内容,还有API https://docs.gitlab.com/ee/api/repositories.html#get-file-archive
它允许您将特殊的ref下载为zip/tar等格式,比git checkout更易于使用。这也可以与Option 1.结合使用,因为它允许通过curl轻松获取内容。
这个选项的好处是,不会加载git历史记录,只会加载当前状态。这可能会改善构建时间。
Option 4: 多个构建步骤
不要试图合并docker构建和git checkout,可以将两者分成两个作业。第一个作业使用git提取仓库,第二个作业用于docker构建。
这里需要注意的重点是artifacts
指令,您可以使用它来定义在下一阶段/构建中可用的文件。可以查看https://docs.gitlab.com/ee/ci/yaml/#artifacts,该资源对该指令非常有用。
选项5:使用git子模块
可以将其他存储库作为git子模块添加,而不是手动进行checkout。子模块可以视为指向其他git存储库的子目录。附带了特殊的checkout行为,但是通过更仔细地查看子模块,您应该可以很容易地解决此问题。
请注意设置GIT_SUBMODULE_STRATEGY
,以便获取它们。 https://docs.gitlab.com/ee/ci/runners/configure_runners.html#git-submodule-strategy