教程:使用 Aspire 部署 Azure Developer CLI 项目

通过 Azure Developer CLI(azd),可以通过自动配置所需的身份验证和环境设置,使用 Aspire 操作或 GitHub Devops 管道来部署 Azure 项目。 本文将引导您使用azd在Azure Container Apps上创建和部署Aspire项目的过程。 你将了解以下概念:

  • 探索azd如何与Aspire项目集成工作
  • 使用GitHub 或 Azure DevOps 存储库为项目Aspire创建和配置azd
  • 监视和探索 GitHub Actions 工作流或 Azure DevOps 管道执行和 Azure 部署

先决条件

若要使用 Aspire,需要在本地安装以下各项:

有关详细信息,请参阅 Aspire 设置和工具以及 Aspire SDK

  • 创建 Azure DevOps 组织 或选择现有组织
  • 创建 Azure DevOps 个人访问令牌(PAT),并将其保存供以后使用。 使用以下权限配置令牌:
    • 代理池(读取和管理)
    • 生成(读取和执行)
    • 代码(完整)
    • 项目和团队(读取、写入和管理)
    • 发布(读取、写入、执行和管理)
    • 服务连接(读取、查询和管理)

还需要在Azure Developer CLI本地安装(版本 1.5.1 或更高版本)。 常见的安装选项包括:

winget install microsoft.azd

创建 Aspire 解决方案

作为起点,本文假定你已从Aspire模板创建了解决方案。 有关详细信息,请参阅 快速入门:生成第一个 Aspire 应用

初始化模板

  1. 打开新的终端窗口,并 cd 进入解决方案的 Aspire 目录中。

  2. 执行 azd init 命令以使用 azd初始化项目,这将检查本地目录结构并确定应用的类型。

    azd init
    

    有关 azd init 命令的详细信息,请参阅 azd init

  3. 提示你使用三个应用初始化选项时,选择azd

    ? How do you want to initialize your app?  [Use arrows to move, type to filter]
    > Use code in the current directory
      Select a template
      Create a minimal project
    
  4. 扫描目录后, azd 提示你确认它找到了正确的 AspireAppHost 项目。 选择确认并继续初始化我的应用选项。

    Detected services:
    
      .NET (Aspire)
      Detected in: D:\source\repos\AspireSample\AspireSample.AppHost\AspireSample.AppHost.csproj
    
    azd will generate the files necessary to host your app on Azure using Azure Container Apps.
    
    ? Select an option  [Use arrows to move, type to filter]
    > Confirm and continue initializing my app
      Cancel and exit
    
  5. 输入环境名称,该名称用于命名 Azure 中预配的资源,并管理不同的环境,例如 devprod

    Generating files to run your app on Azure:
    
      (✓) Done: Generating ./azure.yaml
      (✓) Done: Generating ./next-steps.md
    
    SUCCESS: Your app is ready for the cloud!
    You can provision and deploy your app to Azure by running the azd up command in this directory. For more information on configuring your app, see ./next-steps.md
    

azd 生成多个文件并将其放入工作目录中。 这些文件包括:

  • azure.yaml:描述应用的服务,例如 Aspire AppHost 项目,并将其映射到 Azure 资源。
  • .azure/config.json:配置文件,告知 azd 当前活动环境是什么。
  • .azure/aspireazddev/.env:包含特定于环境的覆盖项。

创建 GitHub 存储库和管道

通过 Azure Developer CLI,可以使用正确的配置和权限自动创建 CI/CD 管道,以便为 Azure 预配和部署资源。 如果应用尚不存在,azd 还可以为应用创建 GitHub 存储库。

  1. 运行 azd pipeline config 命令以配置部署管道并安全地将其连接到 Azure:

    azd pipeline config
    
  2. 选择要预配和部署应用资源的订阅。

  3. 选择用于资源的 Azure 位置。

  4. 当系统提示是否在目录中创建新的 Git 存储库时,请输入 y,然后按下 Enter

    注释

    创建 GitHub 存储库需要登录到 GitHub。 根据你的偏好,有几个选择会有所不同。 登录后,系统会提示你在当前目录中创建新的存储库。

  5. 选择 创建新的专用 GitHub 存储库 以配置 git 远程。

  6. 输入新 GitHub 存储库选择的名称,或按 Enter 以使用默认名称。 azd 在 GitHub 中创建新的存储库,并将其配置为包含认证 Azure所需的机密。

    显示管道配置步骤的屏幕截图。

  7. 提示你提交并推送本地更改以启动配置的管道时,输入 azd 以继续。

