持续集成(CI)使用TFS, Visual Studio和NuGet与Artifactory
第二部分-“天裂开了吗?”
在本博客的第一部分中,我们介绍了样例项目的下载、Artifactory PRO的安装、MyLogger库的构建以及将其存储到Artifactory中。在以前的博客我们介绍了Artifactory从远程云存储库代理构建依赖关系的能力,以及如何设置Artifactory。
第二部分将介绍一个Visual Studio解决方案中的三个项目对MyLogger库的使用。这multi-example项目构建api、核心和服务库使用CI构建中的最新mylogger.dll,并需要其他将由Artifactory缓存的远程依赖项。所有构建artifacts将被托管在Artifactory中。还将介绍如何将构建工件从Artifactory staging存储库提升到发布存储库。本博客的最后一部分将展示如何将存储在Artifactory中的工件连接回Visual Studio和TFS数据库。
所有需要的源代码都可以从本博客的第1部分中获得。Artifactory假定已完成具有适当存储库的Pro设置。假定具备Visual Studio/TFS知识。
创建多示例构建定义
接着,我们在Visual Studio中创建一个新的多例构建定义来构建多例解决方案。下面突出显示了自定义和此构建定义的相关部分。在图片下面还有每个定制的简要说明。此构建的结果将创建三个库,并将每个库打包到一个NuGet包,并将这些包推送到Artifactory服务器。

NuGetExampleMultiProjectsExamplemulti-example.sln是构建和存储api.dll、core.dll和services.dll的解决方案。
p:DistribPackages=true -这是在Nuget中创建的自定义MSBuild任务.目标文件。DistribPackages任务意味着将Nuget包从构建站点“推送”到本地的artifactory存储库。
当NuGet管理被添加到TFS中的解决方案中,它添加了NuGet.exe,一个NuGet.exe.配置和一个NuGet.目标文件到解决方案文件。在这个项目中,我们签入NuGet.配置和Nuget.目标文件,而不是NuGet.exe。NuGet的.targets文件被定制为包含部署到Artifactory所需的MSBuild目标。
ProcessTemplatesScriptsUpdateNuGetPackages。ps1 -这是一个自定义的“预构建”powershell在编译之前运行的脚本。这个脚本的主要目的是确保在构建中包含了最新的MyLogger包和其他必需的二进制文件。
$(BuildDefinitionName)_1.0.3美元(牧师:.r)—允许用户设置“Major”.小.构建数字。
使用Artifactory中的MyLogger构建多例项目
的multi-example.sln项目包含三个项目-一个用于api核心和服务。它们都使用mylogger.dll以及其他第三方库。之后与NuGet进行了多实例集成.sln文件中,我们需要添加Newtonsoft.json、“MyLogger.dll”和“Ninject.dll”安装到已安装的包中。虽然这些都是在外部存储库中找到的,但它们都将被本地缓存在Artifactory中,并使用虚拟的'回购'仓库,而不必去外面。
下面是NuGet此解决方案的安装包的“包管理器”屏幕和包的屏幕截图.可以为解决方案中的所有或部分项目更新的配置对话。
在构建多例的过程中.sln,我们运行一个UpdateNuGetPackages。ps1 script to make sure we have the latest packages needed for each of the three builds. There is a RestorePackages in the NuGet.目标文件,但这只恢复包中丢失的内容.每个项目的配置文件。
的包.在构建开始时读取配置,并在那时设置版本号。如果一个新的NuGet软件包已经发布,MSBuild将不会获得最新的,因为软件包.配置尚未更新。出于这个原因,我们不得不使用一个小型的预构建powershell脚本更新包.配置文件之前,MSBuild加载这些文件。此问题可能会在构建模板的未来版本中得到解决。


在多示例项目完成后,来自三个项目的所有工件都用NuGet打包并“推”到nuget- Artifactory中的staging-local存储库。这些新存储的工件可以从Artifactory中提取并部署。任何MyLogger项目工件的推广计划,也可能适用于这些工件。

从登台到发布
在包部署和测试之后,可以批准将其提升到“发布”状态。在Artifactory中,我们使用一个发布存储库(例如。nuget-release-local)来存储准备好发布的NuGet包。通过更改每个存储库的组和用户安全设置来维护每个存储库的访问控制。
从本地登台存储库转移到本地发布存储库是一种“廉价的复制”,不占用时间或磁盘空间——“它只发生在数据库中”,很像在一组文件上放置一个标记。
一旦文件在发布存储库中,其他需要使用最新“发布”包的开发人员就可以从nuget-release-local存储库,以确保他们使用的库已经过充分测试并准备投入生产。
下面是Artifactory内部这种推广行动的结果示例。可以通过GUI或脚本进行促销。如果需要,脚本可以连接到一个测试结果或者一个批准签名工作流。通过使用升级,可以防止DevOps组部署来自登台CI构建存储库(未被QA批准的代码)的代码,而不是发布存储库。

从Artifactory连接回TFS
在NuGet包存储在Artifactory中之后,我们可以通过执行以下操作返回到存储在TFS中的构建信息:
去Artifactory - - - >Artifacts -> NuPkg信息- - - - - ->点击MyLogger下一般选项卡
从这里,您可以查看原始构建,阅读诊断日志,查看已经运行的测试,或者只是查看TFS数据库中的其他构建详细信息。

从Artifactory可以直接链接到TFS项目,以及用于实际推入NuGet包到Artifactory的构建。下面你可以看到这个版本的更多细节。

如果您希望看到在Artifactory内部的NuGet包中找到的构建的TFS导入站点中的内容,有一个从TFS Web客户端直接到导入站点的URL链接。

除了校验和为NuGet包存储在Artifactory,其他属性,如项目URL和发布说明URL也可以找到。

此集成没有对构建过程模板进行修改,不依赖于自定义活动,也不需要任何自定义csharp代码。所使用的Powershell脚本是一个轻量级脚本,可以根据用户的需要进行弃用或扩展。
所有这些努力的结果是什么?
Artifactory目前的Pro,很少定制,允许使用Visual Studio和TFS构建一个存储工件(二进制文件)。Artifactory目前允许开发人员在由开发人员控制的本地服务器上托管远程构建依赖项。为其他内部开发小组使用而构建的库可以托管在同一个Artifactory服务器上。然后,这些构件可以通过CI管道进行提升,并从Artifactory发布批准的存储库部署到生产或客户。
对于本例,我们修改了标准nuget.目标文件,添加一个简单的powershell脚本,并在Artifactory中定制存储库。使用MSBuild可以实现相同或类似的结果任务, TFS构建工作流定制,powershell脚本、Visual Studio插件或所有这些的组合。
随着需求的增加,所有这些工具的集成有望得到改善。


