基于云效 Windows 构建环境和 Nuget 制品仓库进行 .Net 应用开发

news2025/1/8 1:05:14

作者:陆冬澄、周静

在现代软件研发体系中,.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

  1. 打开 Server Manager。

  2. 在 Manage 菜单下,选择 Add Roles and Features。

  1. 选择 Role-based or Feature-based Installation。

  1. 在 Server Selection 中选择合适的机器,此处可以选择默认的本地机器。

  2. 在 Server Roles 中选择 Webserver(IIS),并请务必同时勾选 IIS Management Scripts and Tools、Management Service 和 IIS Management Console 三个选项,否则安装 web deploy 时无法看到全部选项。

  1. Features 可以不用选择,因为 IIS 不需要额外的 Features。

  2. 在 IIS Role Service 中选择想要的设定,也可以保留默认设定。

  1. 点击 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。

  1. 在打开的 Website 窗口中,填写 Site name 和 Physical path,然后点击 ok。此处 Site name 填写为 DemoWin。

  1. 右键点击刚刚创建的 Web 网站,选择 Deploy > Config Web Deploy Publishing。

如果没有 Deploy 这一个选项,说明之前的 Web Deploy 没有正确安装和运行。

  1. 检查弹出页面中的各项参数,默认 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
  1. 构建工程:
# mubuild 构建
dotnet msbuild /p:Configuration=Debug /t:Publish
# /p:Configuration=Debug 是构建出Debug版本
  1. 使用 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
  1. 在浏览器输入 Windows Server 的公网 IP,我们可以看到:

这说明我们在本地成功构建并发布 Demo 工程。

基于云效 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

  1. 添加步骤:构建。选择刚才添加的 Windows 构建机,选择 Windows 节点,然后我们添加一个任务步骤-执行命令,然后写入:
dotnet msbuild /p:Configuration=Debug /t:Publish

  1. 添加步骤:部署。创建一个新的任务,选择类型为“执行命令”。然后依旧选择上一步中的 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’。

  1. 保存并执行流水线,查看流水线运行进度。

  1. 流水线运行成功后,打开 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

https://download.visualstudio.microsoft.com/download/pr/e1828da1-907a-46fe-a3cf-f3b9ea1c485c/035860f3c0d2bab0458e634685648385/webdeploy_amd64_en-us.msi

[2] windows-hosting-bundle

https://dotnet.microsoft.com/zh-cn/download/dotnet/thank-you/runtime-aspnetcore-6.0.20-windows-hosting-bundle-installer