探索 GitHub Actions 工作流及部署

  1. 使用 GitHub 的链接输出导航到新的 azd 存储库。

  2. 选择 操作 选项卡以查看存储库工作流。 应会看到新工作流正在运行或已完成。 选择工作流以查看运行日志中的作业步骤和详细信息。 例如,可以展开 “部署应用程序 ”等步骤以查看已完成作的详细信息。

    显示 GitHub 操作工作流步骤的屏幕截图。

  3. 选择部署应用程序以展开此步骤的日志。 你应该看到为 apiservicewebfrontend 输出两个终结点 url。 选择其中任一链接可在另一个浏览器选项卡中打开它们,并浏览已部署的应用程序。

    显示已部署的应用链接的屏幕截图。

祝贺! 你已使用Aspire以及Azure Developer CLI Actions 成功部署了GitHub项目。

为多项目解决方案配置工作目录

将 Actions 添加到 GitHub 现有多项目 Aspire 解决方案(其中 AppHost 项目不在根目录中)时,可能需要为某些工作流步骤配置 working-directory 参数。 本部分介绍何时以及如何进行这些调整。

需要工作目录配置时

azd pipeline config 命令生成一个 GitHub Actions 工作流,该 Aspire 工作流假定 AppHost 项目位于存储库的根目录中。 但是,在许多实际方案中,尤其是在 添加到 Aspire 现有应用程序时,AppHost 项目可能位于子目录中。

例如,如果存储库结构如下所示:

└───📂 MyAspireApp
    ├───📂 MyAspireApp.ApiService
    ├───📂 MyAspireApp.AppHost
    │    ├─── MyAspireApp.AppHost.csproj
    │    └─── AppHost.cs
    ├───📂 MyAspireApp.Web
    └─── MyAspireApp.sln

预配基础结构部署应用程序的生成的工作流步骤需要从MyAspireApp.AppHost目录运行,而不是从存储库根目录运行。

更新 GitHub Actions 工作流

运行 azd pipeline config后,检查生成的工作流文件 .github/workflows/azure-dev.yml。 查找运行 azd 命令并根据需要添加 working-directory 参数的步骤。

下面是原始生成步骤的示例:

- name: Provision Infrastructure
  run: azd provision --no-prompt
  env:
    AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }}
    AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}
    AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}

- name: Deploy Application
  run: azd deploy --no-prompt
  env:
    AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }}
    AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}
    AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}

更新以下步骤以包括 working-directory 参数:

- name: Provision Infrastructure
  run: azd provision --no-prompt
  working-directory: ./MyAspireApp.AppHost
  env:
    AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }}
    AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}
    AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}

- name: Deploy Application
  run: azd deploy --no-prompt
  working-directory: ./MyAspireApp.AppHost
  env:
    AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }}
    AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}
    AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}

查找正确的工作目录

工作目录应指向包含 Aspire AppHost 项目的文件夹(包含由生成的 azd init 文件的项目)。 可以通过以下方法标识此目录:

  1. 查找其 Aspire.AppHost 文件中包含 .csproj 包引用的项目。
  2. 查找包含 azure.yaml 文件的目录。
  3. 找到解决方案中引用的项目,以协调其他服务。

注释

某些 azd 命令(例如 azd init 在管道设置期间)在未从 AppHost 项目目录中运行时,也可能需要 working-directory 参数。

创建 Azure DevOps 存储库和管道

重要

如先决条件中所述,需要 创建 Azure DevOps 组织 或选择现有组织来完成后续步骤。 还需要 使用先决条件中列出的权限创建个人访问令牌(PAT)

通过 Azure Developer CLI,可以自动创建配置正确、权限设置完备的管道,从而实现向 Azure预配和部署资源。 如果你的应用还不存在 azd Pipelines 存储库,Azure 也可以为其创建。

  1. 运行 azd pipeline config 命令以配置部署管道并安全地将其连接到 Azure。 要包括 --provider azdo 选项,以使用 Azure 管道代替默认的 GitHub 操作配置。

    azd pipeline config --provider azdo
    

    重要

    在运行 azd pipeline config之前,请确保已成功运行 azd init 以初始化项目。 如果在管道执行过程中遇到“不存在项目”之类的错误,请参阅解决方案 的故障排除部分

  2. 选择要预配和部署应用资源的订阅。

  3. 选择用于资源的 Azure 位置。

  4. 粘贴之前创建的个人访问令牌。

  5. 输入已创建或选择的 Azure DevOps 组织名称。

  6. 当系统提示在当前目录中创建新存储库时,请输入 y,然后按 Enter

  7. 当系统提示配置 git remote 时,请选择“创建新的 Azure DevOps Project

  8. 为新存储库输入所选的唯一名称,例如 aspireazdazd 在 Azure Repos 中创建新的存储库,并使用 Azure进行身份验证所需的必要机密对其进行配置。

    显示管道配置步骤的屏幕截图。

  9. 提示你提交并推送本地更改以启动配置的管道时,输入 azd 以继续。

