分享方式:


使用 GitHub Actions 部署至 App Service

配合 GitHub Actions 開始將工作流程自動化,並從 GitHub 部署至 Azure App Service

必要條件

建立應用程式時設定 GitHub Actions 部署

GitHub Actions 部署會整合到預設應用程式建立精靈中。 您只需要在 [部署] 索引標籤中將 [持續部署] 設為 [啟用],然後設定您想要的組織、存放庫和分支。

顯示如何在 App Service 建立精靈中啟用 GitHub Actions 部署的螢幕快照。

當您啟用持續部署時,應用程式建立精靈會根據基本驗證選取項目自動挑選驗證方法,並據以設定應用程式和 GitHub 存放庫:

基本驗證選取項目 驗證方法
停用 使用者指派的身分識別 (OpenID Connect) (建議)
啟用 基本驗證

注意

如果您在建立應用程式時收到錯誤,指出 Azure 帳戶沒有特定權限,則可能是沒有建立及設定使用者指派身分識別的必要權限。 如需替代方案,請參閱透過部署中心設定 GitHub Actions 部署

透過部署中心設定 GitHub Actions 部署

若是現有的應用程式,您可以使用 App Service 部署中心,迅速地開始使用 GitHub Actions。 這個周全的方法會根據應用程式堆疊,自動產生 GitHub Actions 工作流程檔案,並在 GitHub 存放庫進行認可。

部署中心也可讓您使用使用者指派的身分識別選項,輕鬆設定更安全的 OpenID Connect 驗證。

如果 Azure 帳戶具有所需的權限,您可以選取以建立使用者指派的身分識別。 否則,您可以在 [身分識別] 下拉式清單中選取現有使用者指派的受控識別。 您可以與 Azure 管理員合作,使用網站參與者角色建立使用者指派的受控識別。

如需詳細資訊,請參閱持續部署至 Azure App Service

手動設定 GitHub Actions 工作流程

您也可以不使用部署中心以部署工作流程。 在此情況下,您需要執行 3 個步驟:

  1. 產生部署認證
  2. 設定 GitHub 祕密
  3. 將工作流程檔案新增至 GitHub 存放庫

1.產生部署認證

使用 GitHub Actions Azure App 服務 進行驗證的建議方式是使用 OpenID Connect。 這是使用短期令牌的驗證方法。 使用 GitHub Actions 設定 OpenID Connect 是更複雜的作法,但安全性更高。

或者,您可以使用使用者指派的受控識別、服務主體或發行配置文件進行驗證。

