使用Azure DevOps管道实现从开发到生产的无缝部署

本文详细介绍了如何利用Azure Developer CLI与Azure DevOps管道实现"一次构建,随处部署"的现代化CI/CD模式。通过多阶段管道设计、环境特定基础设施配置和包工件管理,确保跨环境部署的一致性和可靠性。

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: Add actual validation here
          # Examples:
          # - Health checks and integration tests
          # - Security and compliance scanning
          # - Performance validation
          sleep 3  # Simulate validation time
          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
    # use prod settings to override default environment variables
    # this variables become ENV VARS for all tasks in this job
    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 Pipeline将应用程序部署到生产环境:

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 Pipelines组织并检查管道运行。

专业提示:使用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,基本方法保持一致。条件性基础设施部署和包推广确保在您的开发生命周期中实现可靠的部署。

有关实现的问题或想要分享您的Azure DevOps方法?在此处加入讨论。

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