共用方式為


使用 Azure Pipelines 來部署至 Azure App Service

Azure DevOps Services | Azure DevOps Server 2022

本文說明如何使用 Azure Pipelines (部分機器翻譯) 自動建置和測試 Web 應用程式,並將其部署至 Azure App Service。 您可以設定持續整合與持續傳遞 (CI/CD) 管線,讓其在每次您將程式碼變更簽入至存放庫的指定分支時執行。

管線由「階段」、「作業」和「步驟」組成。 步驟是管線的最小建置組塊,可以是「指令碼」,也可以是「工作」(即預先封裝的指令碼)。 如需組成管線之重要概念和元件的詳細資訊,請參閱重要的 Azure Pipelines 概念 (部分機器翻譯)。

您可以使用管線中的 Azure Web 應用程式 (部分機器翻譯) 工作來部署至 App Service。 針對更複雜的案例 (例如在部署中使用 XML 參數),您可以使用 Azure App Service 部署 (部分機器翻譯) 工作。

先決條件

這很重要

在 GitHub 程序進行期間,系統可能會提示您建立 GitHub 服務連線 (部分機器翻譯),或將您重新導向至 GitHub 以登入、安裝 Azure Pipelines (英文) GitHub 應用程式、授權 Azure Pipelines,或向 GitHub 組織進行驗證。 請依照螢幕上的指示完成必要流程。 如需詳細資訊,請參閱 存取 GitHub 存放庫

建立管線

本節中的程式碼範例適用於 ASP.NET Core Web 應用程式。 您可以調整說明以用於其他架構。 如需 Azure Pipelines 生態系統支援的詳細資訊,請參閱 Azure Pipelines 生態系統範例 (部分機器翻譯)。

在程式碼存放庫中建立「azure-pipelines.yml」YAML 檔案來定義管線。

  1. 在 Azure DevOps 專案的左側導覽功能表上,選取 [管線]
  2. 在 [管線] 頁面上,選取 [新增管線],如果此管線是專案中的第一個管線,則選取 [建立管線]
  3. 在 [您的程式碼在何處?] 畫面上,選取原始程式碼的位置,即 Azure Repos GitGitHub。 如有必要,請登入 GitHub。
  4. 在 [選取存放庫] 畫面上,選取您的程式碼存放庫。
  5. 在 [設定您的管線] 畫面上,選取 [入門管線]。

.NET Core (DotNetCoreCLI@2) (部分機器翻譯) 工作新增至管線,然後建置和發佈您的應用程式。

  1. 在 [檢閱管線 YAML] 畫面上,刪除 steps: 這行後面的所有程式碼。
  2. 選取檔案的結尾,然後選取右側的 [顯示小幫手]
  3. 在 [工作] 底下,選取 [.NET Core]
  4. 在 [.NET Core] 設定畫面的 [Azure Resource Manager 連線] 底下,選取您的 Azure 訂用帳戶,然後選取 [授權] 以建立所需的服務連線。
  5. 在 [命令] 底下,選取 [發佈]
  6. 確定已選取 [發佈 Web 專案] 和 [壓縮發佈的專案] 核取方塊,然後選取 [新增]
  7. 此工作便會出現在您的 YAML 管線中。 檢閱 YAML 程式碼以查看其作用。 當您準備好時,選取 [儲存並執行],然後再次選取 [儲存並執行]
  8. 在組建 [摘要] 畫面的 [作業] 底下,選取 [需要權限] 連結。 在 [檢查] 畫面上,選取 [允許],然後再次選取 [允許]。 在此處授與權限,將會允許此管線的所有執行都可以使用您所授權的服務連線。

管線會將部署的 ZIP 檔案發佈為 Azure 成品,供部署工作在下一個步驟中使用。

新增部署工作

