使用 Azure DevOps 和 Azure Web Apps 进行 .NET Core 应用的 CI/CD

概览

在现代软件开发中,快速部署和高效的版本控制系统是非常关键的。通过利用 Azure DevOps 和 Azure Web Apps,开发团队可以实现自动化的持续集成和持续部署(CI/CD),从而加快从开发到生产的过程。接下来我们一步步来通过对Azure Devops+Azure WebApp配置,进行对 .NET Core 8.0 应用的 CI/CD。

步骤 1: 创建和测试 .NET Core 项目

1.1 创建项目:

首先,在本地安装 .NET Core 8.0。完成后,在终端运行以下命令创建一个新的 Web 应用项目:

dotnet new webapp -n AzureWebApp --framework net8.0
来创建一个测试dotnet core项目 ’AzureWebApp‘

注意点:

  • 版本兼容性:确保本地开发环境中安装的 .NET Core 版本与项目中使用的目标框架版本一致。版本不匹配可能导致运行时错误。
  • 安全性配置:在运行项目时,注意应用程序的安全配置,特别是当配置 HTTPS 本地测试服务器时。了解如何管理和应用 SSL 证书是很重要的。

1.2 运行和测试

进入项目目录,使用以下命令启动应用,确认其在本地运行正常:
cd AzureWebApp && dotnet run --urls=https://localhost:5001

步骤 2: 设置 Azure DevOps Repos

在 Azure DevOps 中创建一个新的 Repo,并将本地项目代码上传到此 Repo 中。确保也创建dev、test 等分支,以模拟不同的开发和测试环境。

2.1 创建仓库

创建Repo 指定Repo Name


2.2 提交代码

使用 Git 命令将本地项目代码提交到新建的 Azure DevOps Repo 中。

2.3 分支管理

创建多个分支,如 dev和 test,以支持不同环境的开发和测试需求。

注意点:

  • 权限管理:在 Azure DevOps 仓库中设置合适的权限,确保只有授权的用户可以访问和修改代码。这包括设置分支策略,如 pull request 审核、合并策略等。
  • 仓库结构:合理组织仓库结构,明确分支命名规范,可以有效支持多环境的开发和部署流程。

步骤 3: 配置 Azure Web App

在 Azure 中创建一个 Web App,选择 .NET 8 作为运行堆栈,并选择 Windows 作为操作系统。为了模拟生产环境,为不同的开发和测试环境创建相应的 Slots。

3.1 创建WebApp

选择所用语言对应的运行堆栈和操作系统,由于我们用dotnet core8来演示,所以选择创建dotnet 8 的runtime和windows的os

3.2 创建Slots

创建slot区分不同环境。我们规定webapp为正式生产环境,dev、test slot为开发测试环境等。

注意点:

  • 成本控制:在选择服务计划时考虑应用的规模和预期负载,以免产生不必要的成本。
  • 环境变量和配置:正确设置环境变量和应用配置,确保它们在 Azure Web App 中正确无误地被应用,尤其是数据库连接字符串和 API 密钥等敏感信息。

步骤 4: 配置 Azure DevOps Self-hosted Agent

在 Azure DevOps 中创建一个自托管的 Agent Pool 并添加相应的 Agent。这允许更细粒度的控制构建环境,以及更好的性能。

4.1 创建Agent Pool

在 Azure DevOps 中创建一个自托管的 Agent Pool。

4.2 添加和配置Agent

向 Agent Pool 中添加 Agent,并按照 Azure DevOps 提供的指南进行配置,以确保它可以正常运行和处理任务。

按照教程执行即可

安装并按提示配置agent

注意点:

  • 网络配置:确保自托管 Agent 有稳定且安全的连接到 Azure DevOps 和 Azure 资源。配置适当的网络安全组和防火墙规则。
  • 维护和更新:定期检查和更新自托管 Agent 的软件,确保安全漏洞被及时修补,性能和兼容性得到优化。

步骤 5: 配置 Service Connections

