VSTS将定义构建为yaml第1部分:什么和为什么?
5(100%) 1投票[选举]

Visual Studio Team Services (VSTS)最近获得了将构建定义创建为YAML文件的能力。该功能目前处于预览状态。在这篇文章中,我将解释为什么这是VSTS平台的一个很好的补充,以及为什么您可能希望用这种方式定义您的构建。在下一篇文章中我将通过一个使用这个特性的例子,我还将提供一些技巧和指向文档和指导的链接,我发现这些在我自己构建一些构建定义时非常有用。

什么是构建定义?

如果您使用某种类型的构建服务器(您几乎肯定应该这样做!)您需要告诉构建服务器如何实际构建您的软件。VSTS的概念是构建配置,它指定了如何以及何时构建应用程序。其中的“如何”部分是构建的定义.通常情况下,构建定义将概述系统应如何获取源代码,对其应用一些操作(如将代码编译成二进制文件)。并发出构建构件.这些工件通常随后传递到a释放配置,这将把它们部署到您的发布环境中。
在一个简单的静态网站中,构建定义可能只是将一些文件从源代码控制系统复制到构建构件中的一个步骤。在。net核心应用程序中,通常使用多特耐特要构建的命令行工具,测试中,并发布您的应用程序。其他应用程序框架和语言将有自己的构建构件的方法,在一个非平凡的应用程序中,构建应用程序所涉及的步骤可能会变得相当复杂,甚至可能触发PowerShell或Bash脚本,以允许进一步的灵活性和高级控制流和逻辑。
直到现在,VSTS实际上只允许我们在其web编辑器中创建和修改构建定义。这是开始新的构建定义的好方法,你可以浏览可用步骤的目录,将它们添加到构建定义中,并根据需要进行配置。您还可以定义和使用变量,以便跨步骤重用信息。然而,以这种方式定义构建定义有一些主要的缺点。

为什么在YAML中存储构建定义?

构建定义实际上只是另一种类型的源代码。构建定义只是应该如何构建应用程序的规范。确切的步骤列表,它们运行的顺序,是我们定义系统行为的一部分的方式。如果我们采用DevOps思维,然后我们要确保我们治疗全部的我们的系统作为源代码,包括我们的构建定义,我们要认真对待这个源代码。
2017年11月,微软宣布VST现在能够运行定义为yaml文件的构建,而不是通过可视化编辑器。YAML文件被检入源代码控制系统,和其他文件完全一样。这类似于Travis CI允许在yaml文件中指定构建定义的方式,对于那些希望将构建定义视为代码的人来说,这是一个好消息。它给了我们很多好处。

版本控制

我们可以保持构建定义的版本化,并且可以随着时间的推移跟踪构建定义的历史。这对听力很好,以及确保我们有能力咨询或回滚到以前的版本,如果我们不小心做出了破坏性的更改。

使用代码保持构建定义

我们可以将构建定义与它构建的实际代码一起存储,意思是我们把所有的东西都保持在一个地方。直到现在,如果我们想完全理解应用程序的构建方式,我们必须查看代码存储库以及VSTS构建定义。这使得整个过程更难理解和解释。在我看来,我们必须记住在更改期间检查或更新的位置越少越好。

分支

关于最后一点,我们还可以利用源代码控制系统的重要特性,比如分支。如果您的团队使用Github流或类似的基于Git的分支策略,这是特别有利的。
让我们以向. net核心应用程序添加一个新的单元测试项目为例。直到现在,您可以这样做的方法是建立一个特性分支,您可以在这个分支上开发新的单元测试项目。在某种程度上,您需要将这些测试的执行添加到您的构建定义中。这将需要一些谨慎的时间和考虑。如果在合并分支之前更新生成定义,然后,在此期间运行的任何构建都可能失败——它们将尝试运行一个还不存在于特性分支之外的单元测试项目。另外,您可以使用构建配置的草稿版本,但是你需要精确地计划何时发布该草案。
如果我们在yaml文件中指定构建定义,然后,对构建过程的更改只是在我们的特性分支上发生的另一个更改。功能分支的YAML文件将包含一个运行单元测试的新步骤,但是主分支在其yaml文件中还没有定义该步骤。当在合并之前在主分支上运行构建配置时,它将获得构建定义的旧版本,并且不会尝试运行新的单元测试。但是任何基于我们的功能分支的构建,或者在我们的功能分支合并后的主分支,将包括新的测试。
这是非常强大的,特别是在项目的早期阶段,您要频繁地添加和更改构建步骤。

