建構及測試 Python 應用程式

本頁說明如何設定 Cloud Build,以建構及測試 Python 應用程式、將成果上傳至 Artifact Registry、產生出處資訊,以及將測試記錄儲存在 Cloud Storage 中。

Cloud Build 可讓您使用任何開放給大眾使用的容器映像檔執行工作。Docker Hub 的公開python 映像檔已預先安裝 pythonpip 工具。您可以設定 Cloud Build 使用這些工具來安裝依附元件、建構及執行單元測試。

事前準備

本頁的操作說明假設您熟悉 Python。此外:

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

    Enable the APIs

  • 如要在本頁面執行 gcloud 指令,請安裝 Google Cloud CLI
  • 準備好 Python 專案。
  • 在 Artifact Registry 中建立 Python 存放區。如果沒有,請建立新的存放區
  • 如要在 Cloud Storage 中儲存測試記錄,請在 Cloud Storage 中建立值區

必要 IAM 權限

  • 如要在 Cloud Logging 中儲存測試記錄,請將 Cloud Storage bucket 的「Storage 物件建立者 (roles/storage.objectCreator)」角色授予建構服務帳戶。

  • 如要在 Artifact Registry 中儲存建構的映像檔,請將Artifact Registry 寫入者 (roles/artifactregistry.writer) 角色授予建構服務帳戶。

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

設定 Python 建構作業

本節將逐步說明 Python 應用程式的建構設定檔範例。這個檔案包含管理安裝需求、新增單元測試的建構步驟,以及測試通過後建構及部署應用程式的步驟。

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

  2. 安裝必要條件:Docker Hub 的 python 映像檔已預先安裝 pip。如要從 pip 安裝依附元件,請新增建構步驟,並填入下列欄位:

    • name:將這個欄位的值設為 pythonpython:<tag>,即可使用 Docker Hub 的 Python 映像檔執行這項工作。如要查看其他 Python 映像檔的可用標記清單,請參閱 Docker Hub 中 Python 映像檔的參考資料
    • entrypoint:設定這個欄位會覆寫 name 中參照的預設映像檔進入點。將這個欄位的值設為 pip,即可將 pip 叫用為建構步驟的進入點,並執行 pip 指令。
    • args:建構步驟的 args 欄位會取得引數清單,並將其傳送至 name 欄位參照的映像檔。在這個欄位中傳遞引數,即可執行 pip install 指令。pip install 指令中的 --user 標記可確保後續的建構步驟能存取這個建構步驟中安裝的模組。

    下列建構步驟會新增引數,以安裝必要條件:

     steps:
        - name: 'python'
          entrypoint: 'python'
          args: ['-m', 'pip', 'install', '--upgrade', 'pip']
        - name: python
          entrypoint: python
          args: ['-m', 'pip', 'install', 'build', 'pytest', 'Flask', '--user']
    
  3. 新增單元測試:如果您已使用 pytest 等測試架構在應用程式中定義單元測試,可以透過在建構步驟中新增下列欄位,設定 Cloud Build 執行測試:

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

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

        - name: 'python'
          entrypoint: 'python'
          args: ['-m', 'pytest', '--junitxml=${SHORT_SHA}_test_log.xml']
    
  4. 建構:在建構設定檔中,定義建構工具和 args,以建構應用程式:

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

    下列建構步驟會啟動建構作業:

        - name: 'python'
          entrypoint: 'python'
          args: ['-m', 'build']
    
  5. 上傳至 Artifact Registry

    在設定檔中新增 pythonPackages 欄位,並在 Artifact Registry 中指定 Python 存放區:

        artifacts:
           pythonPackages:
           - repository: 'https://LOCATION-python.pkg.dev/PROJECT-ID/REPOSITORY'
              paths: ['dist/*']
    

    替換下列值:

    • PROJECT-ID 是包含 Artifact Registry 存放區的 Google Cloud 專案 ID。
    • REPOSITORY 是存放區的 ID。
    • LOCATION 是存放區的區域或多區域位置
  6. 選用:啟用出處生成功能

    Cloud Build 可產生可驗證的軟體構件供應鏈級別 (SLSA) 建構出處中繼資料,有助於保護持續整合管道。

    如要啟用出處生成功能,請在設定檔的 options 區段中新增 requestedVerifyOption: VERIFIED

  7. 將測試記錄儲存至 Cloud Storage:您可以指定現有值區位置和測試記錄路徑,設定 Cloud Build 將所有測試記錄儲存至 Cloud Storage。下列建構步驟會將您儲存在 JUNIT XML 檔案中的測試記錄,儲存至 Cloud Storage bucket:

        artifacts:
        objects:
           location: 'gs://${_BUCKET_NAME}/'
           paths:
              - '${SHORT_SHA}_test_log.xml'
    
  8. 啟動建構作業手動使用建構觸發條件

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

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

後續步驟