使用 Azure Resource Manager 和 Service Principal 方式,设置和配置 Service Connection。确保选择正确的 Azure 订阅和资源组,确保你的 pipeline 能够访问和部署到 Azure 资源。

注意点:

  • 最小权限原则:为 Service Connection 配置的服务主体 (SP) 应只授予执行所需任务的最小权限,避免过度权限带来的安全风险。
  • 监控和审计:监控 Service Connection 的使用情况,及时审计其活动,以便追踪可能的异常行为或配置错误。

步骤 6: 编写和保存 Pipeline

配置 Pipeline 如下,确保包含两个主要阶段:Build 和 Deploy。Build 阶段负责项目的构建和发布,Deploy 阶段则将构建的成果部署到 Azure Web App。

```yaml

# 触发配置:当 dev 分支有新的提交时触发此 pipeline
trigger:
branches:
include:
- dev

# 额外的仓库资源配置,自动触发 pipeline 当 AzureWebApp 的 dev 分支有更新
resources:
repositories:
- repository: AzureWebApp
type: git
name: CICD-test/AzureWebApp
ref: refs/heads/dev
trigger:
branches:
include:
- dev

# 指定使用的代理池名称,这里是自托管的代理池
pool:
name: selfhostedpool

# 定义构建和部署中使用的变量
variables:
buildConfiguration: 'Release'
projectName: 'AzureWebApp'
webAppName: 'xxxx-webapp'
webAppSlot: 'dev'
azureSubscription: 'xxxx-sub‘
serviceConnection: 'xxxx-sc'
RgName: 'xxxxx-rg'

# 定义 pipeline 的阶段,这里定义了构建和部署两个阶段
stages:
- stage: Build
displayName: Build stage
jobs:
- job: BuildJob
displayName: Build job
steps:
- checkout: self # 检出包含 pipeline 定义的仓库
- checkout: AzureWebApp # 检出 AzureWebApp 仓库

# 列出检出后的目录结构,以验证结构
- script: ls -R
displayName: 'List directory structure after checkout'

# 安装指定版本的 .NET SDK
- task: UseDotNet@2
displayName: 'Install .NET SDK'
inputs:
packageType: 'sdk'
version: '8.0.x'
installationPath: $(Agent.ToolsDirectory)/dotnet

# 设置环境变量以确保使用正确的 .NET SDK
- script: echo "##vso[task.setvariable variable=DOTNET_ROOT]$(Agent.ToolsDirectory)/dotnet"
displayName: 'Set DOTNET_ROOT'

# 将 .NET Core SDK 路径添加到 PATH 环境变量,确保命令行可以找到它
- script: echo "##vso[task.prependpath]$(Agent.ToolsDirectory)/dotnet"
displayName: 'Prepend .NET Core to PATH'

# 检查当前使用的 .NET SDK 版本
- script: dotnet --version
displayName: 'Check .NET SDK version'

# 还原项目依赖
- task: DotNetCoreCLI@2
displayName: Restore
inputs:
command: 'restore'
projects: 'AzureWebApp/AzureWebApp.csproj'

# 构建项目
- task: DotNetCoreCLI@2
displayName: Build
inputs:
command: 'build'
projects: 'AzureWebApp/AzureWebApp.csproj'
arguments: '--configuration $(buildConfiguration)'

# 发布项目,并将输出打包
- task: DotNetCoreCLI@2
displayName: Publish
inputs:
command: 'publish'
projects: 'AzureWebApp/AzureWebApp.csproj'
publishWebProjects: true
arguments: '--configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)'
zipAfterPublish: true

# 发布构建产物到 Azure DevOps 服务器
- task: PublishBuildArtifacts@1
displayName: Publish Artifacts
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'

# 部署阶段,依赖于构建阶段的成功完成
- stage: Deploy
displayName: Deploy stage
dependsOn: Build
condition: succeeded()
jobs:
- deployment: DeploymentJob
displayName: Deploy job
environment: '$(webAppName)-$(webAppSlot)'
strategy:
runOnce:
deploy:
steps:
# 使用 Azure 资源管理器服务连接部署应用到 Azure Web App
- task: AzureRmWebAppDeployment@4
displayName: Deploy to Azure Web App
inputs:
ConnectionType: 'AzureRM'
azureSubscription: $(serviceConnection)
appType: 'webApp'
ResourceGroupName: $(RgName)
WebAppName: $(webAppName)
DeployToSlotOrASE: true
SlotName: $(webAppSlot)
Package: '$(Pipeline.Workspace)/drop/*.zip'

```