下列程式代碼會執行使用 Azure CLI 語句建立 Active Directory 應用程式、服務主體和同盟認證的步驟。 若要了解如何在 Azure 入口網站中建立 Active Directory 應用程式、服務主體與同盟認證,請參閱連線 GitHub 與 Azure

  1. 若您沒有現有的應用程式,請註冊可存取資源的新 Active Directory 應用程式與服務主體。 建立 Active Directory 應用程式。

    az ad app create --display-name myApp
    

    此命令會使用 appId 作為 client-id 來輸出 JSON。 儲存值以稍後作為 AZURE_CLIENT_ID GitHub 秘密。

    使用圖形 API 建立同盟認證時,您將使用此 objectId 值,並將其作為 APPLICATION-OBJECT-ID 參考。

  2. 建立服務主體。 將 $appID 取代為您 JSON 輸出中的 appId。

    此命令會產生具有不同 objectId 的 JSON 輸出,並將在下一個步驟中使用。 新的 objectIdassignee-object-id

    複製 appOwnerTenantId 以供稍後作為 AZURE_TENANT_ID 的 GitHub 秘密使用。

     az ad sp create --id $appId
    
  3. 依訂用帳戶和物件建立新的角色指派。 根據預設,角色指派將會繫結至預設訂用帳戶。 $subscriptionId取代為訂用帳戶識別碼、$resourceGroupName資源群組名稱、 $webappName Web 應用程式名稱,以及$assigneeObjectId產生的 id。 瞭解如何使用 Azure CLI 來管理 Azure 訂用帳戶

    az role assignment create --role contributor --subscription $subscriptionId --assignee-object-id  $assigneeObjectId --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Web/sites/$webappName --assignee-principal-type ServicePrincipal
    
  4. 執行下列命令,為您的 Active Directory 應用程式建立新的同盟身分識別認證

    • 將取代APPLICATION-OBJECT-IDActive Directory 應用程式的 appId(在建立應用程式時產生)。
    • CREDENTIAL-NAME 的值設定為稍後參考。
    • 設定 subject。 依據工作流程,GitHub 會定義此值:
      • 您 GitHub Actions 環境中的工作:repo:< Organization/Repository >:environment:< Name >
      • 針對未繫結至環境的作業,請根據用來觸發工作流程的參考路徑,包含分支/標記的參考路徑:repo:< Organization/Repository >:ref:< ref path>。 例如,repo:n-username/ node_express:ref:refs/heads/my-branchrepo:n-username/ node_express:ref:refs/tags/my-tag
      • 針對由提取要求事件所觸發的工作流程:repo:< Organization/Repository >:pull_request
    az ad app federated-credential create --id <APPLICATION-OBJECT-ID> --parameters credential.json
    ("credential.json" contains the following content)
    {
        "name": "<CREDENTIAL-NAME>",
        "issuer": "https://token.actions.githubusercontent.com",
        "subject": "repo:organization/repository:ref:refs/heads/main",
        "description": "Testing",
        "audiences": [
            "api://AzureADTokenExchange"
        ]
    }     
    

2.設定 GitHub 密碼

您必須將應用程式的用戶端識別碼租用戶識別碼訂用帳戶識別碼提供給 Azure/登入動作。 這些值可以直接在工作流程中提供,也可以儲存在 GitHub 的秘密中,並在您的工作流程中參考。 將值儲存為 GitHub 秘密是較安全的選擇。

  1. 開啟您的 GitHub 存放庫,然後前往設定>安全性>秘密與變數>動作>新存放庫密碼

  2. 建立 AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_SUBSCRIPTION_ID 的秘密。 使用 Active Directory 應用程式中的這些值來取得 GitHub 秘密:

    GitHub 祕密 Active Directory 應用程式
    AZURE_CLIENT_ID 應用程式 (用戶端) 識別碼
    AZURE_TENANT_ID 目錄 (租用戶) 識別碼
    AZURE_SUBSCRIPTION_ID 訂用帳戶識別碼
  3. 選取 [新增秘密] 以儲存每個秘密。

3.將工作流程檔案新增至 GitHub 存放庫

工作流程是由 GitHub 存放庫內 /.github/workflows/ 路徑中的 YAML (. yml) 檔案所定義。 此定義包含組成工作流程的各種步驟與參數。

工作流程檔案至少會有下列不同的步驟:

  1. 使用您建立的 GitHub 祕密透過 App Service 進行驗證。
  2. 建置 Web 應用程式。
  3. 部署 Web 應用程式。

若要將程式碼部署至 App Service 應用程式,您可以使用 azure/webapps-deploy@v3 動作。 此動作需要 app-name 中的 Web 應用程式名稱,而且根據語言堆疊,在 package 中輸入要部署的 *.zip、*.war、*.jar 或資料夾路徑。 如需 azure/webapps-deploy@v3 動作可能輸入的完整清單,請參閱 action.yml 定義。

下列範例顯示工作流程的一部分,這部分會以不同支援的語言建置 Web 應用程式。

若要使用您設定的受控識別來部署 OpenID Connect,請使用 azure/login@v1 動作搭配 client-idtenant-idsubscription-id 金鑰,並參考您稍早所建立的 GitHub 祕密。

name: .NET Core

on: [push]

permissions:
      id-token: write
      contents: read

