練習 - 建立 Azure DevOps 管線來部署雲端原生應用程式

已完成

您的經理希望您變更公司 eShop 應用程式的 CI/CD,以使用 Azure Pipelines。 您現在將建立 Azure DevOps 管線來建置和部署您的產品服務。

建立 Azure DevOps 管線

這很重要

開始之前,您必須擁有 Azure DevOps 帳戶。 如果您沒有,可以在 dev.azure.com 免費創建一個。

  1. 登入 dev.azure.com
  2. 選取 + 新增專案
  3. 針對 專案名稱,輸入 eShop 部署
  4. 可見度設定為私人,然後選取建立。
  5. 在左側,選取 [管線],然後選取 [建立管線]。
  6. [連線] 頁面上,針對 [ 您的程式碼在哪裡?],選取 [GitHub]。
  7. 如果出現提示,請登入 GitHub,並授權 Azure Pipelines 存取您的 GitHub 帳戶。
  8. 針對 [選取存放庫],選取派生的存放庫。
  9. [設定] 頁面上,選取 [部署至 Azure Kubernetes 服務 ] 選項。
  10. [部署至 Azure Kubernetes Service] 窗格中,選取您的 Azure 訂用帳戶,然後選取 [繼續]。
  11. 如果出現提示,請登入您的 Azure 訂用帳戶。
  12. 針對 [叢集],選取您在上一個單位 aks-eshop 中建立的 AKS 叢集。
  13. 針對 [命名空間],請保留 [現有] 選取狀態,然後選取 [預設]。
  14. 針對 容器登錄,選取您在上一個單元中建立的 Azure 容器登錄,例如 acseshop186748394
  15. 針對 Image name(影像名稱),輸入 productservice
  16. 對於 服務埠,輸入 8080
  17. 選取驗證與設定

檢閱管線 YAML 檔案

Azure Pipelines 會使用 YAML 檔案來定義建置和部署應用程式的步驟。 YAML 檔案儲存在您的 GitHub 存放庫中,並根據您提供的資訊自動為您建立。

讓我們回顧一下 YAML 檔案:

trigger:
- main

resources:
- repo: self

variables:

  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: '3bcbb23c-6fca-4ff0-8719-bfbdb64a89b1'
  imageRepository: 'productservice'
  containerRegistry: 'acseshop186748394.azurecr.io'
  dockerfilePath: '**/Dockerfile'
  tag: '$(Build.BuildId)'
  imagePullSecret: 'acseshop18674839414442d34-auth'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'


stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: Build
    displayName: Build
    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)

    - upload: manifests
      artifact: manifests

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build

  jobs:
  - deployment: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    environment: 'PhilStollerymod9cloudnativeexercisecode-1959.default'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              manifests: |
                $(Pipeline.Workspace)/manifests/deployment.yml
                $(Pipeline.Workspace)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

觸發程式資源區段會定義管線何時應執行。 在此案例中,當變更認可到您存放庫的主分支時,管線將會執行。

變數區段定義管線中使用的變數。 變數可用來定義要使用的 Azure 容器登錄和 Dockerfile。

然後,YAML 會定義使用 ubuntu-latest 代理程式的建置作業。 作業會使用 Docker 工作來建置映像,並將其推送至 Azure Container Registry。

最後一個階段是將更新的產品服務 部署 至 AKS。 作業會使用 KubernetesManifest 工作將映像部署至 Azure Kubernetes 服務 (AKS)。

執行管線

檢閱您的管線 YAML 頁面的右上角,選擇儲存並執行。 在 [儲存並執行] 窗格中:

  1. 選擇 為此提交建立新分支
  2. 將所有其他選項設定為預設值。
  3. 選取儲存並執行

監視管線並針對其進行疑難排解

Azure Pipelines 會從 Azure DevOps 入口網站監視和管理。 讓我們看看執行您所建立管線之後的輸出。

顯示 Azure Pipeline 狀態的螢幕擷取畫面。

總覽頁面會顯示運行中管線的所有階段。 您可以選取階段以更詳細地檢視步驟。 稍後,您會看到管道失敗。 選取 [建置] 階段。

失敗管線中建置階段的螢幕擷取畫面。

在組建階段,您可以看到組建失敗。 選取 [建置並將映像推送至 Azure Container Registry ] 步驟。 記錄檔中的錯誤顯示:

##[error]Unhandled: No Dockerfile matching  /home/vsts/work/1/s/**/Dockerfile  was found.

修正錯誤

在 DevOps 中,返回管線摘要頁面。 您將編輯建立的管線以修正錯誤。

  1. 在右上角,選取 [更多動作 ] 功能表,然後選取 [編輯管線]。

  2. YAML 檔案的第 17 行會定義要使用的 Dockerfile,而根據預設,管線預期存放庫根目錄中會有名為 Dockerfile 的檔案。

    eShop 會針對名為 DockerfileProducts 的產品服務使用不同的 docker 檔案。 將第 17 行編輯為:

      dockerfilePath: '**/DockerfileProducts.acr'
    
  3. 選取 [儲存]。

  4. [儲存] 窗格中,選取 [儲存]。

  5. 選取 執行,然後在 執行管線 窗格中,選取 執行

    觀看 [組建階段] 完成。 部署階段會暫停,直到您選取它並允許其執行為止。

    顯示已完成管線的螢幕擷取畫面。

    流水線已經成功完成。 選取 部署 階段以檢視步驟。

    顯示部署階段和成功完成步驟的螢幕擷取畫面。