除了要构建的工件的源代码外,构建管道通常还需要访问第三方资源。这些第三方资源中的每一个都会在构建中引入风险因素,例如:


分发存储库暂时不可用,因此安装分发软件包暂时失败。
分发存储库永久不可用。 ,和以前一样,甚至更糟。

可以随意扩展此列表,在研究导致某些第三方资源消失的各种原因时,听起来很有趣,这首先对我们造成了灾难性的后果:构建管道已损坏。

构建docker映像时覆盖以下两种情况的最佳方法是什么:


缓存使用curl或wget。
缓存Debian软件包。

有几种可行的策略在这里可以考虑。例如,使用代理并将配置系统配置为通过此代理路由其所有请求。第二个便宜的可能性是将curl调用包装以将结果存储在本地缓存中。

(在这个问题中,我将考虑在构建管道的多个单元之间共享缓存,这是次要问题。重要性。)

#1 楼

我并不是特别熟悉Docker,但听起来很像一个问题,即在构建需要存储外部依赖关系(DLL或jar)的普通.NET应用程序或Java应用程序时会遇到的问题。 >为了解决这个问题,我非常喜欢人工制品。最受欢迎的两个是sonatype的Nexus和JFrog的Artifactory。两者都提供免费的开放源代码版本,并且都将具有某种方式来存储自定义软件包或将其用作原始软件仓库。还有其他选择,我只列出了这两个,因为我已经与他们合作过,并且知道他们会做您需要的事情。作为奖励,您也许还可以使用它们直接管理docker映像。查看他们的能力。 (感谢Karl Harnagy提供的链接)

请注意,其中某些选项可能需要一个或另一个付费版本,因此YMMV。工件的概念(从经验丰富的詹金斯和团队城市中可以做到这一点,其他人也可以这样做),应该可以使您直接获得相似的结果。融入其他技术或推出自己的技术。我个人喜欢利用已有的资源,这可以长期减少所需的维护,并在需要时在其他地方寻找新的挑战时更加轻松。

评论


为JFrog Artifactory +1。在要求严格的环境中工作,要求我们不要依赖外部资源,以确保即使从现在起5年后仍具有100%可复制的内部版本。因此,我们将所有内容都缓存在Artifactory中-Docker基本映像,npm和nuget程序包,第三方安装程序等。

–yossiz74
17年4月19日在13:40



这样做的好处还在于,通常可以通过maven,nuget,npm等将缓存的工件直接提供给开发人员在他们的系统上使用。自定义缓存解决方案需要做更多的工作。

– Newtopian
17年4月19日在13:44

查看ProGet,您还可以在此处找到所有Universal Package管理器的细分。

–卡尔·哈纳吉(Karl Harnagy)
17年4月19日在16:14

谢谢,最后我检查了ProGet几乎仅限于.NET领域(前一阵子),我现在发现它们现在是一种功能强大的工件,外观上与我提到的两者相当。谢谢 !

– Newtopian
17年4月19日在16:20

#2 楼

看起来您想要的不是缓存,而是镜像。因为您的要求必须处理永久不可用的软件包,所以您需要自己将软件包持久保存在比缓存更永久的位置。过去,我们将软件包存储在S3等基于云的持久存储中。但是,没有什么可以阻止您在构建服务器上设置自定义文件存储。

更具体地说,设置代理服务来查找文件存储中的资源可能是最简单的(S3)并返回找到的包。否则,它只会从上游请求资源,填充文件存储,然后返回包。