在现代软件研发体系中,.NET 平台由于其强大的功能、灵活性和丰富的开发工具,成为了构建 Windows 应用程序的热门选择。无论是桌面应用、Web 应用还是服务应用,.NET 提供了一系列强大的框架和工具,帮助开发者高效的创建高性能、可靠的应用程序。本文将基于云效 Flow 流水线 Windows 构建环境和云效 Packages Nuget 制品仓库手把手教你如何开发并部署一个 .NET 应用,从环境搭建到实战应用发布的详细教程,帮助你掌握 .NET 开发的核心技能。
1. 方案架构
本次实战教程中准备了两台机器,一台是用于构建的 Windows 构建机,需要我们添加到 Flow 流水线中;另一台是Windows Server,作为 msdeploy 的对象,用于部署 .NET 应用服务。整体架构如下:
本方案中用到的示例代码工程如下:
https://atomgit.com/oauth2_o72n54/FlowDemoWin
https://atomgit.com/oauth2_o72n54/PackagesDemo (添加了using Newtonsoft.Json 依赖)
2. 环境准备
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
运行下载的安装程序,请注意,请务必选择全部安装而非典型安装。如果我们选择自定义安装,可以看到以下页面,我们需要安装其中的所有组件。如果安装选项比起下图有缺少,说明之前安装IIS中少安装了Management相关组件,需要重新Add Roles and Features。
(可选)通过打开“控制面板”>“系统和安全”>“管理工具”>“服务”来验证 Web 部署是否正确运行,然后确保:
“Web 部署代理服务”正在运行(旧版本中的服务名称不同)。
“Web 管理服务”正在运行。
如果某个代理服务未运行,请重新启动“Web 部署代理服务”。
如果 Web 部署代理服务根本不存在,请转到“控制面板”>“程序”>“卸载程序”,查找“Microsoft Web 部署 <版本>。 选择“更改”安装,并确保对 Web 部署组件选择“将安装到本地硬盘”,完成更改安装步骤。
2.1.3. 安装ASP.NET Core windows-hosting-bundle
我们需要安装 AspNetCoreModuleV2 来确保服务的顺利启动。如果不安装该组件,那么服务启动的时候就会报500.19错误。下载 windows-hosting-bundle, 并运行安装程序。
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。
(可选)如果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 和 Dotnet 6.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工程并发布
在配置流水线之前,我们可以先在本地尝试是否能成功构建并发布项目。
首先,我们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工程。
3. 基于云效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,相较于原来的代码,该仓库添加了 using Newtonsoft.Json;
,此时,再运行流水线构建任务 msbuild 会失败,因为缺少依赖包。
我们可以用云效packages,创建一个 NuGet 制品库来管理二方制品和三方制品。进入云效 Packages 首页,新建一个 NuGet 制品仓库。
访问官网,下载依赖的 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)
- 1. 方案架构
- 2. 环境准备
- 2.1. 在Windows Server上安装和配置Web deploy
- 2.2. 配置Windows构建机
- 3. 基于云效Windows 构建环境和 Nuget 制品仓库实现 .NET 应用持续交付
- 3.1. 在 Flow 中添加 Windows 私有构建机
- 3.2. 配置 Flow 流水线
- 3.3. 使用 Packages Nuget 制品仓库进行依赖管理