使用Azure DevOps流水线实现从开发到生产的无缝部署

本文详细介绍了如何利用Azure Developer CLI和Azure DevOps流水线实现"一次构建,随处部署"的现代化CI/CD模式。通过多阶段流水线架构,展示了从代码打包、开发环境部署到生产环境推广的完整流程,包含具体YAML配置和最佳实践。

Azure Developer CLI:通过Azure DevOps流水线实现从开发到生产

基于我们之前关于使用GitHub Actions实现开发到生产推广的帖子,这篇后续文章演示了使用Azure DevOps流水线实现相同的"一次构建,随处部署"模式。您将学习如何利用Azure DevOps YAML流水线与Azure Developer CLI(azd)。这种方法确保跨环境的一致、可靠部署。

环境特定基础设施

基础设施方法与之前的GitHub Actions实现相同。它使用带有单个envType参数的条件性Bicep部署。这驱动环境特定的资源配置。相同的Bicep模板在两个CI/CD平台上都能无缝工作。

有关完整的基础设施设置详情,请参考GitHub Actions帖子。

从文件备份到流水线工件

原始方法使用本地文件备份(在同一作业内复制zip文件)。然而,社区指出使用原生CI/CD工件系统更符合惯例。这提供了几个关键优势:

  • 跨作业兼容性:工件在多个作业和阶段间无缝工作
  • 自动清理:平台自动处理保留策略
  • 更好的可追溯性:工件在平台UI中可见,带有下载历史
  • 平台集成:具有内置安全性和访问控制的本机功能

这种基于工件的方法代表了"一次构建,随处部署"模式的行业标准。它在现代CI/CD平台间都能工作。我们已更新了原始的GitHub Actions实现,以使用此Azure DevOps版本中演示的相同模式。

Azure DevOps流水线增强

Azure DevOps流水线需要与GitHub Actions不同的方法。然而,它们实现了相同的结果。我们将演示一个多阶段流水线,提供适当的关注点分离和企业就绪的部署模式。与单作业流水线相比,这种分阶段方法提供了更好的隔离、审批工作流和可追溯性。

增强的流水线遵循三阶段结构:

1. 流水线结构

多阶段流水线为构建、开发部署和生产推广使用单独的阶段:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 当提交推送到main时运行
trigger:
  - main

pool:
  vmImage: ubuntu-latest

stages:
- stage: build_and_test
- stage: deploy_development
  dependsOn: build_and_test
- stage: promote_to_Prod
  dependsOn: deploy_development

2. 构建和打包阶段

第一阶段专注于为部署构建和打包应用程序:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
- stage: build_and_test
  jobs:
  - job: buildAndPackage
    pool:
      vmImage: ubuntu-latest
    steps:
    - task: Bash@3
      displayName: Install azd
      inputs:
        targetType: 'inline'
        script: |
          curl -fsSL https://aka.ms/install-azd.sh | bash
    
    - task: PowerShell@2
      displayName: Configure AZD to Use AZ CLI Authentication.
      inputs:
        targetType: inline
        script: |
          azd config set auth.useAzCliAuth "true"
        pwsh: true
    
    - task: AzureCLI@2
      displayName: Package Application
      inputs:
        azureSubscription: azconnection
        scriptType: bash
        scriptLocation: inlineScript
        keepAzSessionActive: true
        inlineScript: |
          mkdir -p ./dist
          azd package app --output-path ./dist/app-package.zip  --no-prompt
          echo " Application packaged successfully"
    
    - task: PublishPipelineArtifact@1
      displayName: Upload Package Artifact
      inputs:
        targetPath: './dist/app-package.zip'
        artifact: 'app-package'
        publishLocation: 'pipeline'

3. 部署到开发阶段

第二阶段配置开发基础设施并部署打包的应用程序:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
- stage: deploy_development
  dependsOn: build_and_test
  jobs:
  - job: deployToDevelopment
    pool:
      vmImage: ubuntu-latest
    steps:
    - task: Bash@3
      displayName: Install azd
      inputs:
        targetType: 'inline'
        script: |
          curl -fsSL https://aka.ms/install-azd.sh | bash
    
    - task: PowerShell@2
      displayName: Configure AZD to Use AZ CLI Authentication.
      inputs:
        targetType: inline
        script: |
          azd config set auth.useAzCliAuth "true"
        pwsh: true
    
    - task: AzureCLI@2
      displayName: Provision DEV Infrastructure
      inputs:
        azureSubscription: azconnection
        scriptType: bash
        scriptLocation: inlineScript
        keepAzSessionActive: true
        inlineScript: |
          azd provision --no-prompt

    - task: DownloadPipelineArtifact@2
      displayName: Download Package Artifact
      inputs:
        buildType: 'current'
        artifactName: 'app-package'
        targetPath: './artifacts'

    - task: AzureCLI@2
      displayName: Deploy to Development
      inputs:
        azureSubscription: azconnection
        scriptType: bash
        scriptLocation: inlineScript
        keepAzSessionActive: true
        inlineScript: |
          azd deploy app --from-package ./artifacts/app-package.zip --no-prompt

4. 验证门

