作者:陆冬澄、周静
在现代软件研发体系中,.NET 平台由于其强大的功能、灵活性和丰富的开发工具,成为了构建 Windows 应用程序的热门选择。无论是桌面应用、Web 应用还是服务应用,.NET 提供了一系列强大的框架和工具,帮助开发者高效的创建高性能、可靠的应用程序。
本文将基于云效 Flow 流水线 Windows 构建环境和云效 Packages Nuget 制品仓库手把手教你如何开发并部署一个 .NET 应用,从环境搭建到实战应用发布的详细教程,帮助你掌握 .NET 开发的核心技能。
01 方案架构
本次实战教程中准备了两台机器,一台是用于构建的 Windows 构建机,需要我们添加到 Flow 流水线中;另一台是 Windows Server,作为 msdeploy 的对象,用于部署 .NET 应用服务。整体架构如下:
本方案中用到的示例代码工程如下:
- https://atomgit.com/oauth2_o72n54/FlowDemoWin
- https://atomgit.com/oauth2_o72n54/PackagesDemo(添加了 using Newtonsoft.Json 依赖。)
02 环境准备
2.1 在 Windows Server 上安装和配置 Web deploy
2.1.1 开启 IIS 服务
IIS(Internet Information Server)服务类似于 Java 的 Tomcat,类似于一种容器,我们能将我们开发好的 Web 应用部署到 IIS 中。
按照以下流程开启 IIS:
1. 打开 Server Manager。
2. 在 Manage 菜单下,选择 Add Roles and Features。
3. 选择 Role-based or Feature-based Installation。
4. 在 Server Selection 中选择合适的机器,此处可以选择默认的本地机器。
5. 在 Server Roles 中选择 Webserver(IIS),并请务必同时勾选 IIS Management Scripts and Tools、Management Service 和 IIS Management Console 三个选项,否则安装 web deploy 时无法看到全部选项。
6. Features 可以不用选择,因为 IIS 不需要额外的 Features。
7. 在 IIS Role Service 中选择想要的设定,也可以保留默认设定。
8. 点击 installation 进行安装,安装完成后点击 Close 关闭。
2.1.2 安装 Web Deploy
1. 下载 Web deploy 4.0[1]
2. 运行下载的安装程序,请注意,请务必选择全部安装而非典型安装。如果我们选择自定义安装,可以看到以下页面,我们需要安装其中的所有组件。如果安装选项比起下图有缺少,说明之前安装 IIS 中少安装了 Management 相关组件,需要重新 Add Roles and Features。
3.(可选)通过打开“控制面板”>“系统和安全”>“管理工具”>“服务”来验证 Web 部署是否正确运行,然后确保:
- “Web 部署代理服务”正在运行(旧版本中的服务名称不同)。
- “Web 管理服务”正在运行。
如果某个代理服务未运行,请重新启动“Web 部署代理服务”。如果 Web 部署代理服务根本不存在,请转到“控制面板”>“程序”>“卸载程序”,查找“Microsoft Web 部署 <版本>。选择“更改”安装,并确保对 Web 部署组件选择“将安装到本地硬盘”。完成更改安装步骤。
2.1.3 安装 ASP.NET Core windows-hosting-bundle
我们需要安装 AspNetCoreModuleV2 来确保服务的顺利启动。如果不安装该组件,那么服务启动的时候就会报 500.19 错误。下载 windows-hosting-bundle[2], 并运行安装程序。
2.1.4 添加 Web 网站并开启 Web Deploy 发布功能
1. 打开 IIS 管理器,在左侧选择 Add Website。
2. 在打开的 Website 窗口中,填写 Site name 和 Physical path,然后点击 ok。此处 Site name 填写为 DemoWin。
3. 右键点击刚刚创建的 Web 网站,选择 Deploy > Config Web Deploy Publishing。
如果没有 Deploy 这一个选项,说明之前的 Web Deploy 没有正确安装和运行。
4. 检查弹出页面中的各项参数,默认 URL for publishing seriver connection 端口为 8172,我们可以保留这个端口,也可以修改为其他端口。URL 中的 host name(8172 之前的部分)可以不用修改,在构建机中 deploy 时,我们将用 IP 地址代替 host name。
5.(可选)如果 Windows Server 位于阿里云 ECS,我们需要打开防火墙,允许外部对于 Server 的 8172、80端口的访问。操作路径:到 ECS 控制台 > 选择实例 > Windows Server 对应的实例 > 安全组 > 入方向手动添加,端口选择 80 和 8172, 授权对象选【0.0.0.0/0】。
2.2 配置 Windows 构建机
2.2.1 安装构建工具和发布工具
安装 Visual Studio、Web Deploy 和 Dotnet6.0。注意,本处安装 web deploy 时不需要打开 IIS,所以安装界面中会比 1.2 中少一些安装选项,但这不会影响我们配置构建机。安装完成后,将以下路径添加到 Path 中:
- C:\Windows\Microsoft.NET\Framework64\v4.0.30319
- C:\Program Files\IIS\Microsoft Web Deploy V3
dotnet 对应的 path 在安装时已经添加,如果没有找到 dotnet,可以手动添加:
- C:\Program Files\dotnet
安装结束以后,我们可以到 cmd 中尝试一下 msbuild、msdeploy、dotnet 命令是否成功安装和添加到 Path。
2.2.2 在本地构建 Demo 工程并发布
在配置流水线之前,我们可以先在本地尝试是否能成功构建并发布工程。
1. 首先,我们 Clone Demo 工程代码:
git clone https://atomgit.com/oauth2_o72n54/FlowDemoWin
2. 构建工程:
# mubuild 构建 dotnet msbuild /p:Configuration=Debug /t:Publish # /p:Configuration=Debug 是构建出Debug版本
3. 使用 msdeploy,将构建出来的内容发布到 Windows Server。
msdeploy -verb:sync -source:contentPath="C:\Users\Administrator\source\repos\FlowDemoWin\bin\Debug\net6.0\publish" -dest:contentPath=DemoWin,computerName=https://<Windows Server IP>:8172/MsDeploy.axd?site=DemoWin,userName=YOURUSERNAME,password=YOURPASSWORD,authtype="Basic",includeAcls="False" -allowUntrusted -disableLink:AppPoolExtension -disableLink:ContentExtension -disableLink:CertificateExtension -verbose # 上述 <Windows Server IP> 请替换为 Windows Server 的 IP # -source:contentPath 用于指定需要发布的路径,这里的路径是上文中dotnet msbuild以后的output路径 #-dest:contentPath 用于指定目标机器和站点:这里我们的站点为DemoWin
4. 在浏览器输入 Windows Server 的公网 IP,我们可以看到:
这说明我们在本地成功构建并发布 Demo 工程。
03 基于云效 Windows 构建环境和Nuget 制品仓库实现 .NET 应用持续交付
3.1 在 Flow 中添加 Windows 私有构建机
进入流水线管理页面后,点击最左下角的设置,然后点击构建集群管理 > 新建构建集群,输入构建集群基本信息后,点击确定创建私有构建集群后自动进入构建机的配置页面。
点击接入新节点 > 选择类型 Windows > 复制红框中 Runner 安装命令,粘贴到准备好的 Windows 构建机的 powershell 进行执行。
Runner 安装命令执行成功后,刷新私有构建集群页面,即可看到刚才接入的构建机器。
3.2 配置 Flow 流水线
进入 Flow 首页,新建流水线,按如下配置编辑流水线配置。
1. 添加流水线源:我们可以选择企业公钥连接,然后将企业公钥粘贴至代码仓库的 SSH Key 处。
git@atomgit.com:oauth2_o72n54/FlowDemoWin.git
2. 添加步骤:构建。选择刚才添加的 Windows 构建机,选择 Windows 节点,然后我们添加一个任务步骤-执行命令,然后写入:
dotnet msbuild /p:Configuration=Debug /t:Publish
3. 添加步骤:部署。创建一个新的任务,选择类型为“执行命令”。然后依旧选择上一步中的 Windows 构建机,在执行命令中可以填入:
# input your command here $PUBLISH_BASE = (Get-Item .).FullName | Out-String $PUBLISH_PATH = Join-Path -Path $PUBLISH_BASE.Trim() -ChildPath "bin\Debug\net6.0\publish" & 'C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy' -verb:sync -source:contentPath=${PUBLISH_PATH} -dest:contentPath=DemoWin,computerName=https://<Windows Server IP>:8172/MsDeploy.axd?site=DemoWin,userName=YOURUSERNAME,password=YOUPASSWORD,authtype="Basic",includeAcls="False" -allowUntrusted -disableLink:AppPoolExtension -disableLink:ContentExtension -disableLink:CertificateExtension -verbose # 上述 <Windows Server IP> 请替换为 Windows Server 的 IP
请注意,由于 runner 的 Path 可能和 Administrator 用户的 Path 有所不同,所以我们可以在这里详细写出 msdeploy 的路径 & 'C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy'。
4. 保存并执行流水线,查看流水线运行进度。
5. 流水线运行成功后,打开 Windows Server 中站点,我们可以看到应用部署成功。
3.3 使用 Packages Nuget 制品仓库进行依赖管理
将原来的代码源换为 https://atomgit.com/oauth2_o72n54/PackagesDemo,相较于原来的代码,该仓库添加了 using Newtonsoft.Json;,此时,再运行流水线构建任务 msbuild 会失败,因为缺少依赖包。
我们可以用云效 packages,创建一个 NuGet 制品库来管理二方制品和三方制品。进入云效 Packages 首页,新建一个 NuGet 制品仓库。
访问官网[3],下载依赖的 nuget 包到本地。
按照仓库指南,在本地进行配置:首先在本地设置仓库凭证,然后将刚才从官网下载的 nuget 包 push 到仓库中。此处 <SOURCE_NAME> 即为仓库地址的后缀名 repo-xxxxx。
推送成功后可以在仓库-包列表中查看包:
修改流水线代码源为(该仓库添加了 using Newtonsoft.Json):
git@atomgit.com:oauth2_o72n54/PackagesDemo.git
修改流水线构建任务命令为:
# 配置 nuget 仓库凭证 dotnet nuget add source http://yunxiao-poc.devops.aliyuncs.com:80/packages/02e873bb-f911-48ac-ad73-ec2298c5385d/nuget/repo-hzaul/index.json -n repo-hzaul -u "xxxxxxxxxxx" -p "xxxxxxxxx" # 拉取 nuget 依赖包 dotnet add package Newtonsoft.Json --source http://yunxiao-poc.devops.aliyuncs.com:80/packages/02e873bb-f911-48ac-ad73-ec2298c5385d/nuget/repo-hzaul/index.json # mubuild 构建 dotnet msbuild /p:Configuration=Debug /t:Publish
保存后运行流水线,流水线构建任务即会从 Packages NuGet 制品仓库拉取 Newtonsoft.Json 包,完成应用构建。
至此,本文即完成了一个 .NET 应用开发环境的搭建、CI/CD 流水线的配置、NuGet 依赖仓库管理等完整流程实践。
相关链接:
[1] Web deploy 4.0
[2] windows-hosting-bundle
[3] 官网
https://www.nuget.org/packages/Newtonsoft.Json
相关阅读:
云效 Flow 私有构建集群
https://help.aliyun.com/zh/yunxiao/user-guide/build-a-cluster
云效 Packages NuGet 制品仓库
https://help.aliyun.com/zh/yunxiao/user-guide/product-management-3