分享方式:


使用 GitHub 動作部署至 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 Marketplace 頁面

建置並部署至容器應用程式

下列程式碼片段說明如何從原始程式碼建置容器映像,並將其部署至容器應用程式。

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.io/app:${{ github.sha }}

重要

如果您要在個別步驟中建置容器映像,請確定您使用唯一的標籤,例如認可 SHA,而不是 latest 這類穩定標籤。 如需詳細資訊,請參閱映像標籤最佳做法

向 Azure Container Registry 進行驗證

Azure 容器應用程式動作需要向您的 Azure Container Registry 進行驗證,才能推送容器映像。 容器應用程式也需要向您的 Azure Container Registry 進行驗證,才能提取容器映像。

為了推送映像,此動作會使用 azure/login 動作中所提供的認證,自動向 acrName 中指定的容器登錄進行驗證。

為了提取映像,Azure 容器應用程式會使用受控識別 (建議) 或管理員認證,向 Azure Container Registry 進行驗證。 若要使用受控識別,此動作要部署的容器應用程式必須設定為使用受控識別。 若要使用登錄的管理員認證進行驗證,請設定動作的 acrUsernameacrPassword 輸入。

組態

您可以執行下列步驟來設定 GitHub Actions 工作流程,用於部署至 Azure 容器應用程式。

  • 為應用程式建立 GitHub 存放庫
  • 建立已啟用受控識別的容器應用程式
  • 將 Azure Container Registry 的 AcrPull 角色指派給容器應用程式的受控識別
  • 在 GitHub 存放庫中設定秘密
  • 建立 GitHub Actions 工作流程

必要條件

需求 指示
Azure 帳戶 如果您沒有帳戶,可免費建立帳戶。 您需要 Azure 訂用帳戶的「參與者」或「擁有者」權限才能繼續。 如需詳細資料,請參閱使用 Azure 入口網站指派 Azure 角色
GitHub 帳戶 免費註冊。
Azure CLI 安裝 Azure CLI

建立 GitHub 存放庫並複製原始程式碼

建立工作流程之前,您應用程式的原始程式碼必須位於 GitHub 存放庫中。

  1. 使用 Azure CLI 登入 Azure。

    az login
    
  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 Container Registry 的名稱。

  4. 取得容器登錄的完整資源識別碼。

    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
    

    請記下命令輸出中受控識別的主體識別碼。

  6. 將 Azure Container Registry 的 AcrPull 角色指派給容器應用程式的受控識別。

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

    <MANAGED_IDENTITY_PRINCIPAL_ID> 取代為受控識別的主體識別碼,以及將 <ACR_RESOURCE_ID> 取代為 Azure Container Registry 的資源識別碼。

  7. 將容器應用程式設定為使用受控識別,從 Azure Container Registry 提取映像。

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

    <ACR_NAME> 取代為您 Azure Container Registry 的名稱。

在 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 訂用帳戶的識別碼。 如果您的容器登錄位於不同資源群組中,請在 --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 Container Registry 的名稱。 確認 branches 底下的分支名稱,以及 appSourcePathcontainerAppNameresourceGroup 的值與存放庫和 Azure 資源的值一致。

  4. 認可對分支所做的變更。

GitHub Actions 工作流程執行應該會開始建置和部署容器應用程式。 若要查看進度,請瀏覽至 [動作]

若要部署應用程式的新修訂,請將新的認可推送至分支。