[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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2272932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用VS C#构建Windows服务【纯操作版,附带项目地址】

1&#xff0e;点击“创建新项目”&#xff0c;选择“Windows 服务&#xff08;.NET Framework&#xff09;” 2、给项目命名 3、双击“Service1.cs”&#xff0c;右键&#xff0c;选择“添加安装程序”&#xff0c;就会生成一个“ProjectInstaller.cs”文件 4、双击“P…

KUKA机器人如何修改程序并下载到机器人控制器中?

KUKA机器人如何修改程序并下载到机器人控制器中? 如下图所示,首先将使用的网卡的IP地址设置为自动获得, 打开workvisual软件,点击搜索,正常情况下可以搜索到项目文件,选中后双击进入, 如下图所示,此时,workvisual会自动从机器人控制器中下载项目文件到电脑上,耐心等待…

L28.【LeetCode笔记】移动零(三种解法)

目录 1.题目 2.向前覆盖法 分析 代码 提交结果 3.优解:双指针 代码 提交结果 4.其他不符合题意的方法:使用队列 代码 提交结果 1.题目 https://leetcode.cn/problems/move-zeroes/description/ 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾…

js逆向实战(1)-- 某☁️音乐下载

下载某云音乐源文件.mp4格式 首先随便点进一首歌&#xff0c;如图所示获取该音乐id&#xff0c;然后点击播放键&#xff0c;打开F12进行查询XHR 由此可知&#xff0c;实际请求网址是 https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token「你的token」url需带…

深入了解 SSL/TLS 协议及其工作原理

深入了解 SSL/TLS 协议及其工作原理 一. 什么是 SSL/TLS?二. SSL/TLS 握手过程三. SSL/TLS 数据加密与传输四. 总结 点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有惊喜。 作者&#xff1a;神的孩子都在歌唱 一. 什么是 SSL/TLS? 安全套接层&am…

Java四大常用JSON解析性能对比:Hutool、Fastjson2、Gson与Jackson测试

1. 引言 JSON 是现代软件开发中常用的数据交换格式&#xff0c;尤其在微服务和前后端分离的架构中更是必不可少。 本文将对 Java 中四大主流 JSON 解析库——Hutool、Fastjson2、Gson 和 Jackson 进行性能测试和对比分析&#xff0c;通过实测 20 万条数据解析&#xff0c;揭示…

【整理集合大全】MySQL(4) 数据库增删改查SQL语句

查看数据库 show databases; 使用数据库 use 数据库名;创建数据库 CREATE DATABASE 数据库名;删除数据库 DROP DATABASE 数据库名;创建表 create table 表名(列名1 类型(长度) [约束],列名2 类型(长度) [约束],…… );长度区别 int类型带长度&#xff1a;不影响存取值&…

升级 Spring Boot 3 配置讲解 —— Spring Boot 3 核心源码专讲

学会这款 &#x1f525;全新设计的 Java 脚手架 &#xff0c;从此面试不再怕&#xff01; Spring Boot 3 是 Spring 生态中的重要里程碑&#xff0c;它不仅全面支持 Java 17&#xff0c;还引入了许多新特性&#xff0c;如对 GraalVM 原生镜像的支持、改进的性能优化以及更灵活的…

vue3中el-table实现多表头并表格合并行或列

1、el-table中添加事件 :span-method"genderSpanCity" <el-table :span-method"genderSpanCity":data"data.tableData":fit"true" table-layout"fixed" header-align"center" stripestyle"width:100%;he…

OpenGL —— 流媒体播放器 - ffmpeg解码rtsp流,opengl渲染yuv视频(附源码,glfw+glad)

效果 说明 FFMpeg和OpenGL作为两大技术巨头,分别在视频解码和图形渲染领域发挥着举足轻重的作用。本文将综合两者实战视频播放器,大概技术流程为:ffmpeg拉取rtsp协议视频流,并经过解码、尺寸格式转换为yuv420p后,使用opengl逐帧循环渲染该yuv实时视频。 核心源码 vertexSh…

Web安全扫盲

1、建立网络思维模型的必要 1 . 我们只有知道了通信原理&#xff0c; 才能够清楚的知道数据的交换过程。 2 . 我们只有知道了网络架构&#xff0c; 才能够清楚的、准确的寻找漏洞。 2、局域网的简单通信 局域网的简单通信&#xff08;数据链路层&#xff09; 一般局域网都通…

HTML 显示器纯色亮点检测工具

HTML 显示器纯色亮点检测工具 相关资源文件已经打包成html等文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Html相关程序案例&#xff0c;秉着开源精神的想法&#xff0c;望大家喜欢&#…

ARM发布Armv9.5架构:迈向更强性能与灵活性的新时代

2024年11月30日&#xff0c;ARM正式发布了其最新的Armv9.5架构&#xff0c;这是Arm技术发展的又一重要里程碑。从表中信息来看&#xff0c;Armv9.5架构的发布标志着该公司的架构系列在性能、灵活性和可扩展性方面取得了进一步突破。本次发布不仅是技术上的提升&#xff0c;更是…

被催更了,2025元旦源码继续免费送

“时间从来不会停下&#xff0c;它只会匆匆流逝。抓住每一刻&#xff0c;我们才不会辜负自己。” 联系作者免费领&#x1f496;源&#x1f496;码。 三联支持&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;亲爱的朋友们&#xff0c;感谢你…

【Rust自学】10.4. trait Pt.2:trait作为参数和返回类型、trait bound

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 说句题外话&#xff0c;写这篇的时间比写所有权还还花的久&#xff0c;trait是真的比较难理解的概念。 10.4.1. 把trait作为参数 继续以…

R机器学习:神经网络算法的理解与实操,实例解析

神经网络算法是一种模仿生物神经网络&#xff08;尤其是人脑&#xff09;结构和功能的算法。它由大量相互连接的节点&#xff08;称为神经元&#xff09;组成&#xff0c;这些神经元组织成层&#xff0c;通过传递信号来处理信息。神经网络算法在机器学习、人工智能等领域中扮演…

Java(day4)

二维数组 静态初始化 动态初始化 练习 public class test1 {public static void main(String[]args){int arr[][]{{22,66,44},{77,33,88},{25,45,65},{11,66,99}};int sum0;for(int i0;i<arr.length;i){int a0;for(int j0;j<arr[i].length;j){sumarr[i][j];aarr[i][j];…

element-plus大版本一样,但是小版本不一样导致页面出bug

npm 的版本 node的版本 npm的源这些都一样&#xff0c;但是效果不一样 发现是element的包版本不一样导致的 2.9.1与2.8.1的源是不一样的&#xff0c;导致页面出bug;

【Docker】安装registry本地镜像库,开启Https功能

下载镜像 docker pull registry:2 需要启动https功能&#xff0c;就要生成服务端的自签名的证书和私钥&#xff0c;以及在docker客户端安装这个经过签名的证书。 第一步&#xff1a;生成公私钥信息&#xff0c;第二步&#xff0c;制作证书签名申请文件&#xff0c; 第三步&…

单片机-LED点阵实验

要将第一个点点亮&#xff0c;则 1 脚接高电平 a 脚接低电平&#xff0c;则第一个点就亮了&#xff1b;如果要将第一行点亮&#xff0c;则第 1 脚要接高电平&#xff0c;而&#xff08;a、b、c、d、e、f、g、h &#xff09;这些引脚接低电平&#xff0c;那么第一行就会点亮&…