如何将发布的二进制文件保持在版本控制之下?这样可以跟踪在每个发行版之间更改了哪些内容。我的意思是将发布的二进制文件与源存储库分开。发行的二进制文件可以从Continuous Integration软件构建,也可以手动编译。
如何将发布的二进制文件保持在版本控制之下?这样可以跟踪在每个发行版之间更改了哪些内容。我的意思是将发布的二进制文件与源存储库分开。发行的二进制文件可以从Continuous Integration软件构建,也可以手动编译。
Answers:
两种选择:
a)不要。只要确保您具有可复制的确定性构建,即使用相同的配置构建相同的源代码控制修订版就始终会产生完全相同的二进制文件。
b)指定某个目录作为发布构建的权威来源。确保上传二进制文件是部署/运输过程的一部分,并确保备份计划覆盖了build-build目录。您在这里不需要任何版本控制;构建是一次写入的,如果您需要更改任何内容,则可以进行新的构建。
无论哪种方式,由于多种原因,二进制文件和其他构建输出都不属于源代码控制。
将工件存储库用于二进制文件,而不是版本控制系统。发行的二进制文件的特定版本不应该随时间更改,因此版本控制没有意义,因为文件不会更改。
例如,将Maven存储库视为用于归档/发布/提供发行版和其他二进制文件(例如文档)的存储库
只需将它们放进去就可以了。除非您正在使用git(合并二进制文件的方式不佳,所以您必须自己管理它们)或您提交它们的次数过多(仅在提交时提交),否则就没有问题。准备发货,而不是每次建造时都可以)。
大多数SCM增量二进制文件都很好,我们过去通常将2Mb资源dll放入我们的SVN中,并且每次都会增量到几kb。
我听到很多争论,说SCM是源文件,而不是二进制文件,但是当您认为大多数软件都由图像组成时,即使它们只是图标文件,这显然是错误的。它们是二进制文件,但它们是源文件的一部分,因此请将它们放入文件中,不要过于拘泥于此。我还听说您可以仅在需要时重建二进制文件(通常是这种情况),但是对于不再受积极支持的旧系统,这可能会花费大量时间。如果您必须仅使用较旧的Service Pack或修补程序来重新创建系统,以与3年前用于构建二进制文件的系统相对应,那么您很高兴将当时的bin添加到SCM中。
唯一需要担心将构建添加到SCM的情况是,如果您在构建服务器过程中自动进行了构建,请不要这样做。您将使用对您没有好处的构建来填充SCM。而是仅在发布它们时添加它们。这样,您就可以确切地了解客户拥有什么,并且可以使用客户正在使用的二进制文件来重现客户报告的所有问题,而不是已经重建的二进制文件(例如,使用编译器或OS的最新更新)。
最好的解决方案是将CI系统专用于所有组织上重要的构建(发行版,候选发行版等)。
这系统地将发布的二进制文件与存储库内容相关联,而不必将二进制文件实际存储在存储库中。
例如,如果您使用的是SVN,请使用主要分支机构的方案;在/ trunk中进行日常开发,并在每个发行版就绪后为其创建/ tag。
配置您的CI系统以从标记以及从中继构建,并使其将输出写入网络目录,该网络目录的结构反映了回购协议的顶级结构:
构建系统将需要将/ builds / trunk /目录视为循环缓冲区,存储最后的n个构建,并删除旧的构建。
在/构建/标签/目录下,在另一方面,是一个永久性的存储。构建工件本身存储在目录中,该目录具有根据以下方案生成的名称:
其中[rev]是SVN修订版ID,[date]是YYYYMMDD格式的日期,[build_id]是3位数字的唯一计数器,从第一个构建版本开始递增,从而使每个构建目录都是唯一的。
上面详述的过程为您带来以下好处:
构建工件被系统地绑定到生成它们的源,因此您可以非常容易地找到特定构建工件的源(反之亦然)。
这构成了进一步的发行自动化的基础。例如,自动生成发布文档等...