建構、測試及容器化 Python 應用程式

本頁面說明如何設定 Cloud Build,以建構、測試、封裝及部署 Python 應用程式。

Cloud Build 可讓您使用任何開放給大眾使用的容器映像檔執行開發工作,包括建構、測試、容器化、上傳至 Artifact Registry、部署及儲存建構記錄。Docker Hub 的公開 python 映像檔已預先安裝 pythonpip 工具。您可以設定 Cloud Build 使用這些工具安裝依附元件、建構,並使用這些工具執行單元測試。

事前準備

本頁說明假設您已熟悉 Python。此外:

  • Enable the Cloud Build, Cloud Run, Cloud Storage and Artifact Registry APIs.

    Enable the APIs

  • 如要執行本頁的 gcloud 指令,請安裝 Google Cloud CLI
  • 請準備好 Python 專案,包括 requirements.txt 檔案。您需要在原始碼中加入 Dockerfile
  • 如果您想將建構的容器儲存在 Artifact Registry 中,請在 Artifact Registry 中建立 Docker 存放區
  • 如要將測試記錄儲存在 Cloud Storage 中,請在 Cloud Storage 中建立值區

必要的 IAM 權限

如需授予這些角色的操作說明,請參閱「使用 IAM 頁面授予角色」。

設定 Python 建構

