加速建構的最佳做法

本頁提供加速 Cloud Build 建構的最佳做法。

建構更精簡的容器

將應用程式容器化時,執行階段不需要的檔案 (例如建構階段依附元件和中間檔案) 可能會無意中包含於容器映像檔內。這些不需要的檔案可增加容器映像檔的大小,當映像檔在容器映像檔註冊資料庫和容器執行階段之間移動時,也會增加額外的時間和成本。

為協助降低容器映像檔的大小,請將應用程式的建構和建構所使用的工具與執行階段容器的組件分開。

詳情請參閱建構更精簡的容器

使用已快取的 Docker 映像檔

加快 Docker 映像檔版本建構速度最簡單的方法就是讓指定的快取映像檔可以用於後續版本建構。您可在版本設定檔中新增 --cache-from 引數來指定快取的映像檔,這樣可以告知 Docker 建構時使用該映像檔做為快取來源。

每個 Docker 映像檔都包含多個堆疊層。使用 --cache-from 可從變更的那一層重新建構所有層,直到版本結束為止;因此如果您變更 Docker 版本較早階段中的層,使用 --cache-from 並沒有好處。

建議一律針對您的版本採用 --cache-from,但是要注意下列事項:

  • 您需要快取之前建構的 Docker 映像檔。
  • 您只能針對 Docker 版本使用 --cache-from;不可將其用於建立其他種類成果的建構工具。
  • 快取的映像檔必須從註冊資料庫擷取,這樣可能會增加建構所需的時間。

下列步驟說明如何使用之前快取的映像檔建構版本:

YAML

  1. 在您的建構設定中,新增執行下列動作的操作說明:

    • 從 Container Registry 提取快取的映像檔。請注意,以下的 docker pull 建構步驟將 entrypoint 設為 bash,讓您可以執行指令,並忽略傳回的錯誤。當您第一次建構映像檔,而且 docker pull 沒有可以提取的現有映像檔時,這是需要的。
    • 加上 --cache-from 引數以使用該映像檔進行重新建構。

      steps:
      - name: 'gcr.io/cloud-builders/docker'
        entrypoint: 'bash'
        args: ['-c', 'docker pull gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest || exit 0']
      - name: 'gcr.io/cloud-builders/docker'
        args: [
                  'build',
                  '-t', 'gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest',
                  '--cache-from', 'gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest',
                  '.'
              ]
      images: ['gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest']
      

      其中 [IMAGE_NAME] 是映像檔的名稱。

  2. 使用前述版本設定來建構映像檔:

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. 在您的建構設定中,新增執行下列動作的操作說明:

    • 從 Container Registry 提取快取的映像檔。請注意,以下的 docker pull 建構步驟將 entrypoint 設為 bash,讓您可以執行指令,並忽略傳回的錯誤。當您第一次建構映像檔,而且 docker pull 沒有可以提取的現有映像檔時,這是需要的。
    • 加上 --cache-from 引數以使用該映像檔進行重新建構。

      {
          "steps": [
          {
              "name": "gcr.io/cloud-builders/docker",
              "entrypoint": "bash",
              "args": ["-c", "docker pull gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest || exit 0"]
          },
          {
              "name": "gcr.io/cloud-builders/docker",
              "args": [
                  "build",
                  "-t",
                  "gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest",
                  "--cache-from",
                  "gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest",
                  "."
              ]
          }
          ],
          "images": ["gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest"]
      }
      

      其中 [IMAGE_NAME] 是映像檔的名稱。

  2. 使用前述版本設定來建構映像檔:

    gcloud builds submit --config cloudbuild.json .
    

使用 Google Cloud Storage 快取目錄

如要加快建構速度,請重複使用之前版本的結果。您可將之前版本的結果複製到 Google Cloud Storage 值區,使用這些結果加快計算速度,然後將新結果複製回值區。當您的版本建構花費較長時間,但是產生的檔案很少,而不需要花費時間將檔案複製到 Google Cloud Storage 或從 Google Cloud Storage 複製出時,請使用這個方法。

與僅用於 Docker 版本的 --cache-from 不同,Google Cloud Storage 快取功能可用於 Cloud Build 支援的任何建構工具

請按照下列步驟,使用 Google Cloud Storage 快取目錄:

YAML

  1. 在您的版本設定檔中,新增執行下列動作的指令:

    • 從 Google Cloud Storage 值區複製之前建構的結果。
    • 使用目前建構的結果。
    • 將新結果複製回值區。

      steps:
      - name: gcr.io/cloud-builders/gsutil
        args: ['cp', 'gs://mybucket/results.zip', 'previous_results.zip']
      # operations that use previous_results.zip and produce new_results.zip
      - name: gcr.io/cloud-builders/gsutil
        args: ['cp', 'new_results.zip', 'gs://mybucket/results.zip']
      
  2. 使用前述建構設定來建構程式碼:

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. 在您的版本設定檔中,新增執行下列動作的指令:

    • 從 Google Cloud Storage 值區複製之前建構的結果。
    • 使用目前建構的結果。
    • 將新結果複製回值區。

      {
          "steps": [
          {
              "name": "gcr.io/cloud-builders/gsutil",
              "args": ["cp", "gs://mybucket/results.zip", "previous_results.zip"]
          },
          {
              // operations that use previous_results.zip and produce new_results.zip
          },
          {
              "name": "gcr.io/cloud-builders/gsutil",
              "args": ["cp", "new_results.zip", "gs://mybucket/results.zip"]
          }
          ]
      }
      
  2. 使用前述建構設定來建構程式碼:

    gcloud builds submit --config cloudbuild.json .
    

避免上傳不必要的檔案

觸發建構時,會上傳您的程式碼目錄,供 Cloud Build 使用。

您可以使用 .gcloudignore 檔案排除建構不需要的檔案,將上傳時間最佳化。

通常會排除的檔案範例包括︰

  • 專案開發人員的文件和樣本程式碼
  • 產生的鷹架程式碼、二進位檔、*.jar 檔案或用於開發的已編譯網路資產。
  • 由廠商提供,用於本地開發的第三方依附元件

如要準備 .gcloudignore 檔案來處理這些情況,請在專案的根目錄下建立一個檔案,其內容如下:

.git
dist
node_modules
vendor
*.jar

排除已編譯的程式碼和第三方依附元件也使建構過程更為一致,並可降低仍在積極開發階段的程式碼意外部署的風險。

後續步驟