共用方式為


使用 Azure Pipelines 將自訂容器部署至 App Service

Azure DevOps 可讓您使用免費工作流程來裝載、建置、規劃和測試程式碼。 使用 Azure Pipelines 作為其中一個工作流程,可讓您使用 CI/CD 來部署應用程式,而 CI/CD 可以與任何平台和雲端搭配使用。 管線會定義為您存放庫根目錄中的 YAML 檔案。

在本文中,我們使用 Azure Pipelines 將 Windows 容器應用程式從 Azure DevOps 中的 Git 存放庫部署到 App Service。 它假設您已經在 Azure DevOps 中擁有一個具有支援 Dockerfile 的 .NET 應用程式。

必要條件

新增服務連線

在建立管線之前,您應該先建立服務連線,因為在建立您的範本時系統會要求您選擇並驗證您的連線。 服務連線可讓您在使用工作範本時連線到您選擇的登錄 (ACR 或 Docker Hub)。 新增服務連線時,選擇 Docker 登錄選項。 下列表單要求您選擇 Docker Hub 或 Azure Container Registry 以及相關資訊。 若要跟隨本教學課程,請使用 Azure Container Registry。 您可以依照此處的指示建立新的服務連線。

保護您的密碼

由於我們使用您不希望其他人存取的敏感性資訊,因此我們使用變數來保護我們的資訊。 依照此處的指示建立變數。

若要新增變數,按一下您管線的編輯檢視右上角 [儲存] 按鈕旁邊的 [變數] 按鈕。 選取 [新變數] 按鈕並輸入您的資訊。 新增以下變數以及您自己的適合每個資源的密碼。

  • vmImageName: 'windows-latest'
  • imageRepository: 'your-image-repo-name'
  • dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
  • dockerRegistryServiceConnection: 'your-service-connection-number'

建立新管線

使用 .NET 應用程式和支援 Dockerfile 建立存放庫後,您可以按照以下步驟建立管線。

  1. 瀏覽至左側功能表列上的 [管線],然後按一下 [建立管線] 按鈕
  2. 在下一個畫面上,選取 [Azure Repos Git] 作為存放庫選項,然後選取程式碼所在的存放庫
  3. 在 [設定] 索引標籤下,選擇 [入門管線] 選項
  4. 在下一個 [校閱] 索引標籤下,按一下 [儲存] 按鈕

建置映像,並將其推送至 Azure Container Registry

建立並儲存管線之後,您需要編輯管線以執行建置容器、推送到登錄以及將映像部署到 App Service 的步驟。 首先,瀏覽至 [管道] 功能表,選擇您已建立的管線,然後按一下 [編輯] 按鈕。

首先,您需要新增 Docker 工作,以便建立映像。 新增下列程式碼並將 Dockerfile: app/Dockerfile 取代為 Dockerfile 的路徑。

trigger:
 - main

 pool:
   vmImage: 'windows-latest' 

 variables:
   vmImageName: 'windows-latest'
   imageRepository: 'your-image-repo-name'
   dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
   dockerRegistryServiceConnection: 'your-service-connection-number'

- stage: Build
  displayName: Build and push stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

新增 App Service 部署工作

接下來,您需要設定部署工作。 這需要您的訂閱名稱、應用程式名稱和容器登錄。 藉由貼上以下程式碼將新階段新增至 yaml 檔案。

- stage: Deploy
  displayName: Deploy to App Service
  jobs:
  - job: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    steps:

接下來,瀏覽到右上角的 [顯示助理] 索引標籤,尋找 [Azure App Service 部署] 工作並填寫以下表單:

  • 連線類型:Azure Resource Manager
  • Azure 訂閱:您的訂閱名稱
  • App Service 類型:用於容器的 Web App (Windows)
  • App Service 名稱:您的應用程式名稱
  • 登錄或命名空間:your-azure-container-registry-namespace
  • 映像:your-azure-container-registry-image-name

填入後,按一下 [新增] 按鈕新增下列工作:

- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: 'my-subscription-name'
    appType: 'webAppHyperVContainer'
    WebAppName: 'my-app-name'
    DockerNamespace: 'myregsitry.azurecr.io'
    DockerRepository: 'dotnetframework:12'

在您新增工作之後,管線就可以運作了。 按一下 [驗證並儲存] 按鈕並執行管線。 該管線將完成組建 Windows 容器映像並將其推送到 Azure Container Registry 以及將該映像部署到 App Service 的步驟。

以下是完整 yaml 檔案的範例:

trigger:
 - main

 pool:
   vmImage: 'windows-latest' 

 variables:
   vmImageName: 'windows-latest'
   imageRepository: 'your-image-repo-name'
   dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
   dockerRegistryServiceConnection: 'your-service-connection-number'

- stage: Build
  displayName: Build and push stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

- stage: Deploy
  displayName: Deploy to App Service
  jobs:
  - job: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: AzureRmWebAppDeployment@4
		  inputs:
		    ConnectionType: 'AzureRM'
		    azureSubscription: 'my-subscription-name'
		    appType: 'webAppHyperVContainer'
		    WebAppName: 'my-app-name'
		    DockerNamespace: 'myregsitry.azurecr.io'
		    DockerRepository: 'dotnetframework:12'