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

相关推荐
心灵彼岸-诗和远方11 小时前
DevOps工程技术价值流:制品库Nexus与Harbor的实战探索
运维·devops
bigdata-余建新11 小时前
SRE 与 DevOps记录
运维·devops
魔幻云2 天前
终章:DevOps实践总结报告
devops
catmes3 天前
使用docker compose安装gitlab
运维·docker·容器·gitlab·敏捷开发·devops
ccnnlxc3 天前
git使用和gitlab部署
devops
编码浪子4 天前
devops和ICCID简介
运维·ci/cd·docker·devops
陶庵看雪4 天前
app开发之原生开发、H5开发和混合开发的区别
web app
明明跟你说过5 天前
在Rocky Linux中安装【Jenkins】的详细指南
linux·运维·服务器·ci/cd·jenkins·devops
Anna_Tong5 天前
探索 CI/CD 工具的力量
ci/cd·开源·jenkins·开源软件·devops
Damien_J5 天前
Azure Function流式返回
microsoft·azure