使用 Azure Pipelines 和 Google Kubernetes Engine 建立持續整合/持續推送軟體更新管道

在本教學課程中,您將瞭解如何使用 Azure Pipelines (之前稱為 Visual Studio Team Services)、Google Kubernetes Engine (GKE) 及 Container Registry,建立持續整合/持續部署 (CI/CD) 管道。本教學課程使用以 ASP.NET Core 為基礎的 ASP.NET MusicStore 網路應用程式。

CI/CD 管道使用兩個不同的 GKE 叢集,一個用於測試環境,另一個用於實際工作環境。在管道的一開始,開發人員會將變更推送至範例程式碼基底。這個動作會觸發管道建立版本,並將版本部署至開發叢集。接著,版本管理員可以升級版本,再將版本部署至實際工作環境叢集中。 下圖說明本程序。

顯示開發人員及使用者如何與應用程式互動的 CI/CD 管道概念圖

本教學課程假設您具備 .NET Core、Azure Pipelines 及 GKE 的基本知識。如要進行本教學課程,您也必須具備 Azure DevOps 帳戶的管理權限,以及連結至您的 Azure DevOps 帳戶的 Visual Studio 2017。

目標

  • 將 Container Registry 連結至 Azure Pipelines 以發佈 Docker 映像檔。
  • 準備一個 .NET Core 範例應用程式 以部署至 GKE。
  • 安全地驗證 GKE,無須使用舊版驗證。
  • 使用 Azure Pipelines 版本管理來自動化調度管理 GKE 部署。

費用

本教學課程使用的 Google Cloud Platform 收費元件包括:

使用 Pricing Calculator 根據您預測的使用量來產生預估費用。如要瞭解使用 Azure DevOps 可能需要支付的任何費用,請參閱 Azure DevOps 定價頁面

事前準備

我們通常建議使用不同的專案來處理開發環境工作負載與實際工作環境工作負載,這樣就能分別授予身分與存取權管理 (IAM) 角色與權限。為了簡化操作,本教學課程在一個專案上同時使用兩個 GKE 叢集,其中一個用於開發環境,另一個用於實際工作環境。

  1. 選取或建立 Google Cloud Platform 專案。

    前往「Manage resources」(管理資源) 頁面

  2. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

  3. 確認您有 Azure DevOps 帳戶,並具有系統管理員權限。如果您還沒有 Azure DevOps 帳戶,可以在 Azure DevOps 首頁進行註冊。
  4. 確認您已安裝 Visual Studio 2017 並將它連結至您的 Azure DevOps 帳戶。

建立 Azure DevOps 專案

