概览
在现代软件开发中,快速部署和高效的版本控制系统是非常关键的。通过利用 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 可以有效支撑这一需求,帮助团队实现敏捷、高效的开发周期。