特性

如何在TeamCity中使用c#脚本自动化CI/CD任务

最近发布的TeamCity 2021.2引入了一个新的构建运行器-c#脚本.我们为那些希望使用熟悉的c#语法及其所有脚本便利来自动化CI/CD例程操作的用户创建了它。

TL;博士:跑步者的主要优势有:

-它与TeamCity紧密集成,并支持所有便利的功能,如详细的构建日志和参数化的构建属性。
-它是独立于平台的,可以在Docker容器中运行。
-它可以自动恢复NuGet包提到的脚本。
-它可以访问公共、私有和teamcity内部的NuGet提要。

在这篇文章中,我们将探索runner实现的细节,以帮助那些好奇了解它背后的内容的人。为了进行一些练习,我们浏览了两个教程:基本的“Hello World”用于Telegram的高级轮询机器人

为什么在。net项目中使用c#来自动化任务

Windows系统管理员通常使用PowerShell.PowerShell基于。net Core,支持所有常用的轻量级命令和api。

然而,它使用了与c#不同的语法——c#是为。net平台编写程序时使用的语言。而且,如果您为。net创建程序,那么在开发程序时使用单一语法似乎是合理的用于编写其CI/CD过程的脚本。

这篇文章涵盖了c#脚本的基本内容。

我们新的c#脚本运行器可以作为TeamCity构建中c#场景的直接启动器。

c#脚本运行器的需求

跑步者有两个要求:

  • . net 6.0运行时必须在构建代理上可用。最简单的方法是使用已经安装了Docker的容器(但要确保预先安装码头工人您也可以手动安装它。
    请注意,6.0目前处于Beta阶段。一旦正式发布,我们将进行更新我们的自定义工具来支持它。
  • 我们的习俗c#交互式shell必须分发给生成代理。如果您使用TeamCity On-Premises,则需要将其作为代理工具安装.TeamCity Cloud实例会自动接收它。

看到它在常规c#脚本之外增加了哪些特性

教程:运行Hello World脚本

没有更多的麻烦,让我们用新的运行器启动一个简单的脚本:

  1. 创建构建配置在TeamCity 2021.2实例中添加c#脚本建立它的步骤。
  2. 您可以直接在步骤设置中输入c#脚本的主体,或者指定到.csx生成代理上的文件。在本教程中,我们将输入报告Hello World来自项目到构建日志:
WriteLine("Hello World from project " + Args[0])

在这里,arg游戏表示脚本的可选参数数组,其值将在步骤3中指定。

  1. 这次我们只需要一个参数:enter% system.teamcity.projectName %脚本参数字段。这预定义的参数引用当前TeamCity项目的名称。
    该字段支持预定义参数和自定义参数。
  1. 我们将在Docker容器中运行此步骤-让我们在码头工人设置字段:mcr.microsoft.com/dotnet/runtime: 6.0

下面是构建步骤设置的样子:

保存该步骤,您就可以立即运行构建了!检查它的构建日志,看看是否向它报告了“Hello World from ProjectName”行:

使用Kotlin DSL配置c#脚本构建步骤

如果您喜欢使用芬兰湾的科特林DSL我们会照顾你的。下面是上面描述的示例构建配置的代码:

object HelloWorldBuildType: BuildType({name = "Say hello" steps {csharpScript {content = "WriteLine(\" hello World from project \" + Args[0])" arguments = "\"%system.teamcity. "projectName%\"" dockerImage =设置。dockerImageRuntime dockerImagePlatform = CSharpScriptCustomBuildStep.ImagePlatform.Linux } } })

它使用以下参数:

  • 内容:内容c#脚本字段,即脚本代码本身。
  • 参数:内容脚本参数字段。它定义了脚本的可选参数。在我们的例子中,它是% system.teamcity.projectName %,这是当前项目的名称。
  • dockerImage:内容在Docker容器中运行步骤字段。我们准备在Docker容器中运行此步骤,这个参数定义要使用的Docker映像的名称。
  • dockerImagePlatform的值码头工人形象的平台字段。它指出,只要有可能,TeamCity应该更喜欢Linux容器。

自动恢复NuGet包

除了在不同平台上运行c#场景之外,运行器还提供了一个便利:它可以自动恢复必要的NuGet包。它检测所有的用途# r”nuget:……”指令,并将相应的包获取到构建代理。

默认情况下,运行器从NuGet.org恢复包,但您可以在NuGet包来源字段。跑步者也支持私人和TeamCity-internal提要。

自定义c#交互工具

为了支持所有可以运行TeamCity构建的平台(Windows、Linux和macOS),我们必须扩展c# Interactive shell的常规功能。结果就是我们的定制工具,它实现了运行器的独特功能。

这个工具的设计考虑到了TeamCity的特点,与默认的Microsoft解决方案相比,它提供了以下优势:

  • 它是独立于平台的。
  • 它可以访问私有和teamcity内部的NuGet提要。
  • 它提供了扩展的REPL(读取、计算、打印循环)r #命令恢复NuGet包。

该工具的主要目的是为c#脚本运行器提供必要的功能,但你也可以独立于TeamCity使用它:作为一个简单的命令行或交互式shell。让我们看看怎么做!

在TeamCity之外使用自定义c#交互式

在你的机器上安装工具:

Dotnet工具安装Dotnet -csi -g——version 

在哪里<版本>软件包版本(建议使用最新版本),从其NuGet回购

在任何受支持的操作系统上,从命令行运行脚本:

dotnet csi < scriptName > .csx

启动交互模式:

dotnet csi

您可以在工具中找到支持的参数自述.我们计划在接下来的更新中更新和扩展自定义shell。我们最近的目标是提供与TeamCity更紧密的集成,并覆盖更多常见的用例。所有的新特性也将在README中提到。如你有任何意见或建议,欢迎向本网页提交议题及建议书这种回购

教程:运行Telegram bot来批准构建

对于更高级的教程,我们创建了一个Telegram bot,它可以通知开发人员新库版本已编译,并从他们那里收集批准投票。如果编译的库获得批准,TeamCity将增加其版本并将其上传到目标NuGet存储库。

构建配置包括6个步骤:

  1. 启动c#脚本,分析最新版本的MySampleLib打包并计算可能的下一个版本号。
  2. 的下一个版本MySampleLib从图书馆获取最新资料。
  3. 测试这个库。
  4. 通过Telegram bot启动一个新的投票。bot将(1)通知其所有订阅者有关新构建的信息,并(2)创建一个投票,如果步骤2中生成的库准备发布,则该投票允许投票。
  5. 如果在创建投票后的30分钟内收到了所有预期的正面投票,则创建一个新的MySampleLib包与新版本。否则,将导致构建失败。
  6. 将lib包发布到NuGet.org,从而更新以前的版本。

让我们仔细看看使用新的c#脚本运行器的步骤1和步骤4。

步骤1:计算下一个库版本

这一步将启动以下脚本:

使用来;Props["version"] = GetService() . restore (Args[0], "*", "net6.0") . where (i => i. name == Args[0]) . select (i => i. version) . select (i => new version (i.))Major, i.Minor, i.Build + 1)) .DefaultIfEmpty(new Version(1,0,0)) .Max() .ToString();WriteLine($”版本:{道具(“版本”)}”,成功);
  • 3号线:则调用全局函数GetService获取使用NuGet所需的API。
  • 4号线:我们恢复MySampleLib包中。我们引用全局数组arg游戏其中包含在脚本参数字段。在本例中,我们只需要输入一个元素-% demo.package %,它是包的名称。
  • 第7行:我们通过增加当前最新版本来计算下一个版本的包。结果将存储到全局字典中道具在第4行中指定,索引版本.由于字典是全局的,这个值将对其他内置的c#脚本和。net命令的所有后续步骤可用。它的工作原理类似于将this作为命令行参数传递:p: version = 1.0.9.此外,该值将作为system.version在TeamCity的系统参数,所以你可以通过% system.version %
  • 第11行:我们报告的计算版本MySampleLib打包到构建日志(成功声明它将以绿色高亮显示),用于诊断。