管線成功執行之後,請新增部署工作。

  1. 在管線執行 [摘要] 畫面上,選取右上角的 [更多動作] 圖示,然後選取 [編輯管線]
  2. 選取 YAML 檔案的結尾,如果未顯示 [工作] 清單,請選取 [顯示小幫手]
  3. 在 [工作] 清單中,搜尋並選取 [Azure Web 應用程式] 工作。 或者,您也可以使用 Azure App Service 部署工作。
  4. 在 [Azure Web 應用程式] 設定畫面的 [Azure 訂用帳戶] 底下,選取您為上一個步驟設定的相同服務連線。 您不需要重新授權此連線。
  5. 針對 [應用程式類型],根據您的程式碼選取 [Linux 上的 Azure Web 應用程式] 或 [Windows 上的 Azure Web 應用程式]
  6. 針對 [應用程式名稱],選取或輸入您的 App Service 應用程式名稱。
  7. 選取 ,然後新增
  8. 選取 [驗證並儲存],然後選取 [儲存]
  9. 選取 [執行],然後再次選取 [執行]

完整的 YAML 管線應如下列程式碼所示:

trigger:
- <branch-specification>

pool:
  vmImage: <agent-specification>

steps:
- task: DotNetCoreCLI@2
  inputs:
    azureSubscription: '<your-authorized-service-connection>'
    command: 'publish'
    publishWebProjects: true

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<your-authorized-service-connection>'
    appType: 'webApp'
    appName: '<your-app-name>'
    package: '$(System.DefaultWorkingDirectory)/**/*.zip'
    deploymentMethod: 'auto'  
  • azureSubscription:Azure 訂用帳戶的授權服務連線名稱。
  • appName:現有應用程式的名稱。
  • package:包含 App Service 內容之套件或資料夾的檔案路徑。 支援萬用字元。

範例

下列各節會討論如何建立不同種類的建置和發行管線。

部署至虛擬應用程式

Azure Web 應用程式 (部分機器翻譯) 工作會部署至 Azure Web 應用程式中的根應用程式。 您可以使用 Azure App Service 部署 (部分機器翻譯) 工作的 VirtualApplication 屬性,來部署至特定的虛擬應用程式。

- task: AzureRmWebAppDeployment@5
  inputs:
    VirtualApplication: '<name of virtual application>'

VirtualApplication 是在 Azure 入口網站中設定的虛擬應用程式名稱。 如需詳細資料,請參閱在 Azure 入口網站中設定 App Service 應用程式 (部分機器翻譯)。

部署到位置

下列範例示範如何部署至預備位置,然後交換成生產位置:

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: webAppLinux
    appName: '<app-name>'
    deployToSlotOrASE: true
    resourceGroupName: '<name of resource group>'
    slotName: staging
    package: '$(Build.ArtifactStagingDirectory)/**/*.zip'

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: '<service-connection-name>'
    WebAppName: '<app-name>'
    ResourceGroupName: '<name of resource group>'
    SourceSlot: staging
    SwapWithProduction: true
  • azureSubscription:您的 Azure 服務連線。
  • appType:選用的應用程式類型 (例如 webAppLinux),用來部署至 Linux 上的 Web 應用程式。
  • appName:您現有應用程式的名稱。
  • deployToSlotOrASE:布林值。 是否要部署至現有的部署位置或 App Service 環境。
  • resourceGroupName:要作為部署目的地的資源群組名稱,如果 deployToSlotOrASE 為 true,則此為必要項目。
  • slotName:要作為部署目的地的位置名稱,如果 deployToSlotOrASE 為 true,則此為必要項目。 預設為 production
  • package:包含應用程式內容之套件或資料夾的檔案路徑。 支援萬用字元。
  • SourceSlot:當 SwapWithProduction 為 true 時,傳送至生產環境的位置。
  • SwapWithProduction:布林值。 是否要將來源位置的流量與生產環境交換。

部署至多個 Web 應用程式

您可以使用 YAML 檔案中的作業來設定部署管線。 您可以使用作業來控制部署至多個 Web 應用程式的順序。

jobs:
- job: buildandtest
  pool:
    vmImage: ubuntu-latest
 
  steps:
  # publish an artifact called drop
  - task: PublishPipelineArtifact@1
    inputs:
      targetPath: '$(Build.ArtifactStagingDirectory)' 
      artifactName: drop
  
  # deploy to Azure Web App staging
  - task: AzureWebApp@1
    inputs:
      azureSubscription: '<service-connection-name>'
      appType: <app type>
      appName: '<staging-app-name>'
      deployToSlotOrASE: true
      resourceGroupName: <group-name>
      slotName: 'staging'
      package: '$(Build.ArtifactStagingDirectory)/**/*.zip'

