建構、測試和部署成果

本頁說明如何使用 Cloud Build 的官方建構工具映像檔撰寫建構設定,以擷取原始碼與依附元件,並建構、測試及部署成果。

如果您已經擁有建構設定檔,並希望在 Cloud Build 上執行建構,請參閱手動啟動建構自動建構

事前準備

擷取依附元件

使用執行 docker、git、npm 與 gsuti 等工具的建構步驟,擷取原始碼或安裝依附元件:

docker

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['pull', 'gcr.io/$PROJECT_ID/latest-image']

git

steps:
- name: 'gcr.io/cloud-builders/git'
  args: ['clone', 'https://github.com/GoogleCloudPlatform/cloud-builders']

npm

steps:
- name: 'gcr.io/cloud-builders/npm'
  args: ['install']

gsutil

steps:
- name: 'gcr.io/cloud-builders/gsutil'
  args: ['cp', 'gs://mybucket/remotefile.zip', 'localfile.zip']

建構容器映像檔

如要建構 Docker 容器映像檔,請使用 docker 建構步驟,您可以在這個步驟中叫用 docker 指令。系統會將已傳送至這個建構步驟的引數直接傳送至 docker,進而讓您在這個建構步驟中執行任何 docker 指令。

在您的建構設定檔中,新增執行下列動作的指令:

  • 呼叫 docker 建構工具並傳送引數,以叫用 Docker build 指令。在下列建構設定中,系統會呼叫 Docker 建構步驟兩次以建構兩個映像檔,而且「在建構階段的目前工作目錄中」可以找到原始碼檔案,並以 . 表示。「在建構階段的目前工作目錄內的一個目錄中」(即 subdirectory) 可以找到 gcr.io/my-project/image2 的原始碼。
  • 新增 images 欄位以將產生的映像檔推送至 Container Registry。

YAML

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/my-project/image1', '.']
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/my-project/image2', '.']
  dir: 'subdirectory'
images: ['gcr.io/my-project/image1', 'gcr.io/my-project/image2']

JSON

{
  "steps": [
    {
      "name": "gcr.io/cloud-builders/docker",
      "args": ["build", "-t", "gcr.io/my-project/image1", "."]
    },
    {
      "name": "gcr.io/cloud-builders/docker",
      "args": ["build", "-t", "gcr.io/my-project/image2", "."],
      "dir": "subdirectory"
    }
  ],
  "images": ["gcr.io/my-project/image1", "gcr.io/my-project/image2"]
}

建構非容器成果

Cloud Build 提供一般語言與工具的支援建構步驟,您可以使用這些步驟執行建構。

如要建構非容器成果,請新增執行 maven、gradle、go 或 bazel 等建構工具的建構步驟區段:

maven

steps:
- name: 'gcr.io/cloud-builders/mvn'
  args: ['install']
- name: 'gcr.io/cloud-builders/mvn'
  args: ['package']

gradle

steps:
- name: 'gcr.io/cloud-builders/gradle'
  args: ['build']

go

steps:
- name: 'gcr.io/cloud-builders/go'
  args: ['build', 'my-package']

bazel

steps:
- name: 'gcr.io/cloud-builders/bazel'
  args: ['build', '//path/to:target']

執行單元測試與整合測試

如果您有可用的原始碼,可以執行單元測試與整合測試做為建構步驟。

假設您的 JavaScript 應用程式包含單元測試、會建構 Docker 映像檔的 Dockerfile,以及針對該執行中映像檔執行的整合測試。

如要針對這個應用程式執行單元測試與整合測試,請在您的建構設定檔中新增執行下列操作的操作說明:

  • 安裝依附元件以執行建構。
  • 執行單元測試。
  • 建構應用程式的 Docker 映像檔。
  • 使用 Docker compose 在背景執行應用程式與依附元件。
  • 針對執行中的 Docker compose 堆疊執行整合測試。
  • 將新建構的映像檔推送至 Container Registry。

    steps:
    - name: 'gcr.io/cloud-builders/npm'
      args: ['install']
    - name: 'gcr.io/cloud-builders/npm'
      args: ['run', 'test:unit']
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t', 'gcr.io/$PROJECT_ID/gcb-docker-compose:latest', '.']
    - name: 'docker/compose:1.15.0'
      args: ['up', '-d']
      env:
      - 'PROJECT_ID=$PROJECT_ID'
    - name: 'gcr.io/cloud-builders/npm'
      args: ['run', 'test:integration']
      env:
      - 'HOST=counter' # name of the running container
      - 'PORT=50051'
    images: ['gcr.io/$PROJECT_ID/gcb-docker-compose:latest']
    