完成这些步骤后,每次在 AzureWebApp Repo 的 dev 分支进行代码提交时,都会自动触发 CI/CD 流程,从而实现代码的自动构建和部署。

CICD完成后可以登陆azure portal 通过slot或者webapp的default domain访问来进行测试是否成功

注意点:

  • 错误处理和日志:在 Pipeline 脚本中添加适当的错误处理逻辑和详细的日志记录,这将有助于问题的快速定位和修复。
  • 版本控制和标签:使用版本控制和自动标签来管理发布,这有助于追踪各个版本的变化和快速回滚到先前的稳定版本。

总结

本文章展示了如何结合 Azure DevOps 和 Azure Web Apps 的强大功能,以实现 .NET Core 应用的自动化 CI/CD。这不仅优化了开发流程,提高了部署效率,还增强了产品的可靠性和团队的生产力。通过这种方法,团队可以更快地将创新推向市场,同时确保高质量的软件交付。持续集成和持续部署的实践是现代云应用开发的基石,利用 Azure DevOps 和 Azure Web Apps 可以有效支撑这一需求,帮助团队实现敏捷、高效的开发周期。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python写接口性能测试

import time import requestsdef measure_response_time(api_url):try:start_time time.time()response requests.get(api_url, timeout10) # 设置超时时间为10秒end_time time.time()response_time end_time - start_timeprint(f"接口 {api_url} 的响应时间为&#…

【手把手带你搓组件库】从零开始实现Element Plus

从零开始实现Element Plus 前言亮点项目搭建1、创建项目初始化monorepo创建 .gitignore目录结构安装基础依赖配置文件创建各个分包入口utilscomponentscoreplaytheme 2、创建VitePress文档3、部署到Github Actions生成 GH_TOKENGitHub Page 演示 4、总结 前言 在本文中&#xf…

SVM原问题与对偶问题

目的:求出我们的f(X),它代表着我们X映射到多维的情况,能够帮我们在多维中招到超平面进行分类。 1.优化问题: 1.1推荐好书: 1.2 优化理论中的原问题: 原问题和限制条件如下: 这是一个泛化性…

无人机飞手:ASFC无人机和航模爱好者证书详解

ASFC无人机和航模爱好者证书是由中国航空运动协会(ASFC)颁发的一种无人机操作资格认证。这种证书在无人机和航模爱好者群体中享有广泛的认可度,并被视为操作无人机的一种重要资质。 ASFC证书的定义和用途十分明确。它是民航局颁发的民用无人驾…

《最新出炉》系列入门篇-Python+Playwright自动化测试-40-录制生成脚本

宏哥微信粉丝群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 各种自动化框架都会有脚本录制功能, playwright这么牛叉当然也不例外。很早之前的selenium、Jmeter工具,发展到每种浏览器都有对应的录制插件。今天我们…

基于 vuestic-ui 实战教程

1. 前言简介 Vuestic UI是一个基于开源Vue 3的UI框架。它是一个MIT许可的UI框架,提供了易于配置的现成前端组件,并加快了响应式和快速加载Web界面的开发。它最初于2021年5月由EpicMax发布,这就是今天的Vuestic UI。 官网地址请点击访问 体验…

【DASBOOK】Mark loves cat

文章目录 一、工具下载二、Mark loves cat解题感悟 一、工具下载 克隆dirsearch仓库: git clone https://github.com/maurosoria/dirsearch.git下载 githack工具 git clone https://github.com/lijiejie/GitHack.git二、Mark loves cat 用dirsearch扫描目录&…

urllib_post请求_百度翻译之详细翻译

