部署指南 - 精通 AZD 部署 章节导航: 课程主页:AZD 初学者指南 当前章节:第4章 - 基础设施即代码与部署 ⬅️ 上一章:第3章:配置 ➡️ 下一步:资源预配 下一章:第5章:多代理 AI 解决方案 简介 这份全面的指南涵盖了使用 Azure Developer CLI 部署应用程序的所有内容,从基本的单命令部署到具有自定义钩子、多环境和 CI/CD 集成的高级生产场景。通过实践示例和最佳实践,掌握完整的部署生命周期。
章节导航:
这份全面的指南涵盖了使用 Azure Developer CLI 部署应用程序的所有内容,从基本的单命令部署到具有自定义钩子、多环境和 CI/CD 集成的高级生产场景。通过实践示例和最佳实践,掌握完整的部署生命周期。
完成本指南后,您将能够:
完成后,您将能够:
Azure Developer CLI 提供了多个部署命令:
azd up - 完整工作流程(预配 + 部署)azd provision - 仅创建/更新 Azure 资源azd deploy - 仅部署应用程序代码azd package - 构建和打包应用程序新项目最常用的工作流程:
# 从头开始部署所有内容 azd up # 使用特定环境进行部署 azd up --environment production # 使用自定义参数进行部署 azd up --parameter location=westus2 --parameter sku=P1v2
当您只需要更新 Azure 资源时:
# 提供/更新基础设施 azd provision # 使用干运行预览更改 azd provision --preview # 提供特定服务 azd provision --service database
用于快速更新应用程序:
# 部署所有服务 azd deploy # 预期输出: # 正在部署服务 (azd deploy) # - web: 部署中... 完成 # - api: 部署中... 完成 # 成功: 您的部署在2分15秒内完成 # 部署特定服务 azd deploy --service web azd deploy --service api # 使用自定义构建参数进行部署 azd deploy --service api --build-arg NODE_ENV=production # 验证部署 azd show --output json | jq '.services'
每次部署后,验证成功:
# 检查所有服务是否正在运行 azd show # 测试健康端点 WEB_URL=$(azd show --output json | jq -r '.services.web.endpoint') API_URL=$(azd show --output json | jq -r '.services.api.endpoint') curl -f "$WEB_URL/health" || echo "❌ Web health check failed" curl -f "$API_URL/health" || echo "❌ API health check failed" # 检查日志中的错误 azd logs --service api --since 5m | grep -i error
成功标准:
# azure.yaml hooks: preprovision: shell: sh run: | echo "Validating configuration..." ./scripts/validate-prereqs.sh echo "Setting up secrets..." ./scripts/setup-secrets.sh
hooks: postprovision: shell: pwsh run: | Write-Host "Infrastructure ready, setting up databases..." ./scripts/setup-database.ps1 Write-Host "Configuring application settings..." ./scripts/configure-app-settings.ps1
hooks: predeploy: shell: sh run: | echo "Running pre-deployment tests..." npm run test:unit echo "Database migrations..." npm run db:migrate
hooks: postdeploy: shell: sh run: | echo "Running integration tests..." npm run test:integration echo "Warming up applications..." curl https://${WEB_URL}/health
# azure.yaml services: web: project: ./src/web host: staticwebapp buildCommand: npm run build outputPath: dist api: project: ./src/api host: containerapp docker: context: ./src/api dockerfile: Dockerfile target: production env: - name: NODE_ENV value: production - name: API_VERSION value: "1.0.0" worker: project: ./src/worker host: function runtime: node buildCommand: npm install --production
# 开发环境 azd env set NODE_ENV development azd env set DEBUG true azd env set LOG_LEVEL debug # 测试环境 azd env new staging azd env set NODE_ENV staging azd env set DEBUG false azd env set LOG_LEVEL info # 生产环境 azd env new production azd env set NODE_ENV production azd env set DEBUG false azd env set LOG_LEVEL error
# Complex application with multiple services services: # Frontend applications web-app: project: ./src/web host: staticwebapp admin-portal: project: ./src/admin host: appservice # Backend services user-api: project: ./src/services/users host: containerapp order-api: project: ./src/services/orders host: containerapp payment-api: project: ./src/services/payments host: function # Background processing notification-worker: project: ./src/workers/notifications host: containerapp report-worker: project: ./src/workers/reports host: function
# 创建蓝色环境 azd env new production-blue azd up --environment production-blue # 测试蓝色环境 ./scripts/test-environment.sh production-blue # 将流量切换到蓝色(手动更新DNS/负载均衡器) ./scripts/switch-traffic.sh production-blue # 清理绿色环境 azd env select production-green azd down --force
# azure.yaml - Configure traffic splitting services: api: project: ./src/api host: containerapp trafficSplit: - revision: stable percentage: 90 - revision: canary percentage: 10
#!/bin/bash # 部署分阶段脚本.sh echo "Deploying to development..." azd env select dev azd up --confirm-with-no-prompt echo "Running dev tests..." ./scripts/test-environment.sh dev echo "Deploying to staging..." azd env select staging azd up --confirm-with-no-prompt echo "Running staging tests..." ./scripts/test-environment.sh staging echo "Manual approval required for production..." read -p "Deploy to production? (y/N): " confirm if [[ $confirm == [yY] ]]; then echo "Deploying to production..." azd env select production azd up --confirm-with-no-prompt echo "Running production smoke tests..." ./scripts/test-environment.sh production fi
services: api: project: ./src/api host: containerapp docker: context: ./src/api dockerfile: Dockerfile target: production buildArgs: BUILD_VERSION: ${BUILD_VERSION} NODE_ENV: production env: - name: DATABASE_URL value: ${DATABASE_URL} secrets: - name: jwt-secret value: ${JWT_SECRET} scale: minReplicas: 1 maxReplicas: 10
# Dockerfile FROM node:18-alpine AS base WORKDIR /app COPY package*.json ./ FROM base AS development RUN npm ci COPY . . CMD ["npm", "run", "dev"] FROM base AS build RUN npm ci --only=production COPY . . RUN npm run build FROM node:18-alpine AS production WORKDIR /app COPY --from=build /app/dist ./dist COPY --from=build /app/node_modules ./node_modules COPY package*.json ./ EXPOSE 3000 CMD ["npm", "start"]
# 配置并行部署 azd config set deploy.parallelism 5 # 并行部署服务 azd deploy --parallel
# azure.yaml - Enable build caching services: web: project: ./src/web buildCommand: npm run build buildCache: enabled: true paths: - node_modules - .next/cache
# 仅部署已更改的服务 azd deploy --incremental # 使用变更检测进行部署 azd deploy --detect-changes
# 监控部署进度 azd deploy --follow # 查看部署日志 azd logs --follow --service api # 检查部署状态 azd show --service api
# azure.yaml - Configure health checks services: api: project: ./src/api host: containerapp healthCheck: path: /health interval: 30s timeout: 10s retries: 3
#!/bin/bash # scripts/validate-deployment.sh echo "Validating deployment..." # 检查应用程序健康状况 WEB_URL=$(azd show --output json | jq -r '.services.web.endpoint') API_URL=$(azd show --output json | jq -r '.services.api.endpoint') echo "Testing web application..." if curl -f "$WEB_URL/health"; then echo "✅ Web application is healthy" else echo "❌ Web application health check failed" exit 1 fi echo "Testing API..." if curl -f "$API_URL/health"; then echo "✅ API is healthy" else echo "❌ API health check failed" exit 1 fi echo "Running integration tests..." npm run test:integration echo "✅ Deployment validation completed successfully"
# 安全存储机密 azd env set DATABASE_PASSWORD "$(openssl rand -base64 32)" --secret azd env set JWT_SECRET "$(openssl rand -base64 64)" --secret azd env set API_KEY "your-api-key" --secret # 在azure.yaml中引用机密
services: api: secrets: - name: database-password value: ${DATABASE_PASSWORD} - name: jwt-secret value: ${JWT_SECRET}
# azure.yaml - Configure network security infra: parameters: enablePrivateEndpoints: true allowedIPs: - "203.0.113.0/24" # Office IP range - "198.51.100.0/24" # VPN IP range
services: api: project: ./src/api host: containerapp identity: type: systemAssigned keyVault: - name: app-secrets secrets: - database-connection - external-api-key
# 回滚到之前的部署 azd deploy --rollback # 回滚特定服务 azd deploy --service api --rollback # 回滚到特定版本 azd deploy --service api --version v1.2.3
# 回滚基础设施更改 azd provision --rollback # 预览回滚更改 azd provision --rollback --preview
#!/bin/bash # scripts/回滚数据库.sh echo "Rolling back database migrations..." npm run db:rollback echo "Validating database state..." npm run db:validate echo "Database rollback completed"
# 启用部署指标 azd config set telemetry.deployment.enabled true # 查看部署历史 azd history # 获取部署统计数据 azd metrics --type deployment
# azure.yaml - Configure custom metrics hooks: postdeploy: shell: sh run: | # Record deployment metrics DEPLOY_TIME=$(date +%s) SERVICE_COUNT=$(azd show --output json | jq '.services | length') # Send to monitoring system curl -X POST "https://metrics.company.com/deployments" \ -H "Content-Type: application/json" \ -d "{\"timestamp\": $DEPLOY_TIME, \"service_count\": $SERVICE_COUNT}"
# 使用一致的命名 azd env new dev-$(whoami) azd env new staging-$(git rev-parse --short HEAD) azd env new production-v1 # 保持环境一致性 ./scripts/sync-environments.sh
# 部署前验证 azd provision --preview azd provision --what-if # 使用ARM/Bicep代码检查 az bicep lint --file infra/main.bicep
hooks: predeploy: shell: sh run: | # Unit tests npm run test:unit # Security scanning npm audit # Code quality checks npm run lint npm run type-check postdeploy: shell: sh run: | # Integration tests npm run test:integration # Performance tests npm run test:performance # Smoke tests npm run test:smoke
# 记录部署流程 echo "# Deployment Log - $(date)" >> DEPLOYMENT.md echo "Environment: $(azd env show --output json | jq -r '.name')" >> DEPLOYMENT.md echo "Services deployed: $(azd show --output json | jq -r '.services | keys | join(", ")')" >> DEPLOYMENT.md
目标:掌握完整部署与增量部署的区别
# 初始部署 mkdir deployment-practice && cd deployment-practice azd init --template todo-nodejs-mongo azd up # 记录初始部署时间 echo "Full deployment: $(date)" > deployment-log.txt # 进行代码更改 echo "// Updated $(date)" >> src/api/src/server.js # 仅部署代码(快速) time azd deploy echo "Code-only deployment: $(date)" >> deployment-log.txt # 比较时间 cat deployment-log.txt # 清理 azd down --force --purge
成功标准:
azd deploy 后保持不变学习成果:对于代码更改,azd deploy 比 azd up 快50-70%
目标:实现部署前后自动化
# 创建预部署验证脚本 mkdir -p scripts cat > scripts/pre-deploy-check.sh << 'EOF' #!/bin/bash echo "⚠️ Running pre-deployment checks..." # 检查测试是否通过 if ! npm run test:unit; then echo "❌ Tests failed! Aborting deployment." exit 1 fi # 检查未提交的更改 if [[ -n $(git status -s) ]]; then echo "⚠️ Warning: Uncommitted changes detected" fi echo "✅ Pre-deployment checks passed!" EOF chmod +x scripts/pre-deploy-check.sh # 创建部署后冒烟测试 cat > scripts/post-deploy-test.sh << 'EOF' #!/bin/bash echo " Running smoke tests..." WEB_URL=$(azd show --output json | jq -r '.services.web.endpoint') if curl -f "$WEB_URL/health"; then echo "✅ Health check passed!" else echo "❌ Health check failed!" exit 1 fi echo "✅ Smoke tests completed!" EOF chmod +x scripts/post-deploy-test.sh # 将钩子添加到azure.yaml cat >> azure.yaml << 'EOF' hooks: predeploy: shell: sh run: ./scripts/pre-deploy-check.sh postdeploy: shell: sh run: ./scripts/post-deploy-test.sh EOF # 使用钩子测试部署 azd deploy
成功标准:
目标:实现分阶段部署工作流程(开发 → 测试 → 生产)
# 创建部署脚本 cat > deploy-staged.sh << 'EOF' #!/bin/bash set -e echo " Staged Deployment Workflow" echo "==============================" # 第一步:部署到开发环境 echo " ️ Step 1: Deploying to development..." azd env select dev azd up --no-prompt echo "Running dev tests..." curl -f $(azd show --output json | jq -r '.services.web.endpoint')/health # 第二步:部署到预生产环境 echo " Step 2: Deploying to staging..." azd env select staging azd up --no-prompt echo "Running staging tests..." curl -f $(azd show --output json | jq -r '.services.web.endpoint')/health # 第三步:手动批准生产环境部署 echo " ✅ Dev and staging deployments successful!" read -p "Deploy to production? (yes/no): " confirm if [[ $confirm == "yes" ]]; then echo " Step 3: Deploying to production..." azd env select production azd up --no-prompt echo "Running production smoke tests..." curl -f $(azd show --output json | jq -r '.services.web.endpoint')/health echo " ✅ Production deployment completed!" else echo "❌ Production deployment cancelled" fi EOF chmod +x deploy-staged.sh # 创建环境 azd env new dev azd env new staging azd env new production # 运行分阶段部署 ./deploy-staged.sh
成功标准:
目标:实现并测试部署回滚
# 部署 v1 azd env set APP_VERSION "1.0.0" azd up # 保存 v1 配置 cp -r .azure/production .azure/production-v1-backup # 部署带有重大更改的 v2 echo "throw new Error('Intentional break')" >> src/api/src/server.js azd env set APP_VERSION "2.0.0" azd deploy # 检测故障 if ! curl -f $(azd show --output json | jq -r '.services.api.endpoint')/health; then echo "❌ v2 deployment failed! Rolling back..." # 回滚代码 git checkout src/api/src/server.js # 回滚环境 azd env set APP_VERSION "1.0.0" # 重新部署 v1 azd deploy echo "✅ Rolled back to v1.0.0" fi
成功标准:
# 创建部署指标脚本 cat > track-deployment.sh << 'EOF' #!/bin/bash START_TIME=$(date +%s) azd deploy "$@" END_TIME=$(date +%s) DURATION=$((END_TIME - START_TIME)) echo " Deployment Metrics:" echo "Duration: ${DURATION}s" echo "Timestamp: $(date)" echo "Environment: $(azd env show --output json | jq -r '.name')" echo "Services: $(azd show --output json | jq -r '.services | keys | join(", ")')" # 记录到文件 echo "$(date +%Y-%m-%d,%H:%M:%S),$DURATION,$(azd env show --output json | jq -r '.name')" >> deployment-metrics.csv EOF chmod +x track-deployment.sh # 使用它 ./track-deployment.sh
分析您的指标:
# 查看部署历史 cat deployment-metrics.csv # 计算平均部署时间 awk -F',' '{sum+=$2; count++} END {print "Average: " sum/count "s"}' deployment-metrics.csv
导航
免责声明:
本文档使用AI翻译服务Co-op Translator进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于重要信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。