部署成果

在持續部署管道的過程中,Cloud Build 可以使用指令列工具執行部署。

透過下列步驟部署至 GKE、App Engine、Cloud Functions 與 Firebase。

Kubernetes Engine

如要使用 kubectl 部署至 GKE,請呼叫 kubectl 建構步驟,以更新部署資源:

  1. 啟用 GKE API
  2. 新增 GKE 身分與存取權管理角色:
    1. 在 GCP 主控台中,造訪身分與存取權管理選單
    2. 從服務帳戶清單,按一下 Cloud Build [YOUR-PROJECT-NUMBER]@cloudbuild.gserviceaccount.com 服務帳戶旁邊的 [Roles] (角色) 下拉式選單。
    3. 按一下 [Kubernetes Engine],然後按一下 [Kubernetes Engine Admin] (Kubernetes Engine 管理員)
    4. 按一下 [Save] (儲存)
  3. 在您的建構設定中新增 kubectl 建構步驟:

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      args: ["build", "-t", "gcr.io/[PROJECT-ID]/[IMAGE]", "."]
    - name: 'gcr.io/cloud-builders/docker'
      args: ["push", "gcr.io/[PROJECT-ID]/[IMAGE]"]
    - name: 'gcr.io/cloud-builders/kubectl'
      args:
      - set
      - image
      - deployment
      - [DEPLOYMENT-NAME]
      - [CONTAINER]=gcr.io/[PROJECT-ID]/[IMAGE]:[TAG]
      env:
      - 'CLOUDSDK_COMPUTE_ZONE=[COMPUTE-ZONE]'
      - 'CLOUDSDK_CONTAINER_CLUSTER=[CLUSTER]'
    

這個建構會呼叫 docker 建構步驟來建立 Docker 映像檔,並將映像檔推送至 Container Registry。然後,建構會呼叫 kubectl 建構步驟來更新部署資源。

如要使用這個範例建構設定,請提供下列資訊:

  • [PROJECT-ID],GCP 專案的專案 ID
  • [IMAGE],映像檔的名稱,及其 [TAG] 做為所需版本或修訂版本 SHA
  • [CLUSTER],要求驗證憑證的叢集名稱
  • [COMPUTE-ZONE],專案的運算區域
  • [DEPLOYMENT-NAME]kubectl set 將更新的 Kubernetes 部署資源名稱

App Engine

如要將應用程式從容器映像檔部署至 App Engine,請使用 gcloud app deploy 指令的引數呼叫 gcloud 建構步驟:

  1. 啟用 App Engine API
  2. App Engine 身分與存取權管理授予 Cloud Build 服務帳戶:

    1. 在 GCP 主控台中,造訪身分與存取權管理選單
    2. 在成員清單中,尋找 [YOUR-PROJECT-NUMBER]@cloudbuild.gserviceaccount.com
    3. 按一下該列的鉛筆圖示,將新角色授予該帳戶。
    4. 按一下 [Add another role] (新增其他角色)
    5. 選取 [App Engine],然後按一下 [App Engine Admin] (App Engine 管理員)
    6. 按一下 [Save] (儲存)
    7. 建立使用 gcloud app deploy 的版本設定檔:

      steps:
      - name: 'gcr.io/cloud-builders/gcloud'
        args: ['app', 'deploy']
      timeout: '1600s'
      

gcloud 建構步驟會呼叫 gcloud app deploy 指令來建構包含原始碼的容器映像檔,然後在 App Engine 中部署該映像檔。

Cloud Functions