env:
  AZURE_WEBAPP_NAME: my-app    # set this to your application's name
  AZURE_WEBAPP_PACKAGE_PATH: '.'      # set this to the path to your web app project, defaults to the repository root
  DOTNET_VERSION: '6.0.x'           # set this to the dot net version to use

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      # Checkout the repo
      - uses: actions/checkout@main
      - uses: azure/login@v1
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

      
      # Setup .NET Core SDK
      - name: Setup .NET Core
        uses: actions/setup-dotnet@v3
        with:
          dotnet-version: ${{ env.DOTNET_VERSION }} 
      
      # Run dotnet build and publish
      - name: dotnet build and publish
        run: |
          dotnet restore
          dotnet build --configuration Release
          dotnet publish -c Release --property:PublishDir='${{ env.AZURE_WEBAPP_PACKAGE_PATH }}/myapp' 
          
      # Deploy to Azure Web apps
      - name: 'Run Azure webapp deploy action using publish profile credentials'
        uses: azure/webapps-deploy@v3
        with: 
          app-name: ${{ env.AZURE_WEBAPP_NAME }} # Replace with your app name
          package: '${{ env.AZURE_WEBAPP_PACKAGE_PATH }}/myapp'
      
      - name: logout
        run: |
          az logout

常見問題集

如何? 透過 Maven 外掛程式部署 WAR 檔案嗎?

如果您以 Maven 外掛程式設定 Java Tomcat 專案,您也可以透過此外掛程式部署至 Azure App 服務。 如果您使用 Azure CLI GitHub 動作 ,它會使用您的 Azure 登入認證。

    - name: Azure CLI script file
      uses: azure/cli@v2
      with:
        inlineScript: |
          mvn package azure-webapp:deploy

如需 Maven 外掛程式以及如何使用及設定的詳細資訊,請參閱適用於 Azure App 服務Maven 外掛程式 Wiki。

如何? 透過 Az CLI 部署 WAR 檔案嗎?

如果您使用偏好使用 Azure CLI 來部署至 App Service,您可以使用適用於 Azure CLI 的 GitHub Action。

- name: Azure CLI script
  uses: azure/cli@v2
  with:
    inlineScript: |
      az webapp deploy --src-path '${{ github.workspace }}/target/yourpackage.war' --name ${{ env.AZURE_WEBAPP_NAME }} --resource-group ${{ env.RESOURCE_GROUP }}  --async true --type war

如需 CLI 的 GitHub Action 以及如何使用和設定的詳細資訊,請參閱 Azure CLI GitHub 動作。 如需 az webapp deploy 命令的詳細資訊,請參閱 az webapp deploy 檔中的如何使用 和 參數詳細數據

如何? 部署啟動檔案?

使用適用於 CLI 的 GitHub Action。 例如:

- name: Deploy startup script
  uses: azure/cli@v2
  with:
    inlineScript: |
      az webapp deploy --src-path ${{ github.workspace }}/src/main/azure/createPasswordlessDataSource.sh --name ${{ env.AZURE_WEBAPP_NAME }} --resource-group ${{ env.RESOURCE_GROUP }} --type startup --track-status false

如何? 部署至容器?

搭配 Azure Web 部署動作,您可以使用 GitHub Actions 將工作流程自動化,以將自訂容器部署至 App Service。 如需使用 GitHub Actions 部署步驟的詳細資訊,請參閱 部署至容器

如何? 部署後更新 Tomcat 組態?

如果您想要在部署後更新任何 Web 應用程式設定,您可以使用 App Service 設定 動作。

    - uses: azure/appservice-settings@v1
      with:
        app-name: 'my-app'
        slot-name: 'staging'  # Optional and needed only if the settings have to be configured on the specific deployment slot
        app-settings-json: '[{ "name": "CATALINA_OPTS", "value": "-Dfoo=bar" }]' 
        connection-strings-json: '${{ secrets.CONNECTION_STRINGS }}'
        general-settings-json: '{"alwaysOn": "false", "webSocketsEnabled": "true"}' #'General configuration settings as Key Value pairs'
      id: settings

如需此動作及如何使用和設定的詳細資訊,請參閱 App Service 設定 存放庫。

下一步

查看 Azure GitHub Actions 和工作流程的參考: