我对自动化构建过程和持续集成相当陌生,并且正在为一个小型开发团队设置构建过程/服务器。我们正在使用 SVN、CMake 和 Jenkins 构建服务器。源语言是 C++。
假设我们有两个项目,library
(一个 dll)和executable
. executable
链接到library
,因此要构建executable
您需要 .lib 和 .h 文件library
。要运行executable
.dll,您需要 .dll(可能还有调试符号文件)library
。
当构建整个东西时,它相当简单,你从存储库中获取最新的源代码library
然后构建executable
。
但是,我们有多个开发人员,每个开发人员通常一次只从事一个项目。我们的 CMake 脚本允许您选择要构建的项目,因此John
可能有一个仅 builds 的设置executable
,而Bob
仅 builds library
。放弃这不是一个选择。
所以如果对源码Bob
进行修改library
和提交,John
就需要获取编译好的.lib和.dll文件(因为他没有编译library
)。
现在,二进制文件在 svn. 在每次编译期间,CMake 复制src/bin
到build/bin
作为预编译步骤,然后编译选择的任何项目(替换 中的适当二进制文件build/bin
),最后 CMake 复制build/bin
到src/bin
.
这意味着当Bob
进行更改时,他不仅会提交源文件,还会提交编译后的二进制文件,并且当John
更新他的工作副本时,他会获得适当的二进制文件,而不必进行任何手动文件替换。
这已经工作了一段时间,但我真的不喜欢它有几个原因。是否有更少的黑客方式来设置这样的东西?(实际上有4个开发人员,大约12个项目,有些是不依赖任何东西的库,有些是依赖其他库的库,还有一些是依赖其他库的可执行文件。)
编辑:这是我正在考虑的过程:
使用 Artifactory 或 Nexus 等工件跟踪系统在构建后存储二进制文件,以及用于生成这些二进制文件的头文件
在 CMake 中,每个项目都被标记为已编译或预编译。编译的项目是从常规存储库生成的。如果预编译的项目二进制文件和标头已过期,则会从 Nexus 下载它们,并且 CMake 会适当地链接和包含。标题也与工件一起保存,以防止我在对 Dave Bacher 的回答的评论中描述的竞争条件。
我唯一不喜欢的是我必须做一些 CMake-foo 来检查工件是否过时并下载它们,但我想没有真正的替代方案,因为显然我正在尝试设置是如此不标准。