如要將應用程式部署至 Cloud Functions,請呼叫 gcloud 建構步驟,以叫用 gcloud functions deploy

  1. 啟用 Cloud Functions API
  2. Cloud Functions 開發人員角色授予 Cloud Build 服務帳戶:
    1. 在 GCP 主控台中,造訪身分與存取權管理選單
    2. 在成員清單中,尋找 [PROJECT_NUMBER]@cloudbuild.gserviceaccount.com
    3. 按一下該列的鉛筆圖示,將新角色授予該帳戶。
    4. 按一下 [Add another role] (新增其他角色)
    5. 先後選取 [Cloud Functions] 與 [Cloud Functions Developer] (Cloud Functions 開發人員)
    6. 按一下 [Save] (儲存)
  3. 身分與存取權管理務帳戶使用者角色授予 Cloud Functions 執行階段服務帳戶上的 Cloud Build 服務帳戶:
    1. 在 GCP 主控台中,造訪服務帳戶選單
    2. 在成員清單中,尋找 [PROJECT_ID]@appspot.gserviceaccount.com
    3. 選取上述服務帳戶,然後按一下右上角的 [SHOW INFO PANEL] (顯示資訊面板)
    4. 在「Permissions」(權限) 面板中,按一下 [Add Member] (新增成員) 按鈕。
    5. 在 [New Member] (新成員) 輸入欄位中輸入 Cloud Build 服務帳戶 ([PROJECT_NUMBER]@cloudbuild.gserviceaccount.com)。
    6. 在 [Role] (角色) 下拉式選單中,先後選取 [Service Account] (服務帳戶) 與 [Service Account User] (服務帳戶使用者)
    7. 按一下 [Save] (儲存)
  4. 建立一個使用 gcloud functions deploy 的建構設定檔:

    steps:
    - name: 'gcr.io/cloud-builders/gcloud'
      args:
      - functions
      - deploy
      - [FUNCTION_NAME]
      - --source=.
      - --trigger-http
    

這樣會建構應用程式原始碼,並呼叫 gcloud functions deploy 以部署應用程式 Cloud Functions。

Firebase

您可以建立 Firebase 自訂建構步驟,以在建構中使用 Firebase

如要建立 Firebase 建構步驟,請從下列範例建立 Dockerfile 和建構設定檔。

建立含有以下內容的 Dockerfile。這樣就會在建構呼叫時安裝 Firebase 指令列工具 firebase

# use latest Node LTS (Boron)
FROM node:boron
# install Firebase CLI
RUN npm install -g firebase-tools

ENTRYPOINT ["/usr/local/bin/firebase"]

建立含有以下內容且名為 cloudbuild.yaml 的建構設定。這個建構設定會使用 Dockerfilefirebase-tools 容器化為 firebase。然後,建構會將容器化後的映像檔推送至 Container Registry 以供稍後的建構使用:

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'build', '-t', 'gcr.io/[PROJECT_ID]/firebase', '.' ]
images:
- 'gcr.io/[PROJECT_ID]/firebase'

Dockerfilecloudbuild.yaml 位於相同目錄中時,從殼層或終端機視窗執行下列指令:

gcloud builds submit --config=cloudbuild.yaml .

gcloud builds 指令會將建構提交至 Cloud Build,進而使用目前目錄中的 cloudbuild.yaml 建構設定與原始碼 (由 . 表示)。建構會在環境中安裝 firebase 工具。然後,系統會將該工具容器化並推送至 Container Registry。

如要在建構中呼叫 firebase,請將 gcr.io/[PROJECT_ID]/firebase 建構步驟加到您的建構設定:

steps:
- name: 'gcr.io/cloud-builders/npm'
  args: [ 'install' ]
- name: 'gcr.io/cloud-builders/npm'
  args: [ 'test' ]
- name: 'gcr.io/cloud-builders/npm'
  args: [ 'run', 'build.prod' ]
- name: 'gcr.io/[PROJECT_ID]/firebase'
  args: [ 'deploy', '-P', 'js-demo-fe-staging', '--token', '[FIREBASE_TOKEN]']

如要使用這個建構設定,請提供 [FIREBASE_TOKEN] 值,即您已產生的 Firebase 驗證憑證。

建構設定檔範例

從 GitHub 觸發的建構