- job: deploy
  dependsOn: buildandtest
  condition: succeeded()

  pool: 
    vmImage: ubuntu-latest
  
  steps:
    # download the artifact drop from the previous job
  - task: DownloadPipelineArtifact@2
    inputs:
      source: 'current'
      artifact: 'drop'
      path: '$(Pipeline.Workspace)'

  - task: AzureWebApp@1
    inputs:
      azureSubscription: '<service-connection-name>'
      appType: <app type>
      appName: '<production-app-name>'
      resourceGroupName: <group-name>
      package: '$(Pipeline.Workspace)/**/*.zip'

條件式部署

若要在 YAML 中進行條件式部署,請使用下列其中一種技術:

  • 將條件新增至步驟。
  • 將部署步驟隔離至個別的作業,並將條件新增至該作業。

下列範例示範如何使用步驟條件,只部署源自主要分支的成功組建:

- task: AzureWebApp@1
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  inputs:
    azureSubscription: '<service-connection-name>'
    appName: '<app-name>'

如需條件的詳細資訊,請參閱指定條件 (部分機器翻譯)。

使用 Web Deploy 進行部署

Azure App Service 部署 (部分機器翻譯) 工作可以使用 Web Deploy 來部署至 App Service。

trigger:
- main

pool:
  vmImage: windows-latest

variables:
  buildConfiguration: 'Release'

steps:
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
    arguments: '--configuration $(buildConfiguration)'
    zipAfterPublish: true

- task: AzureRmWebAppDeployment@5
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: '<service-connection-name>'
    appType: 'webApp'
    WebAppName: '<app-name>'
    packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'
    enableCustomDeployment: true
    DeploymentType: 'webDeploy'

常見問題集

AzureWebApp 和 AzureRmWebAppDeployment 工作之間有何差異?

Azure Web 應用程式 (部分機器翻譯) 工作是部署至 Azure Web 應用程式最簡單的方式。 根據預設,您會在 Azure Web 應用程式中部署根應用程式。

Azure App Service 部署 (部分機器翻譯) 工作可以處理更多自訂案例,例如:

  • 如果您通常使用 Internet Information Services (IIS) 部署程式,請使用 Web Deploy 進行部署。
  • 部署至虛擬應用程式
  • 部署到其他應用程式類型,例如容器應用程式、函式應用程式、WebJobs 或 API 和行動應用程式。

附註

個別的檔案轉換 (部分機器翻譯) 工作也支援檔案轉換和變數取代,可在 Azure Pipelines 中使用。 您可以使用 檔案轉換 工作,在任何組態和參數檔案上套用檔案轉換和變數替代。

為何會收到「提供的 App Service 套件或資料夾路徑無效」訊息?

在 YAML 管線中,所建置 Web 套件的儲存位置與部署工作尋找該套件的位置可能會不相符。 預設的 AzureWebApp 工作會從 $(System.DefaultWorkingDirectory)/**/*.zip 挑選要部署的 Web 套件。 如果 Web 套件存放在其他地方,請修改 package 參數的值。

為什麼我會收到「只有在使用 Windows 代理程式時才支援使用 Web Deploy 選項發佈」這個訊息?

當您將工作設定為使用 Web Deploy 進行部署,但代理程式未執行 Windows 時,AzureRmWebAppDeployment 工作中就會發生此錯誤。 請驗證您的 YAML vmImage 參數指定的是 Windows。

pool:
  vmImage: windows-latest

為什麼當我停用基本身份驗證時,Web Deploy 無法運作?

如需讓 Microsoft Entra ID 驗證與 Azure App Service 部署 (部分機器翻譯) 工作搭配運作的疑難排解資訊,請參閱我無法從 Windows 代理程式使用 Microsoft Entra ID 驗證透過 Web Deploy 部署至 Azure App Service (部分機器翻譯)。