使用 GitHub Actions 部署到 Azure 容器应用

Azure 容器应用允许使用 GitHub Actions 将修订版本发布到容器应用。 将提交推送到 GitHub 存储库时,会触发一个工作流,从而更新容器注册表中的容器映像。 Azure 容器应用基于更新的容器映像创建新修订版。

更改 GitHub 存储库将触发创建新修订版本的操作。

向存储库中的特定分支提交会触发 GitHub Actions 工作流。 创建工作流时,决定触发工作流的分支。

本文介绍如何创建完全可自定义的工作流。 若要使用 Azure CLI 生成初学者 GitHub Actions 工作流,请参阅使用 Azure CLI 生成 GitHub Actions 工作流

Azure 容器应用 GitHub 操作

若要生成和部署容器应用,请将 azure/container-apps-deploy-action 操作添加到 GitHub Actions 工作流中。

此操作支持以下方案:

  • 从 Dockerfile 生成并部署到容器应用
  • 在没有 Dockerfile 的情况下从源代码生成并部署到容器应用。 支持的语言包括 .NET、Java、Node.js、PHP 和 Python
  • 将现有容器映像部署到容器应用

用法示例

下面是使用该操作的一些常见方案。 有关详细信息,请参阅操作的 GitHub 市场页

生成并部署到容器应用

以下代码片段演示如何从源代码生成容器映像并将其部署到容器应用。

steps:

  - name: Log in to Azure
    uses: azure/login@v1
    with:
      creds: ${{ secrets.AZURE_CREDENTIALS }}

  - name: Build and deploy Container App
    uses: azure/container-apps-deploy-action@v1
    with:
      appSourcePath: ${{ github.workspace }}/src
      acrName: myregistry
      containerAppName: my-container-app
      resourceGroup: my-rg

该操作使用 appSourcePath 中的 Dockerfile 生成容器映像。 如果找不到 Dockerfile,该操作将尝试从 appSourcePath 中的源代码生成容器映像。

将现有容器映像部署到容器应用

以下代码片段演示如何将现有容器映像部署到容器应用。

steps:

  - name: Log in to Azure
    uses: azure/login@v1
    with:
      creds: ${{ secrets.AZURE_CREDENTIALS }}

  - name: Build and deploy Container App
    uses: azure/container-apps-deploy-action@v1
    with:
      acrName: myregistry
      containerAppName: my-container-app
      resourceGroup: my-rg
      imageToDeploy: myregistry.azurecr.cn/app:${{ github.sha }}

重要

如果你在单独的步骤中生成容器映像,请确保使用提交 SHA 等唯一标记,而不要使用类似于 latest 的稳定标记。 有关详细信息,请参阅映像标记最佳做法

使用 Azure 容器注册表进行身份验证

Azure 容器应用操作需要向 Azure 容器注册表进行身份验证才能推送容器映像。 容器应用也需要向 Azure 容器注册表进行身份验证才能拉取容器映像。

要推送映像,操作将使用提供给 azure/login 操作的凭据自动通过 acrName 中指定的容器注册表进行身份验证。

为了拉取映像,Azure 容器应用将使用托管标识(建议)或管理员凭据向 Azure 容器注册表进行身份验证。 若要使用托管标识,必须将操作所部署的容器应用程序配置为使用托管标识。 若要使用注册表的管理员凭据进行身份验证,请设置操作的 acrUsernameacrPassword 输入。

配置

可以执行以下步骤来配置 GitHub Actions 工作流以部署到 Azure 容器应用。

  • 为应用创建 GitHub 存储库
  • 创建启用了托管标识的容器应用
  • 将 Azure 容器注册表的 AcrPull 角色分配到容器应用的托管标识
  • 在 GitHub 存储库中配置机密
  • 创建 GitHub Actions 工作流

先决条件

要求 说明
Azure 帐户 如果没有,请创建一个试用版订阅。 需要拥有 Azure 订阅的“参与者”或“所有者”权限才能继续操作。 有关详细信息,请参阅使用 Azure 门户分配 Azure 角色
GitHub 帐户 免费注册。
Azure CLI 安装 Azure CLI

创建 GitHub 存储库并克隆源代码

在创建工作流之前,应用的源代码必须在 GitHub 存储库中。

  1. 通过 Azure CLI 登录 Azure。

    az cloud set -n AzureChinaCloud
    az login
    # az cloud set -n AzureCloud   //means return to Public Azure.
    
  2. 接下来,安装适用于 CLI 的最新 Azure 容器应用扩展。

    az extension add --name containerapp --upgrade
    
  3. 如果没有自己的 GitHub 存储库,请按照示例创建一个。

    1. 导航到以下位置以创建新存储库:
    2. 将存储库命名为 my-container-app
  4. 将存储库克隆到本地计算机。

    git clone https://github.com/<YOUR_GITHUB_ACCOUNT_NAME>/my-container-app.git
    