浏览管道和已部署的应用

  1. 使用由 Azure 输出的状态链接导航到新 azd Pipeline。

    一张显示成功运行 Azure 流水线的屏幕截图。

  2. 选择完成的管道运行以查看摘要。

    显示 Azure Pipelines 运行摘要视图的屏幕截图。

  3. 选择视图底部的作业链接,导航到作业详细信息。

    一张显示 Azure 管道运行详细视图的屏幕截图。

  4. 作业详细信息页显示所有各个阶段的状态。 选择 预配基础结构 以查看该阶段的日志,其中详细介绍了 azd完成的所有预配步骤。 在日志底部记下最终状态消息,并链接到预配的 Azure 资源组。

  5. 选择预配输出日志底部的链接,导航到新的 Azure 资源组。

    显示已部署 Azure 资源的屏幕截图。

    注释

    还可以通过在 Azure 门户中搜索资源组的名称,直接导航到新资源组。 你的资源组名称将是你提供给 azd 的环境名称,前缀为 rg-

  6. 选择 webfrontend 容器应用,该应用托管网站的面向公众的部分。

  7. webfrontend 详细信息页面上,选择应用程序 URL 链接,以在浏览器中打开你的网站。

重要

如果在浏览器中查看站点时遇到 403 Forbidden 错误,请确保正确配置入口设置。 在 门户的 Azure 应用页面上,导航到左侧导航栏的入口。 请确保将 入口流量 设置为 接受来自任何地方的流量,并保存更改。

祝贺! 成功使用Azure Developer CLI和Azure管道部署Aspire项目。

排查 Azure DevOps 管道部署问题

本部分介绍使用 Aspire DevOps 管道部署Azure项目时可能会遇到的常见问题。

错误:不存在项目;若要创建新项目,请运行 azd init

问题:在 DevOps 管道的 Azure 预配步骤中,遇到错误消息:

ERROR: no project exists; to create a new project, run azd init

原因:发生此错误的原因是 azd init 命令生成通常未提交到存储库的文件(azure.yaml.azure 文件夹)。 管道在干净环境中运行时,这些文件不存在,导致 azd 命令失败。

解决方案:可通过多种方法来解决此问题:

在预配步骤之前,在 azd init DevOps 管道中添加一个 Azure 步骤。 可以使用 --from-code--no-prompt 标志以非交互方式运行命令:

- task: AzureCLI@2
  displayName: 'Initialize Azure Developer CLI'
  inputs:
    azureSubscription: '$(AZURE_SERVICE_CONNECTION)'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      azd init --from-code --no-prompt
      azd env new $(AZURE_ENV_NAME) --location $(AZURE_LOCATION) --subscription $(AZURE_SUBSCRIPTION_ID)

注释

即使遇到提示 --no-prompt,也尝试运行 azd initazd env new 作为单独的步骤,或使用环境变量来提供任何提示的答案。 该 --from-code 标志指示 azd 使用当前目录中的现有代码,而不是从模板创建新项目。

请确保在管道中定义以下变量:

  • AZURE_ENV_NAME:环境名称(例如, devprod)。
  • AZURE_LOCATION:你的 Azure 区域(例如, eastus2)。
  • AZURE_SUBSCRIPTION_ID:您的Azure订阅 ID。

选项 2:将所需文件提交到存储库

如果希望将生成的文件提交到存储库:

  1. 在项目目录中本地运行 azd init
  2. 将生成的 azure.yaml 文件添加到存储库。
  3. (可选)如果要保留特定于环境的设置,请将 .azure 文件夹添加到存储库。

注释

.azure 文件夹包含可能包含敏感信息的环境特定配置。 在将文件提交到存储库之前,请仔细审核内容。

选项 3:将 azd pipeline config 与适当的初始化配合使用

确保在本地成功运行 azd pipeline config --provider azdo 后运行 azd init。 此命令应使用正确的配置设置管道,以便自动处理初始化。

如果继续遇到问题,请验证:

  • 项目结构与 azd 项目所期望的 Aspire 相匹配。
  • 在正确的目录(通常是 .sln 文件所在的位置)运行命令。
  • Azure DevOps 服务连接具有预配资源所需的权限。

清理资源

运行以下 Azure CLI 命令,在不再需要创建的 Azure 资源时删除资源组。 删除资源组也会删除其中包含的资源。

az group delete --name <your-resource-group-name>

有关详细信息,请参阅 清理 Azure中的资源。