Git、TFS、Nuget 和 Artifactory 的持续开发与集成 – 第一部分





5.00/5 (1投票)
在本文中,我们将采用一种逐步实施的方法,来实现包含分布式版本控制系统、制品库、包管理器和第三方库包存储库的持续开发与集成模型。
在本文中,我们将采用一种逐步实施的方法,来实现包含分布式版本控制系统、制品库、包管理器和第三方库包存储库的持续开发与集成模型。我们还将探讨在模型中私有制品库的实际用途。在第一部分中,我们将实现不带私有制品库的模型,然后在文章的第二部分中,我们将通过使用私有制品库来优化模型。
使用的工具
实施过程中使用的工具如下:
开发 IDE | Visual Studio 2015 |
存储库 | Git |
版本控制 | Git-TFS |
包管理器 | Nuget |
公共包存储库 | Nuget 库 |
制品库 | JFrog |
构建工具 | TFS |
部署工具 |
持续开发与集成的步骤
- 设置 Git 存储库。
- 从 Git 客户端连接到存储库。
- 设置 Artifactory。
- 确定适合私有 Artifactory 的包。
- 创建并发布包到 Artifactory。
- 组织您的应用程序,在构建项目时通过私有 Artifactory 使用所有二进制文件和公开可用的第三方存储库。
- 构建源代码。
- 部署制品。
实现
创建团队项目并设置 Git 存储库
在 Visual Studio Team Services/TFS 界面上创建团队项目。注册并创建您的团队项目。从版本控制选项中选择 Git。
项目将成功创建。
导航到项目。您将看到项目的首页。导航到项目的“代码”页面。
创建新项目并选择 Git 作为版本控制后,将默认创建一个新的 Git 存储库。“代码”页面显示新创建的空 Git 存储库的信息。页面显示克隆 URL。此 URL 将用于从任何 Git 客户端克隆已创建的存储库。
您也可以通过存储库下拉列表创建新的存储库。
从 Git 客户端克隆存储库
我们已经创建了 Git 存储库。现在是时候向存储库添加源代码了。要添加代码,您需要先使用 Visual Studio Git 插件将存储库克隆到本地计算机。获得本地克隆后,您就可以开始向存储库添加代码了。
可以使用以下方式克隆远程存储库:
- 打开 Visual Studio 2015。
- 打开 Visual Studio Team Explorer。
- 单击“**管理连接**” -> “**克隆**”。
- 需要 Git 存储库 URL。
输入克隆 URL 和本地存储库路径。
存储库将成功克隆。
将源代码添加到存储库
从 Team Explorer 在 Visual Studio 中创建新项目。如果要添加现有项目,请从 Team Explorer 打开该项目。
创建一个新的控制台应用程序。
将创建一个控制台应用程序。请注意,您的新解决方案显示在“首页”下的“解决方案”中。
在 Team Explorer 中,导航到“更改”页面。
新应用程序出现在“已包含的更改”部分。输入提交消息,然后单击“提交并推送”按钮将更改提交到本地存储库,然后将更改推送到 Visual Studio Team Services。
您的代码将成功推送到本地存储库和 TFS。
注意:
在“更改”页面上,如果您尚未配置用户名或电子邮件地址,系统会提示您。如果您在此计算机上以前未使用过 Git,则可能需要配置用户名和电子邮件地址。您也可以从 Team Explorer 中的“设置”页面,在“Git”部分下的“全局设置”中访问 Git 设置页面。
从 Git 远程存储库查看已添加的代码
单击 TFS 界面中的“代码”菜单,查看已推送到服务器的更改。
与公共包库(Nuget)集成
企业应用程序包含许多公开可用的库(例如 Log4Net、jQuery 等)。过去,我们会将这些库与源代码一起检入版本控制系统。通过新的 CI 和 CD 模型,我们将不再将这些库检入源代码。相反,我们将在应用程序中包含一些配置文件,并指示我们的项目从公共包库(如 Nuget)获取所需的二进制文件。在构建服务器(例如 TFS)中构建代码时,构建过程将使用配置文件从包库位置下载具有适当版本的库。
为了实现此方法,让我们在示例应用程序中包含一个第三方库。
从 VS2015 IDE 安装第三方 Nuget 包
让我们在应用程序中添加第三方库 Elmah。以下是添加和安装 Nuget 包的步骤:
转到“**工具 - 选项**”。然后是“Nuget **包管理器 - 包源**”,或者单击“**项目添加引用**”上下文菜单中的“管理 Nuget 包”。默认情况下,“**NuGet 包管理器**”窗口将引用位于“Nuget.Org”的所有包源,如下图所示。
转到“**工具 - 选项**”。然后是“**Nuget 包管理器 - 解决方案的 Nuget 包管理器**”。搜索第三方库 Elmah。
为您的项目选择库并安装。
第三方库 Elmah 将被成功安装并自动引用到项目。将自动创建一个名为 packages.config 的文件。该文件包含第三方或二进制文件的包 ID 和版本号。
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="elmah" version="1.2.2" targetFramework="net452" />
<package id="elmah.corelibrary" version="1.2.2" targetFramework="net452" />
</packages>
我们将把此文件检入源代码管理,而不是二进制文件(例如 ELmah)。在构建时,构建过程将使用此文件获取项目中所需二进制文件的包 ID 和版本号。
在解决方案正下方创建一个名为 Nuget.config 的文件,并添加以下行:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<solution>
<add key="disableSourceControlIntegration" value="true" />
</solution>
<config>
<add key="repositoryPath" value=".\packages" />
</config>
<packageSources>
<add key="nuget.org" value="https://nuget.net.cn/api/v2/" />
</packageSources>
</configuration>
Nuget.config 仅在与 TFS 集成时才生效。“DisableSourceControlIntegration”值限制将二进制文件检入源代码管理。“PackageSources”定义了 Nuget 包源的源 URL。目前,我们正在从 Nuget 公共包库(https://nuget.net.cn/api/v2/)访问二进制文件。
注意
为了在 TFS 中成功构建代码,在解决方案文件(.sln)级别创建 Nuget.config 非常重要。稍后,在“构建解决方案”步骤中,TFS 构建过程会根据 <HintPath> 在项目根目录下查找一个名为“packages”的文件夹。根目录下不存在该文件夹将导致构建失败。
为 Elmah 实现添加一些代码。
class Program
{
static void Main(string[] args)
{
//Use third party Elmah
Elmah.MemoryErrorLog log = new Elmah.MemoryErrorLog();
log.Log(new Elmah.Error(new Exception("Hello ELMAH!")));
List<Elmah.ErrorLogEntry> list = new List<Elmah.ErrorLogEntry>();
log.GetErrors(0, 100, list);
foreach (Elmah.ErrorLogEntry err in list)
{
Console.WriteLine(err.Error.Exception.Message);
}
Console.ReadLine();
}
}
在 VS2015 中构建代码。
将修改后的解决方案提交并推送到 Git 存储库。
在 TFS 中构建项目
现在是时候在 TFS 中构建我们的项目了。我们将从 Git 存储库拉取源代码,并从 Nuget 公共包库拉取二进制文件。让我们相应地创建构建定义。
构建定义
从 VSTS 访问 TFS 界面,导航到已创建的项目。选择“**生成**”菜单。
单击“**创建新生成定义**”按钮以创建新的生成。
选择 Visual Studio 作为生成模板。
存储库和 master 分支将默认选中。验证相同项并继续。
创建生成。
现在我们需要添加生成步骤。我们的示例应用程序将从公共库获取 Elmah Nuget 包,然后构建源代码。因此,我们暂时定义两个生成步骤:
- Nuget 还原。
- 构建解决方案。
为 Nuget 还原添加生成步骤。
- 提供解决方案或 Package.config 文件的路径。
- 提供 Nuget.config 文件的路径。
选择“**构建解决方案**”步骤。提供解决方案文件(.sln)的路径。
保存生成。
选择“**队列新生成**”并队列生成以执行。
项目将成功构建。
观察 Nuget 还原 生成步骤的日志。Nuget 包 Elmah 从 Nuget 公共包库(https://nuget.net.cn/api/v2/)中获取。
因此,我们通过 Nuget 公共库在一定程度上实现了持续集成和开发方法。我们将源代码与二进制文件隔离,并在构建时从公共包库中拉取二进制文件。但是,这种方法仍然留下一些待解决的问题:
- 这些包驻留在公共库中。许多用户正在从公共包存储库下载包。一个典型的项目可能需要 Nuget 存储库中的 5-10 个包。如何减少网络流量并优化我的构建?
- 如果公共包库存储库宕机或网络出现问题怎么办?
- 如何控制组织中的人员从公共包库下载的内容,而不是使用内部自定义库?
- 如何控制应该首先搜索哪些公共库来查找包?
- 如何在不将其暴露给公共包库的情况下使用内部自定义包?
所有这些待解决的问题都引导我们使用开发者和公共包库(Nuget)之间的中间私有存储库。我们可以使用 Artifactory 作为中间件来解决上述问题。
在下一部分中,我们将通过使用 JFrog Artifactory 来优化我们的持续集成和开发模型。