共用方式為


使用 GitHub Actions 部署至 Azure App Service

使用 GitHub Actions 將工作流程自動化,並從 GitHub 部署至 Azure App Service

先決條件

  • 具有有效訂用帳戶的 Azure 帳戶。 免費建立帳戶
  • GitHub 帳戶。 如果您沒有帳戶,請免費註冊。

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

GitHub 動作部署已整合至預設的建立 Web 應用程式處理序。 在 [部署] 索引標籤中將 [持續部署] 設定為 [啟用],然後設定您選擇的組織、存放庫和分支。

螢幕擷取畫面,示範如何在 [App Service 部署] 索引標籤中啟用 GitHub Actions 部署。

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

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

附註

當您建立應用程式時,您可能會收到錯誤,指出您的 Azure 帳戶沒有特定許可權。 您的帳戶可能需要必要的權限,才能建立和設定使用者指派的身分識別。 如需替代方案,請參閱下一節。

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

針對現有的應用程式,您可以使用 App Service 中的 部署中心 來快速開始使用 GitHub Actions。 此統包方法會根據您的應用程式堆疊產生 GitHub Actions 工作流程檔案,並將其提交至您的 GitHub 儲存庫。

透過使用 部署中心,您也可以使用 使用者指派的身分識別,輕鬆地配置更安全的 OpenID Connect 驗證。 如需詳細資訊,請參閱使用者指派的身分識別選項

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

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

手動設定 GitHub Actions 工作流程

您可以在不使用 部署中心的情況下部署工作流程。 執行以下三個步驟:

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

產生部署認證

建議您使用 OpenID Connect 向 Azure App Service for GitHub Actions 進行驗證。 此驗證方法使用短期權杖。 使用 GitHub Actions 設定 OpenID Connect 是更複雜的作法,但安全性更高。

您也可以使用使用者指派的受控身分識別、服務主體或發佈設定文件進行驗證。

下列程序說明使用 Azure CLI 陳述式建立 Microsoft Entra 應用程式、服務主體和同盟認證的步驟。 若要瞭解如何在 Azure 入口網站中建立 Microsoft Entra 應用程式、服務主體和同盟認證,請參閱 連線 GitHub 和 Azure

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

    az ad app create --display-name myApp
    

    此命令會傳回 JSON 輸出,其中包含 appId,即為您的 client-id。 儲存該值,以便稍後作為 AZURE_CLIENT_ID GitHub 祕密。

    當您使用 Graph API 建立同盟認證時,您會使用該 objectId 值,並將它參考為 APPLICATION-OBJECT-ID

  2. 建立服務主體。 請將 JSON 輸出中的 $appID 替換為 appId

    此命令會產生 JSON 輸出,其中包含不同的 objectId 以便在下一步中使用。 新的 objectIdassignee-object-id

    複製 appOwnerTenantId 稍後用作 AZURE_TENANT_ID 的 GitHub 秘密。

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

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

    • 以您在建立應用程式期間為 Active Directory 應用程式產生的 APPLICATION-OBJECT-ID 取代 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"
        ]
    }     
    

設定 GitHub 密碼

您必須提供應用程式的用戶端識別碼租用戶識別碼訂用帳戶識別碼Azure/login給動作。 這些值可以直接在工作流程中提供,也可以儲存於 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. 選取 [ 新增密碼 ] 以儲存每個密碼。

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

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

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

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

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

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

若要使用您設定的受控身分識別來部署 OpenID Connect,請使用 azure/login@v2 動作搭配 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:
      # Check out the repo
      - uses: actions/checkout@main
      - uses: azure/login@v2
        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 Service。 如果您使用 Azure CLI GitHub 動作,它會使用您的 Azure 認證。

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

如需如何使用和設定 Maven 外掛程式的詳細資訊,請參閱適用於 Azure App Service 的 Maven 外掛程式 Wiki

如何透過 Azure 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

如需如何使用和設定 Azure CLI 的 GitHub 動作的詳細資訊,請參閱 Azure CLI GitHub 動作

如需命令的 az webapp deploy 詳細資訊,包括如何使用它和參數詳細資料,請參閱 az webapp deploy 文件

如何部署啟動檔案?

使用 Azure CLI 的 GitHub 動作。 例如:

- 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 Deploy 動作,您可以自動化工作流程,使用 GitHub Actions 將自訂容器部署至 App Service。 如需詳細資訊,請參閱 部署至容器

如何將部署佈署至部署插槽?

您可以使用 slot-name 參數,將部署佈署至部署插槽,而非生產插槽,方法是使用 azure/webapps-deploy@v3 動作。 若要佈署至插槽,請在您的工作流程中將 slot-name 參數新增至部署步驟:

- name: Deploy to Azure Web App
  uses: azure/webapps-deploy@v3
  with:
    app-name: 'my-app-name'
    slot-name: 'staging'  # Deploy to the 'staging' slot instead of production
    package: './output'

附註

使用 OpenID Connect 或服務主體認證時,請確保該身份在應用程式和部署欄位上都具備 網站貢獻者 角色。 關於發佈設定檔認證,請從 Azure 入口網站下載該特定插槽的發佈設定檔(>部署插槽>選擇插槽>下載發佈設定檔)。

如何在部署之後更新 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 動作和工作流程上的下列參考: