作者:陆冬澄、周静
在现代软件研发体系中,.NET 平台由于其强大的功能、灵活性和丰富的开发工具,成为了构建 Windows 应用程序的热门选择。无论是桌面应用、Web 应用还是服务应用,.NET 提供了一系列强大的框架和工具,帮助开发者高效的创建高性能、可靠的应用程序。
本文将基于云效 Flow 流水线 Windows 构建环境和云效 Packages Nuget 制品仓库手把手教你如何开发并部署一个 .NET 应用,从环境搭建到实战应用发布的详细教程,帮助你掌握 .NET 开发的核心技能。
方案架构
本次实战教程中准备了两台机器,一台是用于构建的 Windows 构建机,需要我们添加到 Flow 流水线中;另一台是 Windows Server,作为 msdeploy 的对象,用于部署 .NET 应用服务。整体架构如下:
本方案中用到的示例代码工程如下:
- https://atomgit.com/oauth2_o72n54/FlowDemoWin
- https://atomgit.com/oauth2_o72n54/PackagesDemo (添加了 using Newtonsoft.Json 依赖。)
环境准备
2.1 在 Windows Server 上安装和配置 Web deploy
2.1.1 开启 IIS 服务
IIS(Internet Information Server)服务类似于 Java 的 Tomcat,类似于一种容器,我们能将我们开发好的 Web 应用部署到 IIS 中。
按照以下流程开启 IIS:
- 打开 Server Manager。
- 在 Manage 菜单下,选择 Add Roles and Features。
- 选择 Role-based or Feature-based Installation。
- 在 Server Selection 中选择合适的机器,此处可以选择默认的本地机器。
- 在 Server Roles 中选择 Webserver(IIS),并请务必同时勾选 IIS Management Scripts and Tools、Management Service 和 IIS Management Console 三个选项,否则安装 web deploy 时无法看到全部选项。
- Features 可以不用选择,因为 IIS 不需要额外的 Features。
- 在 IIS Role Service 中选择想要的设定,也可以保留默认设定。
- 点击 installation 进行安装,安装完成后点击 Close 关闭。
2.1.2 安装 Web Deploy
- 下载 Web deploy 4.0 [ 1]
- 运行下载的安装程序,请注意,请务必选择全部安装而非典型安装。如果我们选择自定义安装,可以看到以下页面,我们需要安装其中的所有组件。如果安装选项比起下图有缺少,说明之前安装 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 发布功能**
- 打开 IIS 管理器,在左侧选择 Add Website。
- 在打开的 Website 窗口中,填写 Site name 和 Physical path,然后点击 ok。此处 Site name 填写为 DemoWin。
- 右键点击刚刚创建的 Web 网站,选择 Deploy > Config Web Deploy Publishing。
如果没有 Deploy 这一个选项,说明之前的 Web Deploy 没有正确安装和运行。
- 检查弹出页面中的各项参数,默认 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
- 构建工程:
# mubuild 构建
dotnet msbuild /p:Configuration=Debug /t:Publish
# /p:Configuration=Debug 是构建出Debug版本
- 使用 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
- 在浏览器输入 Windows Server 的公网 IP,我们可以看到:
这说明我们在本地成功构建并发布 Demo 工程。
基于云效 Windows 构建环境和 Nuget 制品仓库实现 .NET 应用持续交付
3.1 在 Flow 中添加 Windows 私有构建机
进入流水线管理页面后,点击最左下角的设置,然后点击构建集群管理 > 新建构建集群,输入构建集群基本信息后,点击确定创建私有构建集群后自动进入构建机的配置页面。
点击接入新节点 > 选择类型 Windows > 复制红框中 Runner 安装命令,粘贴到准备好的 Windows 构建机的 powershell 进行执行。
Runner 安装命令执行成功后,刷新私有构建集群页面,即可看到刚才接入的构建机器。
3.2 配置 Flow 流水线
进入 Flow 首页,新建流水线,按如下配置编辑流水线配置。
- 添加流水线源:我们可以选择企业公钥连接,然后将企业公钥粘贴至代码仓库的 SSH Key 处。
git@atomgit.com:oauth2_o72n54/FlowDemoWin.git
- 添加步骤:构建。选择刚才添加的 Windows 构建机,选择 Windows 节点,然后我们添加一个任务步骤-执行命令,然后写入:
dotnet msbuild /p:Configuration=Debug /t:Publish
- 添加步骤:部署。创建一个新的任务,选择类型为“执行命令”。然后依旧选择上一步中的 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'。
- 保存并执行流水线,查看流水线运行进度。
- 流水线运行成功后,打开 Windows Server 中站点,我们可以看到应用部署成功。
3.3 使用 Packages Nuget 制品仓库进行依赖管理
将原来的代码源换为 https://atomgit.com/oauth2_o72n54/PackagesDemo
我们可以用云效 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