创建启用了托管标识的容器应用

在以下步骤中,使用 az containerapp up 命令创建容器应用。 此命令将创建 Azure 资源,生成容器映像,将映像存储在注册表中,然后将其部署到容器应用。

创建应用程序后,你可以将托管标识添加到应用中,并为该标识分配 AcrPull 角色,以允许该标识从注册表中提取映像。

  1. 切换到克隆的存储库的 src 文件夹。

    cd my-container-app
    cd src
    
  2. 使用 az containerapp up 命令创建 Azure 资源并部署容器应用。

    az containerapp up \
      --name my-container-app \
      --source . \
      --ingress external 
    
  3. 在命令输出中,记下 Azure 容器注册表的名称。

  4. 获取容器注册表的完整资源 ID。

    az acr show --name <ACR_NAME> --query id --output tsv
    

    <ACR_NAME> 替换为注册表的名称。

  5. 为容器应用启用托管标识。

    az containerapp identity assign \
      --name my-container-app \
      --resource-group my-container-app-rg \
      --system-assigned \
      --output tsv
    

    在命令输出中,记下托管标识的主体 ID。

  6. 将 Azure 容器注册表的 AcrPull 角色分配到容器应用的托管标识。

    az role assignment create \
      --assignee <MANAGED_IDENTITY_PRINCIPAL_ID> \
      --role AcrPull \
      --scope <ACR_RESOURCE_ID>
    

    请将 <MANAGED_IDENTITY_PRINCIPAL_ID> 替换为托管标识的主体 ID,并将 <ACR_RESOURCE_ID> 替换为 Azure 容器注册表的资源 ID。

  7. 配置容器应用以使用托管标识从 Azure 容器注册表中拉取映像。

    az containerapp registry set \
      --name my-container-app \
      --resource-group my-container-app-rg \
      --server <ACR_NAME>.azurecr.io \
      --identity system
    

    <ACR_NAME> 替换为 Azure 容器注册表的名称。

在 GitHub 存储库中配置机密

GitHub 工作流需要名为“AZURE_CREDENTIALS”的机密才能通过 Azure 的身份验证。 该机密包含在包含容器应用程序和容器注册表的资源组上具有“参与者”角色的服务主体的凭据。

  1. 在包含容器应用和容器注册表的资源组上创建具有“参与者”角色的服务主体。

    az ad sp create-for-rbac \
      --name my-app-credentials \
      --role contributor \
      --scopes /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/my-container-app-rg \
      --json-auth \
      --output json
    

    <SUBSCRIPTION_ID> 替换为你的 Azure 订阅的 ID。 如果容器注册表位于不同的资源组中,请在 --scopes 参数中指定这两个资源组。

  2. 从命令中复制 JSON 输出。

  3. 在 GitHub 存储库中,导航到“设置”>“机密”>“操作”,然后选择“新建存储库机密”。

  4. 输入 AZURE_CREDENTIALS 作为名称,并将 JSON 输出的内容粘贴为值。

  5. 选择“添加机密”。

创建 GitHub Actions 工作流

  1. 在 GitHub 存储库中,导航到“操作”,然后选择“新建工作流”。

  2. 选择“自己设置工作流”。

  3. 将以下 YAML 粘贴到编辑器中。

    name: Azure Container Apps Deploy
    
    on:
      push:
        branches:
          - main
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        steps:
          - uses: actions/checkout@v3
    
          - name: Log in to Azure
            uses: azure/login@v1
            with:
              creds: ${{ secrets.AZURE_CREDENTIALS }}
    
          - name: Build and deploy Container App
            uses: azure/container-apps-deploy-action@v1
            with:
              appSourcePath: ${{ github.workspace }}/src
              acrName: <ACR_NAME>
              containerAppName: my-container-app
              resourceGroup: my-container-app-rg
    

    <ACR_NAME> 替换为 Azure 容器注册表的名称。 确认 branches 下的分支名称以及 appSourcePathcontainerAppNameresourceGroup 的值与存储库和 Azure 资源的值匹配。

  4. 提交对主分支的更改。

GitHub Actions 工作流运行应开始生成和部署容器应用。 若要检查其进度,请导航到“操作”。

若要部署应用的新修订版,请将新提交推送到 main 分支。