Azure开发者CLI:一键从开发到生产环境部署

本文详细介绍如何使用Azure开发者CLI实现“一次构建,到处部署”模式,通过条件化Bicep部署和环境变量注入,实现从开发到生产环境的自动化晋升流程,包含基础设施配置和CI/CD管道优化。

环境特定基础设施

在跨环境部署应用程序时,会出现不同的需求:

组件 开发环境 生产环境
网络 公共访问 VNet集成 + 私有端点
存储 带限制的公共访问 仅私有端点
应用服务计划 B2基础版 S1标准版
安全性 托管身份 增强网络隔离

我们可以使用基于环境变量自适应的一组Bicep文件,而不是为每个环境维护单独的基础设施模板或复杂的配置文件。这种方法消除了基础设施漂移,同时保持部署简单一致。

基于环境变量设置资源

为了根据环境类型有条件地配置资源,azd利用环境变量AZURE_ENV_TYPE在部署时做出决策。

在后台,azd将AZURE_ENV_TYPE作为envType参数传递给Bicep:

1
2
3
@description('Environment type - determines networking configuration (dev/test/prod)')
@allowed(['dev', 'test', 'prod'])
param envType string = 'dev'

然后,此参数驱动Bicep中的条件资源部署:

网络部署:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 仅在生产环境中部署网络基础设施
module network './network.bicep' = if (envType == 'prod') {
  name: 'networkDeployment'
  params: {
    location: location
    tags: tags
    abbrs: abbrs
    resourceToken: resourceToken
  }
}

存储配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
module storageAccount 'br/public:avm/res/storage/storage-account:0.17.2' = {
  name: 'storageAccount'
  params: {
    name: storageAccountName
    allowSharedKeyAccess: false
    publicNetworkAccess: envType == 'prod' ? 'Disabled' : 'Enabled'
    networkAcls: envType == 'prod' ? {
      defaultAction: 'Deny'
      virtualNetworkRules: []
      bypass: 'AzureServices'
    } : {
      defaultAction: 'Allow'
      virtualNetworkRules: []
      bypass: 'AzureServices'
    }
    // ... 其他配置
  }
}

应用服务计划规模:

1
2
3
4
sku: {
  name: envType == 'prod' ? 'S1' : 'B2'
  tier: envType == 'prod' ? 'Standard' : 'Basic'
}

增强默认CI/CD工作流

azd包含一个强大的命令来引导CI/CD管道:

1
azd pipeline config

这会生成一个基本工作流。但是,对于开发到生产的晋升,需要使用以下步骤进行增强:

重要更新 更新于2025年7月30日:原始方法使用本地文件备份(在同一作业中复制zip文件)。然而,社区指出使用原生CI/CD工件系统更符合惯例。我们已更新存储库和以下步骤以使用GitHub Action工件。

  1. 一次性打包:
1
2
3
4
5
- name: Package Application
  run: |
    mkdir -p ./dist
    azd package app --output-path ./dist/app-package.zip
    echo " Application packaged successfully"
  1. 上传应用程序包:
1
2
3
4
5
6
- name: Upload Application Package
  uses: actions/upload-artifact@v4
  with:
    name: app-package
    path: ./dist/app-package.zip
    retention-days: 30
  1. 部署到开发环境:
1
2
- name: Deploy to Development
  run: azd deploy app --from-package ./dist/app-package.zip --no-prompt
  1. 验证门控:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
- name: Validate Application
  run: |
    echo " Validating application in development environment..."
    # TODO: 在此处添加验证逻辑:
    # 示例:
    # - 健康检查和集成测试
    # - 安全性和合规性扫描
    # - 性能验证
    sleep 3  # 模拟验证时间
    echo " Application validation passed"
  1. 下载应用程序包:
1
2
3
4
5
- name: Download Application Package
  uses: actions/download-artifact@v4
  with:
    name: app-package
    path: ./prod-deploy
  1. 设置环境变量:
1
2
3
4
5
6
7
8
9
- name: Promote to Production
  run: |
    # 通过将-dev替换为-prod来创建生产环境名称,如果没有-dev后缀则添加-prod
    PROD_ENV_NAME="${AZURE_ENV_NAME%-dev}-prod"
    echo "Production environment name: $PROD_ENV_NAME"

    # 为此步骤设置环境变量
    export AZURE_ENV_NAME="$PROD_ENV_NAME"
    export AZURE_ENV_TYPE="prod"
  1. 部署到生产环境:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 使用工件包 - 真正的"一次构建,到处部署"
PACKAGE_PATH="./prod-deploy/app-package.zip"  

if [ -f "$PACKAGE_PATH" ]; then
  echo " Deploying to production using artifact package: $PACKAGE_PATH"
  azd deploy app --from-package "$PACKAGE_PATH" --no-prompt
  echo " Production deployment completed successfully"
else
  echo " Package artifact not found - falling back to regular deployment"
  azd deploy --no-prompt
fi

分步设置

按照以下步骤设置开发和生产环境,然后配置CI/CD管道:

  1. 从模板初始化项目
1
azd init -t https://github.com/puicchan/azd-dev-prod-appservice-storage

这将下载包含所有Bicep文件和增强的GitHub Actions工作流的完整实现。

  1. 设置开发环境
1
azd up

当提示输入环境名称时,使用myproj-dev(或您偏好的带有-dev后缀的命名模式)。

注意:默认的envTypedev,因此您不需要为开发环境设置AZURE_ENV_TYPE环境变量。基础设施将自动配置为具有公共访问和成本优化的资源。

  1. 设置生产环境

创建并配置生产环境:

1
2
3
4
5
6
7
8
# 创建新的生产环境
azd env new myproj-prod

# 将环境类型设置为生产
azd env set AZURE_ENV_TYPE prod

# 部署生产环境
azd up

这将配置具有VNet集成、私有端点和增强安全性的生产基础设施。请注意,运行azd up也会将应用程序部署到生产基础设施。这是为了演示目的,加上我们仍处于开发阶段。在真实场景中,如果应用程序已经在生产中,您可能永远不会直接部署应用程序。

  1. 切换回开发环境
1
azd env select myproj-dev

您现在可以在开发环境中进行开发和测试。

  1. 进行代码更改

编辑您的应用程序代码(例如,修改app/templates/index.htmlapp.py)以测试晋升工作流。

  1. 配置CI/CD管道
1
azd pipeline config

GitHub Actions工作流已通过开发到生产晋升逻辑增强。具体来说,管道将:

  • 在开发环境(myproj-dev)中部署和验证
  • 使用相同的包自动晋升到生产环境(myproj-prod
  • 自动处理环境命名转换

一旦配置完成,每次推送到主分支都会触发自动的开发到生产晋升管道!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计