您可使用 Azure DevOps 來管理原始碼、執行建構與測試,以及 自動化調度管理 GKE 部署作業。一開始,請在您的 Azure DevOps 帳戶中建立新專案。

  1. 前往 Azure DevOps 首頁 (https://dev.azure.com/[YOUR_AZURE_DEVOPS_ACCOUNT_NAME])。
  2. 按一下 [Create Project]
  3. 輸入專案名稱,例如 Music Store
  4. 將「Visibility」設為「Private」,然後按一下 [Create project]
  5. 建立專案之後,請在左側的選單中按一下 [Repos]
  6. 按一下 [Import] 以從 GitHub 建立 Music Store 存放區的分支。設定以下這些值:

    • 來源類型Git
    • 複製網址https://github.com/aspnet/MusicStore.git
    • 保留「Requires authorization」核取方塊的未選取狀態。

    「Import a Git repository」對話方塊的螢幕擷取畫面

  7. 按一下 [Import]

    匯入程序完成後,您會看到 MusicStore 應用程式的原始碼。

持續建構

您現在可以使用 Azure Pipelines 設定持續整合。Azure Pipelines 會為每個推送至 Git 存放區的修訂版本建構程式碼,並將成果封裝至 Docker 容器中,接著將容器發佈至 Container Registry。

建立測試分支

為了確保本教學課程中的操作說明能夠正常運作,請以原始碼的特定版本為基礎,建立一個程式碼分支版本。(這能確保日後當 GitHub 上的程式碼有所變更時,本教學課程仍可繼續運作。)

  1. 在 Azure DevOps 選單中,選取 [Repos] > [Tags]
  2. 在標記清單中,展開「rel」,然後以滑鼠右鍵按一下「2.0.0」旁的圖示。
  3. 選取 [New branch]
  4. 在分支名稱輸入 testing,然後按一下 [Create branch] 以確認選取。

    Azure Pipelines 中的「Create a branch」對話方塊螢幕擷取畫面

根據預設,Azure Pipelines 會預期使用您位於 master 分支中的程式碼。您必須變更預設分支,才能使用 testing 分支。

  1. 在 Azure DevOps 選單中,選取 [Project settings]
  2. 選取 [Repos] > [Repositories]
  3. 在存放區清單中,選取您之前匯入的 Git 存放區。此存放區的名稱應該會與您的 Azure DevOps 專案相同。
  4. 按一下「Branches」旁的箭號,展開分支清單。
  5. 選取 [testing] 分支。

    [...] 按鈕會出現在分支的名稱旁。

  6. 按一下 [...],然後選取 [Set as default branch]

建構程式碼

建立分支之後,您可以開始自動建構。由於 MusicStore 屬於 ASP.NET Core 應用程式,因此建構此應用程式包含下列四個步驟:

  • 下載及安裝依附元件。
  • 編譯程式碼。
  • 執行單元測試。
  • 發佈建構成果。

稍後您將新增額外的步驟以部署至 GKE。由於 GKE 是以 Linux 為基礎的環境,您將設定在以 Linux 為基礎的建構代理程式上執行的整個建構程序。

在 Visual Studio 中簽出專案

您必須先簽出程式碼,才能建立定義建構管道的 YAML 檔案。

  1. 在 Visual Studio 中,開啟「Team Explorer」。
  2. 在選單中,按一下 [Manage Connections] 圖示。
  3. 選取 [Manage Connections] (管理連線) > [Connect to a Project] (連線到專案)

    Visual Studio「Team Explorer」窗格中「Connect to a Project」(連線到專案) 選項的螢幕擷取畫面

  4. 在下一個對話方塊中,選取 [Music Store] Git 存放區,然後按一下 [Clone] (複製)

    Visual Studio「Connect to a Project」(連線到專案) 對話方塊中,已選取「Music Store」Git 存放區的螢幕擷取畫面

建立定義建構管道的 YAML 檔案

簽出程式碼之後,您即可設定建構管道。

  1. 在 Visual Studio 中,開啟「Solution Explorer」(方案總管)。
  2. 在解決方案的根目錄中,建立名為 azure-pipelines.yml 的新檔案。
  3. 將下列程式碼複製並貼到檔案中:

    resources:
    - repo: self
      fetchDepth: 1
    queue:
      name: Hosted Ubuntu 1604
    trigger:
    - testing
    variables:
      TargetFramework: 'netcoreapp2.0'
      RestoreBuildProjects: 'samples/**/*.csproj'
      TestProjects: 'test/MusicStore.Test/*.csproj'
      BuildConfiguration: 'Release'
      DockerImageName: '[PROJECT-ID]/musicstore'
    steps:
    - task: DotNetCoreCLI@2
      displayName: Restore
      inputs:
        command: restore
        projects: '$(RestoreBuildProjects)'
        feedsToUse: config
        nugetConfigPath: NuGet.config
    - task: DotNetCoreCLI@2
      displayName: Build
      inputs:
        projects: '$(RestoreBuildProjects)'
        arguments: '--configuration $(BuildConfiguration) --framework=$(TargetFramework)'
    - task: DotNetCoreCLI@2
      displayName: Test
      inputs:
        command: test
        projects: '$(TestProjects)'
        arguments: '--configuration $(BuildConfiguration) --framework=$(TargetFramework)'
    - task: DotNetCoreCLI@2
      displayName: Publish
      inputs:
        command: publish
        publishWebProjects: True
        arguments: '--configuration $(BuildConfiguration) --framework=$(TargetFramework)'
        zipAfterPublish: false
        modifyOutputPath: false
    
  4. variables 區段中,將 [PROJECT_ID] 換成 GCP 專案的名稱,然後儲存檔案。

  5. 開啟 Team Explorer,然後按一下左上角的 [Home] (首頁) 圖示,以切換至「Home」(首頁) 視圖。

  6. 按一下 [Changes] (變更)

  7. 輸入修訂訊息,例如 Add build definition

  8. 按一下 [Commit All and Push] (全部認可並推送)

  9. 在 Azure DevOps 選單中,選取 [Pipelines] > [Build]

    您會發現系統已根據您提交至 Git 存放區的 YAML 檔案建立建構定義。

發佈 Docker 映像檔

如要將 MusicStore 應用程式部署至 GKE,您必須先將應用程式封裝為 Docker 容器,並發佈至 Container Registry。您現在將延伸建構定義以自動執行這些步驟。

設定服務帳戶以發佈映像檔

在連結至 Container Registry 之前,要先確定 Azure Pipelines 可以透過 GCP 進行驗證。請在 GCP 中建立專門用於驗證的服務帳戶。

  1. 在 GCP 主控台中,切換至您的專案,然後開啟 Cloud Shell。

    開啟 Cloud Shell

  2. 為了節省輸入專案 ID 和 Compute Engine 區域選項的時間,請執行下列指令,以設定預設的設定值:

    gcloud config set project [PROJECT_NAME]
    gcloud config set compute/zone [ZONE]

    [PROJECT_NAME] 換成您的 GCP 專案名稱,並將 [ZONE] 換成您將用於建立資源的區域名稱。如果您不確定要選哪個區域,請使用 us-central1-a

    範例:

    gcloud config set project azure-pipelines-test-project-12345
    gcloud config set compute/zone us-central1-a
  3. 為您的專案啟用 Container Registry API:

    gcloud services enable containerregistry.googleapis.com
  4. 為 Azure Pipelines 建立服務帳戶,以發佈 Docker 映像檔:

    gcloud iam service-accounts create azure-pipelines-publisher --display-name "Azure Pipelines Publisher"
  5. 將 Storage 管理員身分與存取權管理角色指派給服務帳戶:

    PROJECT_NUMBER=$(gcloud projects describe \
        $(gcloud config get-value core/project) \
        --format='value(projectNumber)')
    
    AZURE_PIPELINES_PUBLISHER=$(gcloud iam service-accounts list \
        --filter="displayName:Azure Pipelines Publisher" \
        --format='value(email)')
    
    gcloud projects add-iam-policy-binding \
        $(gcloud config get-value core/project) \
        --member serviceAccount:$AZURE_PIPELINES_PUBLISHER \
        --role roles/storage.admin
    
  6. 產生服務帳戶金鑰:

    gcloud iam service-accounts keys create \
        azure-pipelines-publisher.json --iam-account $AZURE_PIPELINES_PUBLISHER
    
    tr -d '\n' < azure-pipelines-publisher.json > azure-pipelines-publisher-oneline.json
  7. 按一下 Cloud Shell 右上角的按鈕,以啟動程式碼編輯器:

    Cloud Shell 選單列中「Launch code editor」(啟動程式碼編輯器) 圖示的螢幕擷取畫面

  8. 開啟名為 azure-pipelines-publisher-oneline.json 的檔案。您將在下方其中一個步驟中用到這個檔案的內容。

將 Azure Pipelines 連結至 Container Registry

建立服務帳戶之後,您現在可以將 Azure Pipelines 連結至 Container Registry。

  1. 在 Azure DevOps 選單中,選取 [Project settings],然後選取 [Pipelines] > [Service connections]
  2. 按一下 [New service connection]
  3. 從清單中選取 [Docker Registry]
  4. 在對話方塊中,在下列欄位輸入這些值:

    • 「Connection Name」gcr-tutorial
    • 「Docker Registry」https://gcr.io/[PROJECT-ID],其中 [PROJECT-ID] 是 GCP 專案名稱。

      範例:https://gcr.io/azure-pipelines-test-project-12345

    • 「Docker ID」_json_key

    • 「Password」:貼上 azure-pipelines-publisher-oneline.json 的內容

  5. 按一下 [OK] 以建立連線。

建立 Dockerfile

  1. 在 Visual Studio 中,開啟「Solution Explorer」(方案總管)。
  2. 在解決方案的根目錄中,建立一個名為 Dockerfile 的新檔案。
  3. 將下列程式碼複製並貼到檔案中,然後儲存檔案:

    FROM microsoft/aspnetcore:2.0.0
    WORKDIR /app
    COPY samples/MusicStore/bin/Release/netcoreapp2.0/publish /app/
    ENTRYPOINT ["dotnet", "MusicStore.dll"]
  4. 在解決方案的根目錄中,建立名為 deployment.yaml 的新檔案。暫時將檔案留空。

  5. 開啟 Team Explorer,然後按一下左上角的 [Home] (首頁) 圖示,以切換至「Home」(首頁) 視圖。

  6. 按一下 [Changes] (變更)

  7. 輸入修訂版本訊息,例如 Add Dockerfile and placeholder for the Kubernetes manifest

  8. 按一下 [Commit All] (全部認可)

延伸建構定義以建構 Docker 映像檔

簽入所有必要的檔案之後,您現在可以延伸建構定義。

  1. 在 Visual Studio 中,開啟 azure-pipelines.yml
  2. 將下列這段程式碼附加至檔案,以擴展建構定義:

    - task: CmdLine@1
      displayName: 'Lock image version in deployment.yaml'
      inputs:
        filename: /bin/bash
        arguments: '-c "awk ''{gsub(\"MUSICSTORE_IMAGE\", \"gcr.io/$(DockerImageName):$(Build.BuildId)\", $0); print}'' deployment.yaml > $(build.artifactstagingdirectory)/deployment.yaml"'
    - task: PublishBuildArtifacts@1
      displayName: 'Publish Artifact'
      inputs:
        PathtoPublish: '$(build.artifactstagingdirectory)'
    - task: Docker@0
      displayName: 'Build image'
      inputs:
        containerregistrytype: 'Container Registry'
        dockerRegistryConnection: 'gcr-tutorial'
        imageName: '$(DockerImageName):$(Build.BuildId)'
    - task: Docker@0
      displayName: 'Publish image'
      inputs:
        containerregistrytype: 'Container Registry'
        dockerRegistryConnection: 'gcr-tutorial'
        action: 'Push an image'
        imageName: '$(DockerImageName):$(Build.BuildId)'
    

如要修訂並將變更推送至 Azure DevOps,請執行下列步驟:

  1. 在 Visual Studio 中,開啟「Team Explorer」
  2. 按一下左上角的「首頁」圖示來切換至「首頁」檢視畫面。
  3. 按一下 [Changes] (變更)
  4. 輸入修訂版本訊息,例如 Extend build definition to build Docker image
  5. 按一下 [Commit All and Push] (全部認可並推送)
  6. 在 Azure DevOps 選單中,選取 [Pipelines] > [Build]

    您會發現系統已自動觸發新的建構作業。建構約需 2 分鐘才能完成。

    如果建構失敗並出現錯誤訊息 Step input dockerRegistryConnection references service connection gcr-tutorial which could not be found,您可能需要重新儲存管道

  7. 如要確認映像檔是否已發佈至 Container Registry,請切換至 GCP 主控台,選取 [Container Registry] > [Images] (映像檔),然後按一下 [musicstore]

    您會看到一個映像檔,而且這個映像檔的標記與在 Azure Pipelines 中執行的建構的數字 ID 相同。

    Container Registry 中圖像清單的螢幕擷取畫面

持續部署

Azure Pipelines 已可自動建構程式碼並為每個修訂版本發佈 Docker 映像檔。因此,您現在可以專注在部署上。

Azure Pipelines 與其他持續整合系統不同,會區分「建構」與「部署」,並提供一套名為「Release Management」的特殊工具,供所有部署相關工作使用。

Azure Pipelines Release Management 是以下列概念為中心建構而成:

  • 「版本」是指構成特定某一版應用程式的成果組合,而且通常是建構程序的結果。
  • 「部署」是指建立版本並將它部署至特定環境中的過程。
  • 部署會執行一組「任務」,您可將這組任務組成「工作」
  • 「階段」可讓您為管道分段,以用來自動化調度管理部署到多個環境,例如部署與測試環境。

MusicStore 建構程序產生的主要成果為 Docker 映像檔。但由於 Docker 映像檔是發佈至 Container Registry,因此映像檔會位於 Azure Pipelines 的範圍外,而無法有效地做為版本的定義。

如要部署至 Kubernetes,您也需要一份「資訊清單」,這與物料清單類似。資訊清單不僅定義 Kubernetes 應建立及管理的資源,也指定了要使用的 Docker 映像檔確切版本。Kubernetes 資訊清單非常適合做為定義 Azure Pipelines Release Management 中的版本的成果。

設定 Kubernetes 部署

如要在 Kubernetes 中執行 MusicStore,您需要下列資源:

  • 一個「部署」,定義一個執行 Docker 映像檔的 Pod。這個 Docker 映像檔是由建構所產生。
  • 一個「NodePort」服務,讓負載平衡器能夠存取 Pod。
  • 一個「輸入」,使用 Cloud HTTP(S) 負載平衡器將應用程式公開發佈至網際網路。

透過 MusicStore 應用程式,您可以使用 SQL Server 或儲存在本機上的嵌入式資料庫。為了簡單易懂,請使用仰賴嵌入式資料庫的預設設定,不過它也同時伴隨下列兩項限制:

  • 一次只能執行 Pod 的一個複本,否則使用者可能會因提供服務的 Pod 不同,而看到不同的資料。
  • 每次重新啟動 Pod 時,任何資料變更都會遺失,除非您將部署變更為使用永久磁碟區。(本教學課程不包含這種情境)。

如要定義這些 Kubernetes 資源,請執行下列步驟:

  1. 在 Visual Studio 中,開啟 Solution Explorer。
  2. 開啟 deployment.yaml 並貼入下列程式碼,然後儲存檔案:

    apiVersion: v1
    kind: Service
    metadata:
      name: musicstore
    spec:
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
        name: http
      selector:
        app: musicstore
      type: NodePort
    
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: musicstore
    spec:
      backend:
        serviceName: musicstore
        servicePort: 80
    
    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: musicstore
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            app: musicstore
        spec:
          containers:
          - name: musicstore
            image: MUSICSTORE_IMAGE
            ports:
              - containerPort: 80
            livenessProbe:      # Used by deployment controller
              httpGet:
                path: /
                port: 80
              initialDelaySeconds: 5
              periodSeconds: 5
            readinessProbe:     # Used by Ingress/GCLB
              httpGet:
                path: /
                port: 80
              initialDelaySeconds: 3
              periodSeconds: 5
            resources:
              limits:
                memory: 1024Mi
              requests:
                memory: 768Mi
    
  3. 開啟 Team Explorer,然後切換至「Home」(首頁) 視圖。

  4. 按一下 [Changes] (變更)

  5. 輸入修訂版本訊息,例如 Add Kubernetes manifest

  6. 按一下 [Commit All and Push] (全部認可並推送)

設定開發環境與實際工作環境

返回 Azure Pipelines Release Management 之前,您必須建立 GKE 叢集。

建立 GKE 叢集

  1. 在 GCP 中,開啟 Cloud Shell 執行個體。
  2. 為了節省輸入專案 ID 和 Compute Engine 區域選項的時間,請執行下列指令,以設定預設的設定值:

    gcloud config set project [PROJECT_NAME]
    gcloud config set compute/zone [ZONE]

    範例:

    gcloud config set project azure-pipelines-test-project-12345
    gcloud config set compute/zone us-central1-a
  3. 為您的專案啟用 GKE API:

    gcloud services enable container.googleapis.com
  4. 使用下列指令建立開發叢集。請注意,這項作業可能需要幾分鐘的時間才能完成:

    gcloud container clusters create azure-pipelines-cicd-dev
  5. 使用下列指令建立實際工作環境叢集。請注意,這項作業可能需要幾分鐘的時間才能完成:

    gcloud container clusters create azure-pipelines-cicd-prod

將 Azure Pipelines 連結至開發叢集

正如同您可以使用 Azure Pipelines 連結至外部 Docker 註冊資料庫 (如 Container Registry) 一樣,Azure Pipelines 也支援整合外部 Kubernetes 叢集。

您可以使用 GCP 服務帳戶向 Container Registry 取得驗證,但 Azure Pipelines 不支援使用 GCP 服務帳戶以 GKE 進行驗證。您必須改用 Kubernetes 服務帳戶

因此,如要將 Azure Pipelines 連結至開發叢集,您必須先建立 Kubernetes 服務帳戶。

  1. 在 Cloud Shell 中,連結至開發叢集:

    gcloud container clusters get-credentials azure-pipelines-cicd-dev
  2. 為 Azure Pipelines 建立 Kubernetes 服務帳戶:

    kubectl create serviceaccount azure-pipelines-deploy
  3. 建立叢集角色繫結,將 cluster-admin 角色指派給服務帳戶:

    kubectl create clusterrolebinding azure-pipelines-deploy --clusterrole=cluster-admin --serviceaccount=default:azure-pipelines-deploy
  4. 判定叢集的 IP 位址:

    gcloud container clusters describe azure-pipelines-cicd-dev --format=value\(endpoint\)
    

    您稍後將會用到這個位址。

  5. 在 Azure DevOps 選單中,選取 [Project settings],然後選取 [Pipelines] > [Service connections]

  6. 按一下 [New service connection],然後選取 [Kubernetes]

  7. 進行下列設定:

    • 「Choose authentication」:[Service account]
    • 「Connection name」azure-pipelines-cicd-dev
    • 「Server URL」https://[MASTER-IP]/。請將 [MASTER-IP] 換成您之前判定的 IP 位址。
    • Token:在 Cloud Shell 中執行下列指令,並複製輸出結果:
      kubectl get secret $(kubectl get secret -o custom-columns=":metadata.name" | grep azure-pipelines-deploy-) -o jsonpath="{.data.token}{'\n'}"
    • Certificate:在 Cloud Shell 中執行下列指令,並複製輸出結果:
      kubectl get secret $(kubectl get secret -o custom-columns=":metadata.name" | grep azure-pipelines-deploy-) -o jsonpath="{.data['ca\.crt']}{'\n'}"
  8. 按一下 [OK]

將 Azure Pipelines 連結至實際工作環境叢集

如要將 Azure Pipelines 連結至實際工作環境叢集,您可以按照相同的方法操作。

  1. 在 Cloud Shell 中,連結至實際工作環境叢集。

    gcloud container clusters get-credentials azure-pipelines-cicd-prod
  2. 為 Azure Pipelines 建立 Kubernetes 服務帳戶:

    kubectl create serviceaccount azure-pipelines-deploy
  3. 建立叢集角色繫結,將 cluster-admin 角色指派給服務帳戶:

    kubectl create clusterrolebinding azure-pipelines-deploy --clusterrole=cluster-admin --serviceaccount=default:azure-pipelines-deploy
  4. 判定叢集的 IP 位址:

    gcloud container clusters describe azure-pipelines-cicd-prod --format=value\(endpoint\)
    

    您稍後將會用到這個位址。

  5. 在 Azure DevOps 選單中,選取 [Project settings],然後選取 [Pipelines] > [Service connections]

  6. 按一下 [New service connection],然後選取 [Kubernetes]

  7. 進行下列設定:

    • 「Choose authentication」:[Service account]
    • 「Connection name」azure-pipelines-cicd-prod
    • 「Server URL」https://[MASTER-IP]/。請將 [MASTER-IP] 換成您之前判定的 IP 位址。
    • Token:在 Cloud Shell 中執行下列指令,並複製輸出結果:
      kubectl get secret $(kubectl get secret -o custom-columns=":metadata.name" | grep azure-pipelines-deploy-) -o jsonpath="{.data.token}{'\n'}"
    • Certificate:在 Cloud Shell 中執行下列指令,並複製輸出結果:
      kubectl get secret $(kubectl get secret -o custom-columns=":metadata.name" | grep azure-pipelines-deploy-) -o jsonpath="{.data['ca\.crt']}{'\n'}"
  8. 按一下 [OK]

設定發佈管道

設定 GKE 基礎架構之後,您將返回 Azure Pipelines 以自動化部署作業,這包含了:

  • 部署至開發環境。
  • 要求通過手動核准後,才啟動部署到實際工作環境。
  • 部署至實際工作環境。

建立發行定義

第一步是建立新的發行定義。

  1. 在 Azure DevOps 選單中,選取 [Pipelines] > [Releases]
  2. 按一下 [New pipeline]
  3. 從範本清單中選取 [Empty job]
  4. 當系統提示您輸入階段名稱時,輸入 Dev
  5. 在畫面頂端,將發佈命名為 MusicStore-KubernetesEngine
  6. 在管道圖中的「Artifacts」旁,按一下 [Add]
  7. 選取 [Build],並新增下列設定:

    • 「Source (build pipeline)」:選取建構定義 (應該只有一個選項)
    • 「Default version」Latest
    • 「Source Alias」: manifest
  8. 按一下 [Add]

  9. 按一下 [Artifact] (成品) 方塊中的閃電圖示,來新增部署觸發條件。

  10. 在「Continuous deployment trigger」(持續部署觸發程序) 底下,將切換按鈕設定為 [Enabled] (已啟用)

  11. 按一下 [Save]

  12. 視需要輸入註解,然後按一下 [Save] 確認。

管道現在看起來會像這樣:

Azure Pipelines 中更新管道的螢幕擷取畫面

部署至開發叢集

建立發行定義之後,您現在可以將部署設定至 GKE 開發叢集。

  1. 在管道選單中,切換至「Tasks」分頁標籤。
  2. 按一下 [Agent job]
  3. 將代理程式集區變更為「Hosted Ubuntu 1604」
  4. 在「Agent job」 旁按一下 [+] 圖示,以在階段中新增步驟。
  5. 選取 [Deploy to Kuberetes] 工作,然後按一下 [Add]
  6. 按一下新增的工作,然後進行下列設定:

    • 「Display name」Deploy
    • 「Service connection type」:[Kubernetes Service Connection]
    • 「Kubernetes service connection」:[azure-pipelines-cicd-dev]
    • 「Command」apply
    • 「Use configuration」:[Enabled]
    • 「Configuration type」:[File path]
    • 「Configuration file」manifest/drop/deployment.yaml
  7. 按一下 [Save]

  8. 視需要輸入註解,然後按一下 [OK] 確認。

部署至實際工作環境叢集

最後,將部署設定至 GKE 實際工作環境叢集。

  1. 在選單中,切換至「Pipeline」分頁標籤。
  2. 在「Stages」方塊中,選取 [Add] > [New stage]
  3. 從範本清單中選取 [Empty job]
  4. 當系統提示您輸入階段名稱時,請輸入 Prod
  5. 按一下新建立階段的閃電圖示。
  6. 進行下列設定:

    • 選取觸發條件After stage
    • 階段Dev
    • 「Pre-deployment approvals」:(啟用)
    • Approvers:選取您自己的使用者名稱或群組。

    管道現在看起來會像這樣:

    Azure Pipelines 中更新管道的螢幕擷取畫面

  7. 切換至「Tasks」分頁標籤。

  8. 將滑鼠停在「Tasks」分頁上方,然後選取 [Tasks] > [Prod]

  9. 按一下 [Agent job]

  10. 將代理程式集區變更為「Hosted Ubuntu 1604」

  11. 按一下 [+] 圖示,在階段中新增步驟。

  12. 選取 [Deploy to Kuberetes] 工作,然後按一下 [Add]

  13. 按一下新增的工作,然後進行下列設定:

    • 「Display name」Deploy
    • 「Service connection type」:[Kubernetes Service Connection]
    • 「Kubernetes service connection」:[azure-pipelines-cicd-prod]
    • 「Command」apply
    • 「Use configuration」:[Enabled]
    • 「Configuration type」:[File path]
    • 「Configuration file」manifest/drop/deployment.yaml
  14. 按一下 [Save]

  15. 視需要輸入註解,然後按一下 [OK] 確認。

執行管道

您已經設定了整個管道,現在您可以開始執行原始碼變更來進行測試。

  1. 在 Visual Studio 中,開啟 samples\MusicStore\config.json 檔案。
  2. 在第 3 行,將 SiteTitle 設定變更為 ASP.NET MVC Music Store running on Google Kubernetes Engine
  3. 開啟 Team Explorer,然後切換至「Home」(首頁) 視圖。
  4. 按一下 [Changes] (變更)
  5. 輸入修訂版本訊息,例如 Change site title
  6. 按一下 [Commit All and Push] (全部認可並推送)
  7. 在 Azure DevOps 選單中,選取 [Pipelines] > [Builds]。您會發現系統已自動觸發建構作業。

    顯示正在建構的清單以及進行中的 Music Store 建構的螢幕擷取畫面

    狀態可能需要約 2 分鐘的時間,才會變成「Succeeded」

  8. 建構完成之後,請選取 [Pipelines] > [Releases],您會發現系統已啟動發佈程序:

    顯示已開始發佈程序的螢幕擷取畫面

  9. 按一下 [Release-1] 開啟詳細資料頁面,並等候「Dev」階段的狀態切換為「Succeeded」。您可能需要按一下選單中的 [Refresh] 按鈕或重新載入瀏覽器頁面,以重新整理狀態。

  10. 在 GCP 主控台中,選取 [Kubernetes Engine] > [Services] (服務)

  11. 找到 azure-pipelines-cicd-dev 叢集的輸入服務,然後等待其狀態變成「Ok」。這可能需要幾分鐘的時間。

  12. 複製同一列中標示為 */* 的連結網址,然後移除結尾的星號。

  13. 在新的瀏覽器分頁中開啟網址。您一開始可能會看到錯誤,因為負載平衡器需要幾分鐘的時間才能變為可用。準備就緒後,您會發現 Music Store 已部署完成,並使用自訂名稱:

    顯示 Music Store 應用程式正在瀏覽器頁面中執行的螢幕擷取畫面

  14. 在 Azure Pipelines 的「Prod」階段中,按一下 [Approve] 將部署推送至實際工作環境:

    顯示發佈頁面及「A pre-deployment approval is pending ... Approve or Reject」訊息的螢幕擷取畫面

    如果畫面上沒有按鈕,您可能需要先核准或拒絕先前的發行版本。

  15. 視需要輸入註解,然後按一下 [Approve] 確認。

  16. 等候「Prod」環境的狀態變成「Succeeded」。您可能需要在瀏覽器中手動重新整理頁面。

  17. 在 GCP 主控台中,重新整理「Services」(服務) 頁面。

  18. 找到 azure-pipelines-cicd-prod 叢集的輸入服務,然後等待其狀態變成「Ok」。這可能需要幾分鐘的時間。

  19. 複製同一列中標示為 */* 的連結網址,然後移除結尾的星號。

  20. 在新的瀏覽器分頁中開啟網址。同樣地,您一開始可能會看到錯誤,因為負載平衡器需要過幾分鐘才能使用。準備就緒後,您會再次看到 MusicStore 應用程式及自訂名稱,這次應用程式是在實際工作環境叢集中執行。

清除所用資源

如要避免在完成本教學課程後繼續產生費用,請刪除您已建立的實體。

刪除 Azure Pipelines 專案

在 Azure Pipelines 中刪除專案。請注意,這也將遺失所有原始碼變更。

刪除 GCP 專案

  1. 前往 GCP 主控台的「Projects」(專案) 頁面。

    前往專案頁面

  2. 在專案清單中選取要刪除的專案,然後按一下 [Delete] (刪除)
  3. 在對話方塊中輸入專案 ID,按一下 [Shut down] (關閉) 即可刪除專案。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
解決方案