在推广到生产之前添加验证检查:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
    - task: AzureCLI@2
      displayName: Validate Application
      inputs:
        azureSubscription: azconnection
        scriptType: bash
        scriptLocation: inlineScript
        keepAzSessionActive: true
        inlineScript: |
          echo " Validating application in development environment..."
          # TODO: 在此添加实际验证
          # 示例:
          # - 健康检查和集成测试
          # - 安全性和合规性扫描
          # - 性能验证
          sleep 3  # 模拟验证时间
          echo " Application validation passed"

5. 推广到生产阶段

最终阶段使用环境特定变量部署到生产环境:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
- stage: promote_to_Prod
  dependsOn: deploy_development
  jobs:
  - job: deployProduction
    # 使用生产设置覆盖默认环境变量
    # 这些变量成为此作业中所有任务的ENV VARS
    variables:
      AZURE_ENV_NAME: $(AZURE_PROD_ENV_NAME)
      AZURE_ENV_TYPE: $(AZURE_PROD_ENV_TYPE)
      AZURE_LOCATION: $(AZURE_PROD_LOCATION)
      AZURE_SUBSCRIPTION_ID: $(AZURE_PROD_SUBSCRIPTION_ID)
    pool:
      vmImage: ubuntu-latest
    steps:
    - task: Bash@3
      displayName: Install azd
      inputs:
        targetType: 'inline'
        script: |
          curl -fsSL https://aka.ms/install-azd.sh | bash
    
    - task: PowerShell@2
      displayName: Configure AZD to Use AZ CLI Authentication.
      inputs:
        targetType: inline
        script: |
          azd config set auth.useAzCliAuth "true"
        pwsh: true
    
    - task: DownloadPipelineArtifact@2
      displayName: Download Package Artifact
      inputs:
        buildType: 'current'
        artifactName: 'app-package'
        targetPath: './artifacts'

    - task: AzureCLI@2
      displayName: Deploy to PROD
      inputs:
        azureSubscription: azconnection
        scriptType: bash
        scriptLocation: inlineScript
        keepAzSessionActive: true
        inlineScript: |
          azd deploy app --from-package ./artifacts/app-package.zip --no-prompt

尝试使用

您可以使用此处的完整实现尝试此方法。

观看演练:

先决条件

您需要个人访问令牌(PAT)来设置带有azd的Azure DevOps流水线。有关PAT创建和流水线设置的详细指导,请参考Microsoft Learn文档。

设置步骤

1. 初始化项目

1
azd init -t https://github.com/puicchan/azd-dev-prod-appservice-storage

使用类似projazdo-dev的环境名称。

2. 编辑azure.yaml

确保将Azure DevOps配置为CICD工具并添加这些流水线变量:

1
2
3
4
5
6
7
pipeline:
  provider: azdo
  variables:
    - AZURE_PROD_ENV_NAME
    - AZURE_PROD_ENV_TYPE
    - AZURE_PROD_LOCATION
    - AZURE_PROD_SUBSCRIPTION_ID

3. 设置开发环境

1
azd up

4. 设置生产环境

我们将运行azd provision并依赖Azure流水线将应用程序部署到生产环境:

1
2
3
azd env new projazdo-prod
azd env set AZURE_ENV_TYPE prod
azd provision

5. 测试流程

切换回开发环境:

1
azd env select projazdo-dev

编辑您的应用程序代码,并确保运行azd env set来配置流水线所需的以下环境变量:

  • AZURE_PROD_ENV_NAME
  • AZURE_PROD_ENV_TYPE
  • AZURE_PROD_LOCATION
  • AZURE_PROD_SUBSCRIPTION_ID

6. 配置CI/CD流水线

1
azd pipeline config

转到您的Azure流水线组织并检查流水线运行。

专业提示:使用AI增强您的流水线

需要Azure DevOps和azd的帮助吗?带有Azure MCP的GitHub Copilot for Azure可以直接在VS Code中帮助您增强azure-dev.yml文件。

安装GitHub Copilot for Azure扩展,并在代理模式下启用GitHub Copilot for Azure和Azure MCP工具后,GitHub Copilot可以:

  • 调试流水线问题:分析YAML语法错误和配置问题
  • 添加验证步骤:建议健康检查、安全扫描或集成测试
  • 优化部署策略:推荐蓝绿部署或金丝雀发布
  • 配置环境特定逻辑:帮助为不同环境设置条件步骤

只需向GitHub Copilot提问:

  • “向我的Azure DevOps流水线添加健康检查验证步骤”
  • “如何在生产部署之前添加手动审批门”

带有GitHub Copilot for Azure的代理模式提供对Azure资源的上下文理解。它可以根据您的特定基础设施设置建议流水线改进。

结论

此Azure DevOps实现演示了"一次构建,随处部署"模式如何在不同CI/CD平台间无缝转换。核心azd和Bicep逻辑保持相同。同时,平台特定功能(如服务连接和任务定义)提供了Azure DevOps原生体验。

无论您选择GitHub Actions还是Azure DevOps,基本方法保持一致。条件性基础设施部署和包推广确保在您的开发生命周期中实现可靠的部署。

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