下列設定顯示從 GitHub 觸發的簡單建構。這個類型的設定通常用於 CI/CD 管道。

本範例的詳情如下:

  • 呼叫 npm 建構步驟,會安裝依附元件並執行單元測試。
  • 呼叫 docker 建構步驟,會建構應用程式的 Docker 映像檔,並將映像檔推送至 Container Registry。
  • 呼叫 kubectl 建構步驟,會將建構的映像檔部署至 Kubernetes 叢集。

YAML

steps:
- name: 'gcr.io/cloud-builders/npm'
  args: ['install']
- name: 'gcr.io/cloud-builders/npm'
  args: ['test']
- name: 'gcr.io/cloud-builders/docker'
  args: ["build", "-t", "gcr.io/my-project/my-image:$REVISION_ID", "."]
- name: 'gcr.io/cloud-builders/docker'
  args: ["push", "gcr.io/my-project/my-image:$REVISION_ID"]
- name: 'gcr.io/cloud-builders/kubectl'
  args:
  - 'set'
  - 'image'
  - 'deployment/my-deployment'
  - 'my-container=gcr.io/my-project/my-image:$REVISION_ID'
  env:
  - 'CLOUDSDK_COMPUTE_ZONE=us-east4-b'
  - 'CLOUDSDK_CONTAINER_CLUSTER=my-cluster'

JSON

{
    "steps": [
    {
        "name": "gcr.io/cloud-builders/npm",
        "args": [
            "install"
        ]
    },
    {
        "name": "gcr.io/cloud-builders/npm",
        "args": [
            "test"
        ]
    },
    {
        "name": "gcr.io/cloud-builders/docker",
        "args": [
            "build",
            "-t",
            "gcr.io/my-project/my-image:$REVISION_ID",
            "."
        ]
    },
    {
        "name": "gcr.io/cloud-builders/docker",
        "args": [
            "push",
            "gcr.io/my-project/my-image:$REVISION_ID"
        ]
    },
    {
        "name": "gcr.io/cloud-builders/kubectl",
        "args": [
            "set",
            "image",
            "deployment/my-deployment",
            "frontend=gcr.io/my-project/my-image:$REVISION_ID"
        ],
        "env": [
            "CLOUDSDK_COMPUTE_ZONE=us-east4-b",
            "CLOUDSDK_CONTAINER_CLUSTER=my-cluster"
        ]
    }
    ]
}

撰寫建構要求而不推送映像檔

您可以使用 Cloud Build 執行任意工作,而不產生 Docker 映像檔。

以下範例會執行下列操作:

  • 使用 docker 建構分析工具
  • data-to-analyze 目錄中提取部分資料
  • 將分析結果推送至 Cloud Storage 值區

YAML

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'analyzer', '.']

- name: 'gcr.io/cloud-builders/gsutil'
  args: ['cp', 'gs://my-data-warehouse/data-to-analyze.tgz', '.']

- name: 'debian'
  args: ['tar', '-xzf', 'data-to-analyze.tgz']

- name: 'analyzer'
  args: ['--output=results.csv']
  dir: 'data-to-analyze'

- name: 'gcr.io/cloud-builders/gsutil'
  args: ['cp', 'data-to-analyze/results.csv', 'gs://my-data-warehouse/results.tgz']

JSON

{
  "steps": [
    {
      "name": "gcr.io/cloud-builders/docker",
      "args": [
        "build",
        "-t",
        "analyzer",
        "."
      ]
    },
    {
      "name": "gcr.io/cloud-builders/gsutil",
      "args": [
        "cp",
        "gs://my-data-warehouse/data-to-analyze.tgz",
        "."
      ],
    },
    {
      "name": "debian",
      "args": [
        "tar",
        "-xzf",
        "data-to-analyze.tgz"
      ],
    },
    {
      "name": "analyzer",
      "args": [
        "--output=results.csv"
      ],
      "dir": "data-to-analyze"
    },
    {
      "name": "gcr.io/cloud-builders/gsutil",
      "args": [
        "cp",
        "data-to-analyze/results.csv",
        "gs://my-data-warehouse/results.tgz"
      ]
    }
  ]
}

後續步驟

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

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

這個網頁
Cloud Build 說明文件