百度翻译有一个详细翻译的接口: post请求: 请求参数(较多): 打印之后,发现有问题: 改一下请求头: 将Accept-Encoding注释掉,因为我们使用的是utf-8编码: 加上…

STM32F1之OV7725摄像头·像素数据输出时序、FIFO 读写时序以及摄像头的驱动原理详解

STM32F1之OV7725摄像头-CSDN博客 STM32F1之I2C通信-CSDN博客 目录 1. 像素数据输出时序 2. FIFO 读写时序 2.1 写时序 2.2 读时序 3. 摄像头的驱动原理 1. 像素数据输出时序 主控器控制 OV7725 时采用 SCCB 协议读写其寄存器,而它输出图像时则使用 VGA 或…

无线技术整合到主动噪声控制(ANC)增强噪声降低性能

主动噪声控制(ANC)已成为一种广泛使用的降噪技术。基本原理是通过产生与外界噪音相等的反向声波,将噪音中和,从而达到降噪的效果。ANC系统通常包括以下几个部分:参考麦克风、处理芯片、扬声器和误差麦克风。参考麦克风…

设计循环队列(C语言)怎会如此简单!!!

目录 题目题目分析 解答结构体初始化判空判满插入删除去队头数据取队尾数据队列的销毁 题目 链接: 题目 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它…

对于高速信号完整性,一块聊聊啊(12)

常见的无源电子器件 电子系统中的无源器件可以按照所担当的电路功能分为电路类器件、连接类器件。 A、电路类器件: (1)二极管(diode) (2)电阻器(resistor) &#xf…

CAD二次开发(4)-编辑图形

工具类:EditEntityTool.cs using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Th…

✨✨使用jq+layui-tab+echarts+swiper实现选项卡轮播联动图表展示功能✨✨

使用jqlayui-tabechartsswiper实现选项卡轮播联动图表展示功能 ✨一、实现功能 🌟技术框架 使用layui-tab实现tabs切换使用swiper.js实现轮播效果使用echarts.js实现图表展示 🌟功能详情 布局为上中下:tab选项上,内容区为中&…

大作业爬取手机数据,实现手机推荐系统以及朋友圈手机论坛

1、功能简介 (1)用户注册与用户登录 (2)手机搜索、手机比拼、手机个性化推荐 (3)点击搜索的手机图片会就用户行为,轮播展示用户行为,推荐点击次数靠前的手机 (4&#xf…

网络域名是什么意思

网络域名,顾名思义,就是网络上的名字,类似于现实中的地址或姓名一样,用来标识网络上的一个或一组计算机或服务器的位置,以及它们的相应服务资源。网络域名是互联网上最基础的基础设施之一,是网络通信的“标…

有一个3x4的矩阵,要求用函数编写程序求出其中值最大的那个元素,以及其所在的行号和列号

常量和变量可以用作函数实参,同样数组元素也可以作函数实参,其用法与变量相同。数组名也可以作实参和形参,传递的是数组的起始地址。 用数组元素作函数实参: 由于实参可以是表达式,而数组元素可以是表达式的组…

技术面试,项目实战,求职利器

之前找工作一直想找一个能真正系统性学开发的地方,之前毕业找工作的时候无意间碰到下面这个网站,感觉还挺不错的,用上面的技术实战内容应对技术面试,也算是求职利器了。有需要的可以自取: https://how2j.cn?p156336 实…

【运维】Linux 端口管理实用指南,扫描端口占用

在 Linux 系统中,你可以使用以下几种方法来查看当前被占用的端口,并检查 7860 到 7870 之间的端口: 推荐命令: sudo lsof -i :7860-7870方法一:使用 netstat 命令 sudo netstat -tuln | grep :78[6-7][0-9]这个命令…

从0开始学统计-卡方检验

1.什么是卡方检验? 卡方检验是一种用于检验观察频数与期望频数之间差异的统计方法。它通常用于分析分类变量之间的关联性或独立性。在卡方检验中,我们将观察到的频数与期望频数进行比较,从而确定它们之间的差异是否显著。 卡方检验的基本思…