使用 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 可以有效支撑这一需求,帮助团队实现敏捷、高效的开发周期。

相关推荐
哈里谢顿2 小时前
DevOps工程师必备Linux命令完全指南
devops
qq_316837753 小时前
String boot 接入 azure云TTS
python·flask·azure
卓码软件测评1 天前
软件测试测评公司关于HTTP安全头配置与测试?
web安全·网络安全·安全性测试·web app
数据智能老司机1 天前
DevOps 安全与自动化——理解 DevOps 文化与原则
架构·自动化运维·devops
数据智能老司机1 天前
DevOps 安全与自动化——开发环境搭建
架构·自动化运维·devops
卓豪终端管理2 天前
电脑远程关机的重要性
运维·网络·devops
极小狐2 天前
GitLab 18.2 发布几十项与 DevSecOps 有关的功能,可升级体验【一】
ci/cd·gitlab·devsecops·devops·极狐gitlab
极小狐2 天前
GitLab 18.2 发布几十项与 DevSecOps 有关的功能,可升级体验【三】
ci/cd·gitlab·devsecops·devops·极狐gitlab
董技叔软件开发公司2 天前
浅谈物联网嵌入式程序开发源码技术方案
物联网·软件需求·web app
johnny2333 天前
Jaeger理论、实战、问题记录
devops