通过持续集成构建依赖项和本地构建
Build dependencies and local builds with continuous integration
我们公司目前使用TFS 进行源代码控制和构建服务器。我们的大部分项目都是用 C/C++ 编写的,但我们也有一些 .NET 项目,如果将来需要使用其他语言,我们不想受到限制。
我们想使用 Git 进行源代码控制,并且我们正在尝试了解构建服务器的最佳选择。我们已经开始研究 TeamCity,但有一些问题我们遇到了问题,无论我们选择构建服务器如何,这些问题都可能是相关的:
- 构建依赖项 - 我们希望能够控制每个
<project, branch>
的构建依赖项。例如,让 <MyProj, feature_branch>
依赖于 <InfraProj1, feature_branch>
和 <InfraProj2, master>
。
从我们所看到的情况来看,要做到这一点,我们可能需要使用 Gradle 或类似的东西来构建我们的项目,而不是普通的 MSBuild。这个对吗?有没有更简单的方法来实现这一目标?
- 本地构建 - 显然我们也希望能够在本地构建项目。当引入项目依赖项时,这会成为一个问题,因为我们需要一种方法来引用这些资源或将它们复制到本地以便构建成功。这通常是如何解决的?
如果有任何意见,我将不胜感激,但涵盖这些问题的示例设置也会有很大帮助。
恕我直言,您提到的两个问题实际上都属于配置管理类别,因此,正如您所说,与构建服务器的选择无关。
项目构建的工作区(无论是集中式还是本地)应该真正包含构建所需的所有资源。
你怎样才能做到这一点?有一个项目 "metadata" git 回购与 "content" 包含所有项目组件及其依赖项的文件(每个都有自己的git/other repo)和它们的确切版本——有效地将它们连贯在一起(你可能会发现在这个组件中存储其他元数据也很有用,比如如果使用混合组件特定的 SCM 信息跨工作区的 SCM)。
工作区拉取包装器脚本将首先拉取此 metadata git 存储库,解析 content 文件,然后拉取所有根据 content 文件信息的其他项目组件及其依赖项。在这样的工作区中的任何构建都将拥有它需要的所有部分。
当需要修改项目组件中的代码或其中一个依赖项的版本时,您还需要更新 content 文件中的 [=22] =]metadata git repo 以反映更新并提交它 - 这就是您的项目作为一个整体取得连贯进展的方式。
当然,实际管理依赖关系是另一回事。那里有很多意见,有些甚至相互矛盾。
我们公司目前使用TFS 进行源代码控制和构建服务器。我们的大部分项目都是用 C/C++ 编写的,但我们也有一些 .NET 项目,如果将来需要使用其他语言,我们不想受到限制。
我们想使用 Git 进行源代码控制,并且我们正在尝试了解构建服务器的最佳选择。我们已经开始研究 TeamCity,但有一些问题我们遇到了问题,无论我们选择构建服务器如何,这些问题都可能是相关的:
- 构建依赖项 - 我们希望能够控制每个
<project, branch>
的构建依赖项。例如,让<MyProj, feature_branch>
依赖于<InfraProj1, feature_branch>
和<InfraProj2, master>
。 从我们所看到的情况来看,要做到这一点,我们可能需要使用 Gradle 或类似的东西来构建我们的项目,而不是普通的 MSBuild。这个对吗?有没有更简单的方法来实现这一目标? - 本地构建 - 显然我们也希望能够在本地构建项目。当引入项目依赖项时,这会成为一个问题,因为我们需要一种方法来引用这些资源或将它们复制到本地以便构建成功。这通常是如何解决的?
如果有任何意见,我将不胜感激,但涵盖这些问题的示例设置也会有很大帮助。
恕我直言,您提到的两个问题实际上都属于配置管理类别,因此,正如您所说,与构建服务器的选择无关。
项目构建的工作区(无论是集中式还是本地)应该真正包含构建所需的所有资源。
你怎样才能做到这一点?有一个项目 "metadata" git 回购与 "content" 包含所有项目组件及其依赖项的文件(每个都有自己的git/other repo)和它们的确切版本——有效地将它们连贯在一起(你可能会发现在这个组件中存储其他元数据也很有用,比如如果使用混合组件特定的 SCM 信息跨工作区的 SCM)。
工作区拉取包装器脚本将首先拉取此 metadata git 存储库,解析 content 文件,然后拉取所有根据 content 文件信息的其他项目组件及其依赖项。在这样的工作区中的任何构建都将拥有它需要的所有部分。
当需要修改项目组件中的代码或其中一个依赖项的版本时,您还需要更新 content 文件中的 [=22] =]metadata git repo 以反映更新并提交它 - 这就是您的项目作为一个整体取得连贯进展的方式。
当然,实际管理依赖关系是另一回事。那里有很多意见,有些甚至相互矛盾。