同行评审

更进一步,我们可以像查看任何其他代码更改一样,查看对构建定义yaml文件的更改。如果我们使用pull request (PRs)将我们的变更合并回主分支,那么我们就可以在PR中看到构建定义的变更,我们的团队成员可以像检查其他代码文件一样对它们进行严格的检查。同样的,他们可以确保应用程序代码中的更改反映在构建定义中,反之亦然。

重用

以类似yaml的简单格式存储构建定义的另一个优点是能够复制和粘贴文件,或者文件中的部分,并在其他项目中重用它们。直到现在,从一个构建定义复制到另一个构建定义非常困难,并需要手动设置步骤。既然我们可以在yaml文件中定义构建步骤,这通常只是一个复制和粘贴的问题。

掉毛

在许多编程环境中,一种常见的技术是产品毛羽,这包括对文件运行某种分析,以检查潜在的错误或策略违反。一旦在YAML中定义了构建定义,如果我们想要编写一个工具来进行分析,我们可以执行相同类型的分析。例如,我们可以编写一个自定义linter来检查我们是否在构建定义中意外地添加了任何凭据或连接字符串,或者我们没有错误地使用了错误的变量语法。YAML是一种标准格式,可以在许多不同的平台上轻松解析,所以写一篇简单的短篇文章来检查你的特定政策并不是一项复杂的工作。

抽象与声明指令

我是……的超级粉丝声明编程——表达您的意图的电脑。声明性编程,软件根据您的高级指令找出正确的方法。这是许多不同类型“理想状态”自动化背后的想法,在抽象中,比如c#中的LINQ。这可以与an相比较必要的的方法,其中指定了实现该意图的显式步骤序列。
我见过一些团队在构建服务器中采用的一种方法是使用PowerShell或Bash脚本来完成整个构建。这提供了我在上面概述的好处,因为这些脚本文件可以检入源代码控制。然而,通过使用原始脚本文件,这意味着这些团队无法利用VSTS提供的所有内置构建步骤,或者可以添加到VSTS实例的自定义步骤的生态系统。
VSTS中的构建定义是声明性方法的一个很好的例子。它们本质上是一系列步骤的抽象。如果你设计好你的构建过程,新来者应该可以查看您的构建定义并确定步骤的顺序,为什么会这样,以及副作用和后果。通过使用诸如VSTS构建任务之类的抽象,与手工编写命令行步骤序列的命令式构建逻辑不同,您正在帮助提高代码的可读性——最终,您可以通过允许软件将您的指令转换为操作来提高性能和质量。
YAML构建定义为我们提供了在源代码控制中保持构建定义的所有好处,但仍然允许我们充分利用VSTS构建系统的功能。

内联文档

YAML文件允许添加评论,这是记录构建过程的一种非常有用的方法。经常地,构建定义可能会变得相当复杂,做一些看起来很琐碎的事情需要多个步骤,因此,能够在定义本身中记录过程是非常有用的。

总结

希望通过这篇文章,我已经说服您,将构建定义存储在YAML文件中要比使用VSTS web UI定义如何构建应用程序更加整洁和明智。在下一篇文章中,我将通过一个例子说明如何在YAML中建立一个简单的构建定义,并提供一些我发现有用的建议。

类别:
Visual Studio在线, Visual Studio团队服务
标签:
, , ,

1
留下一个回复

留下一个回复

订阅
最新 最古老的 大多数投票
通知的
dylangeorgefield
客人

伟大的文章约翰,谢谢!

跟着我们!

克劳德解决方案博客-关注我们!