步骤4。发射电报调查

这一步将启动脚本文件:

  1. 获取Telegram bot的令牌和投票的预期持续时间的值。我们定义这些系统参数在TeamCity的父项目中。
    获取令牌和超时值:
如果(! Props.TryGetValue(“telegram.bot。Token ", out var Token)) {throw…如果(! Props.TryGetValue(“telegram.bot.poll}。var timeoutStr) || !TryParse(timeoutStr, out var timeout)) {throw…}
  1. 启动Telegram机器人,使用来自电报。机器人Telegram.Bot.Extensions.Polling包。
    恢复方案:
# r”nuget:电报。机器人, 15.6.0" #r "nuget: Telegram.Bot.Extensions.Polling, 0.2.0"
  1. 在此之前,每个订阅者都应该执行/启动命令激活机器人。在构建期间,TeamCity将把构建的链接报告给机器人的频道。投票开始,持续30分钟。
  1. 如果该通道的所有成员都批准了构建,它将投票者的名字报告到构建日志中,从构建中创建一个包,并将其与增量版本一起发布到NuGet存储库中。
    否则,如果至少有一个人投票反对它或30分钟过期,它将发送相应的错误报告并使构建失败(在前一种情况下,列出投票反对发布的用户的名字)。

总结

我们新的c#脚本运行器是为那些需要自动化构建某些阶段的开发人员和管理员提供的解决方案,这些开发人员和管理员(1)想要依赖熟悉的c#语法或/和(2)使用。net库和NuGet包中的逻辑。

如果你已经尝试过这个跑步者,我们很期待在评论中看到你的反馈。敬请期待即将到来的更新!

资源

构建快乐!

发现更多的

Baidu