本節將介紹 Python 應用程式的建構設定檔範例。其中包含安裝必要條件的建構步驟、新增單元測試,以及在測試通過後建構及部署應用程式。

  1. 在專案根目錄中,建立名為 cloudbuild.yamlCloud Build 設定檔

  2. 安裝需求:Docker Hub 提供的 python 映像檔已預先安裝 pip。如要從 pip 安裝依附元件,請新增含有下列欄位的建構步驟:

    • name:將這個欄位的值設為 python,即可使用 Docker Hub 中的 Python 映像檔執行此工作。
    • entrypoint:設定這個欄位會覆寫 name 中參照圖片的預設進入點。將這個欄位的值設為 pip,即可將 pip 做為建構步驟的進入點,並執行 pip 指令。
    • args:建構步驟的 args 欄位會取得引數清單,並將其傳送至 name 欄位參照的圖片。傳遞引數,以便在這個欄位中���行 pip install 指令。pip install 指令中的 --user 標記可確保後續的建���步驟可存取在這個建構步驟中安裝的模組。

    下列建構步驟會將引數新增至 requirements.txt 檔案中的安裝需求:

    steps:
      # Install dependencies
      - name: python
        entrypoint: pip
        args: ["install", "-r", "requirements.txt", "--user"]
  3. 新增單元測試:如果您已使用 pytest 等測試架構在應用程式中定義單元測試,可以在建構步驟中新增下列欄位,藉此設定 Cloud Build 執行測試:

    • name:將這個欄位的值設為 python,即可使用 Docker Hub 中的 Python 映像檔執行工作。
    • entrypoint:將這個欄位的值設為 python,即可執行 python 指令。
    • args:新增執行 python pytest 指令的引數。

    以下建構步驟會將 pytest 記錄輸出內容儲存至 JUNIT XML 檔案。這個檔案的名稱會使用與建構相關聯的修訂版本 ID 簡短版本來建構。後續的建構步驟會將此檔案中的記錄儲存至 Cloud Storage。

    # Run unit tests
    - name: python
      entrypoint: python
      args: ["-m", "pytest", "--junitxml=${SHORT_SHA}_test_log.xml"] 
  4. 將應用程式納入容器:新增建構步驟以確保測試已通過後,您就可以建構應用程式。Cloud Build 提供預先建構的 Docker 映像檔,可用於將 Python 應用程式容器化。如要將應用程式容器化,請在建構步驟中新增下列欄位:

    • name:將這個欄位的值設為 gcr.io/cloud-builders/docker,即可為工作使用預先建構的 Docker 映像檔。
    • args:將 docker build 指令的引數新增為這個欄位的值。

    下列建構步驟會建構映像檔 myimage,並使用修訂版本的簡短版本標記該映像檔。建構步驟會使用預設替換值,針對專案 ID、存放區名稱和 SHA 簡短值進行替換,因此這些值會在建構期間自動替換。

    # Docker Build
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t', 
             'us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}', '.']
  5. 將容器推送至 Artifact Registry:您可以將已建構的容器儲存在 Artifact Registry 中。Artifact Registry 是 Google Cloud 服務,可用於儲存、管理及保護建構構件。如要執行這項操作,您必須在 Artifact Registry 中擁有現有的 Docker 存放區。如要設定 Cloud Build 將映像檔儲存在 Artifact Registry Docker 存放區中,請新增含有下列欄位的建構步驟:

    • name:將這個欄位的值設為 gcr.io/cloud-builders/docker,即可為工作使用官方 docker 建構工具映像檔。
    • args:將 docker push 指令的引數新增為此欄位的值。針對目的地網址,請輸入要儲存映像檔的 Artifact Registry Docker 存放區。

    下列建構步驟會將您在上一個步驟中建構的映像檔推送至 Artifact Registry:

    # Docker push to Google Artifact Registry
    - name: 'gcr.io/cloud-builders/docker'
      args: ['push',  'us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}']

    選用:如要讓 Cloud Build 產生軟體構件供應鏈級別 (SLSA) 建構來源資訊,請完成下列步驟:

  6. 將容器部署至 Cloud Run:如要在 Cloud Run 上部署映像檔,請新增含有下列欄位的建構步驟:

    • name:將這個欄位的值設為 google/cloud-sdk,即可使用 gcloud CLI 映像檔來叫用 gcloud 指令,在 Cloud Run 上部署映像檔。
    • args:將 gcloud run deploy 指令的引數新增為這個欄位的值。

    以下建構步驟會將先前建構的映像檔部署至 Cloud Run:

    # Deploy to Cloud Run
    - name: google/cloud-sdk
      args: ['gcloud', 'run', 'deploy', 'helloworld-${SHORT_SHA}', 
             '--image=us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}', 
             '--region', 'us-central1', '--platform', 'managed', 
             '--allow-unauthenticated']
  7. 將測試記錄儲存至 Cloud Storage:您可以指定現有的值區位置和測試記錄路徑,設定 Cloud Build 將任何測試記錄儲存在 Cloud Storage 中。以下建構步驟會將您儲存在 JUNIT XML 檔案中的測試記錄儲存至 Cloud Storage 值區:

    # Save test logs to Google Cloud Storage
    artifacts:
      objects:
        location: gs://${_BUCKET_NAME}/
        paths:
          - ${SHORT_SHA}_test_log.xml

    以下程式碼片段顯示完整的建構設定檔,其中包含上述所有步驟:

    steps:
      # Install dependencies
      - name: python
        entrypoint: pip
        args: ["install", "-r", "requirements.txt", "--user"]
    
      # Run unit tests
      - name: python
        entrypoint: python
        args: ["-m", "pytest", "--junitxml=${SHORT_SHA}_test_log.xml"] 
    
      # Docker Build
      - name: 'gcr.io/cloud-builders/docker'
        args: ['build', '-t', 
               'us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}', '.']
    
      # Docker push to Google Artifact Registry
      - name: 'gcr.io/cloud-builders/docker'
        args: ['push',  'us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}']
    
      # Deploy to Cloud Run
      - name: google/cloud-sdk
        args: ['gcloud', 'run', 'deploy', 'helloworld-${SHORT_SHA}', 
               '--image=us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}', 
               '--region', 'us-central1', '--platform', 'managed', 
               '--allow-unauthenticated']
    
    # Save test logs to Google Cloud Storage
    artifacts:
      objects:
        location: gs://${_BUCKET_NAME}/
        paths:
          - ${SHORT_SHA}_test_log.xml
    # Store images in Google Artifact Registry 
    images:
      - us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}
  8. 啟動建構作業手動使用建構觸發條件

    建構作業完成後,您可以在 Artifact Registry 中查看存放區詳細資料

    您也可以查看建構來源資訊中繼資料驗證來源資訊

後續步驟