Membangun, menguji, dan menyimpan aplikasi Python dalam container

Halaman ini menjelaskan cara mengonfigurasi Cloud Build untuk mem-build, menguji, membuat container, dan men-deploy aplikasi Python.

Cloud Build memungkinkan Anda menggunakan image container yang tersedia secara publik untuk menjalankan tugas pengembangan, termasuk mem-build, menguji, membuat container, mengupload ke Artifact Registry, men-deploy, dan menyimpan log build. Image python publik dari Docker Hub sudah diinstal sebelumnya dengan python dan pip alat. Anda dapat mengonfigurasi Cloud Build untuk menggunakan alat ini guna menginstal dependensi, mem-build, dan menjalankan pengujian unit menggunakan alat ini.

Sebelum memulai

Petunjuk di halaman ini mengasumsikan bahwa Anda sudah memahami Python. Selain itu:

  • Aktifkan Cloud Build, Cloud Run, Cloud Storage, dan Artifact Registry API.

    Peran yang diperlukan untuk mengaktifkan API

    Untuk mengaktifkan API, Anda memerlukan izin serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Admin Penggunaan Layanan (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran.

    Aktifkan API

  • Untuk menjalankan perintah gcloud di halaman ini, instal Google Cloud CLI.
  • Siapkan project Python Anda, termasuk file requirements.txt. Anda memerlukan Dockerfile bersama dengan kode sumber.
  • Jika ingin menyimpan container yang di-build di Artifact Registry, buat repositori Docker di Artifact Registry.
  • Jika ingin menyimpan log pengujian di Cloud Storage, buat bucket di Cloud Storage.

Izin IAM yang diperlukan

Untuk mengetahui petunjuk tentang cara memberikan peran ini, lihat Memberikan peran menggunakan halaman IAM.

Mengonfigurasi build Python

Bagian ini membahas contoh file konfigurasi build untuk aplikasi Python. File ini memiliki langkah-langkah build untuk menginstal persyaratan, menambahkan pengujian unit, dan setelah pengujian lulus, mem-build, dan men-deploy aplikasi.

  1. Di direktori utama project Anda, buat file konfigurasi Cloud Build bernama cloudbuild.yaml.

  2. Menginstal persyaratan: Image python dari Docker Hub sudah diinstal sebelumnya dengan pip. Untuk menginstal dependensi dari pip, tambahkan langkah build dengan kolom berikut:

    • name: Tetapkan nilai kolom ini ke python untuk menggunakan image python dari Docker Hub untuk tugas ini.
    • entrypoint: Menetapkan kolom ini akan mengganti titik entri default image yang direferensikan di name. Tetapkan nilai kolom ini ke pip untuk memanggil pip sebagai titik entri langkah build dan menjalankan perintah pip.
    • args: Kolom args dari langkah build mengambil daftar argumen dan meneruskannya ke image yang direferensikan oleh kolom name. Teruskan argumen untuk menjalankan perintah pip install di kolom ini. Flag --user dalam perintah pip install memastikan bahwa langkah-langkah build berikutnya dapat mengakses modul yang diinstal dalam langkah build ini.

    Langkah build berikut menambahkan argumen untuk menginstal persyaratan dari file requirements.txt:

    steps:
      # Install dependencies
      - name: python
        entrypoint: pip
        args: ["install", "-r", "requirements.txt", "--user"]
  3. Menambahkan pengujian unit: Jika telah menentukan pengujian unit di aplikasi menggunakan framework pengujian seperti pytest, Anda dapat mengonfigurasi Cloud Build untuk menjalankan pengujian dengan menambahkan kolom berikut dalam langkah build:

    • name: Tetapkan nilai kolom ini ke python untuk menggunakan image python dari Docker Hub untuk tugas Anda.
    • entrypoint: Tetapkan nilai kolom ini ke python untuk menjalankan perintah python.
    • args: Tambahkan argumen untuk menjalankan perintah python pytest.

    Langkah build berikut menyimpan output log pytest ke file JUNIT XML. Nama file ini dibuat menggunakan versi singkat ID commit yang terkait dengan build Anda. Langkah build berikutnya akan menyimpan log dalam file ini ke Cloud Storage.

    # Run unit tests
    - name: python
      entrypoint: python
      args: ["-m", "pytest", "--junitxml=${SHORT_SHA}_test_log.xml"] 
  4. Membuat container aplikasi: Setelah menambahkan langkah build untuk memastikan pengujian telah lulus, Anda dapat mem-build aplikasi. Cloud Build menyediakan image Docker yang telah di-build sebelumnya yang dapat Anda gunakan untuk membuat container aplikasi Python. Untuk membuat container aplikasi, tambahkan kolom berikut dalam langkah build:

    • name: Tetapkan nilai kolom ini ke gcr.io/cloud-builders/docker untuk menggunakan image docker yang telah di-build sebelumnya untuk tugas Anda.
    • args: Tambahkan argumen untuk perintah docker build sebagai nilai untuk kolom ini.

    Langkah build berikut mem-build image myimage dan menandainya dengan versi singkat ID commit Anda. Langkah build menggunakan penggantian default untuk ID project, nama repositori, dan nilai SHA singkat sehingga nilai ini otomatis diganti pada waktu build.

    # 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. Mengirim container ke Artifact Registry: Anda dapat menyimpan container yang di-build di Artifact Registry, yang merupakan Google Cloud layanan yang dapat Anda gunakan untuk menyimpan, mengelola, dan mengamankan artefak build. Untuk melakukannya, Anda harus memiliki repositori Docker yang ada di Artifact Registry. Untuk mengonfigurasi Cloud Build agar menyimpan image di repositori Docker Artifact Registry, tambahkan langkah build dengan kolom berikut:

    • name: Tetapkan nilai kolom ini ke gcr.io/cloud-builders/docker untuk menggunakan image builder docker resmi untuk tugas Anda.
    • args: Tambahkan argumen untuk perintah docker push sebagai nilai kolom ini. Untuk URL tujuan, masukkan repositori Docker Artifact Registry tempat Anda ingin menyimpan image.

    Langkah build berikut mengirim image yang Anda buat pada langkah sebelumnya ke 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}']

    Opsional: Jika Anda ingin Cloud Build membuat informasi asal build Supply-chain Levels for Software Artifacts (SLSA), selesaikan langkah-langkah berikut:

  6. Men-deploy container ke Cloud Run: Untuk men-deploy image di Cloud Run, tambahkan langkah build dengan kolom berikut:

    • name: Tetapkan nilai kolom ini ke google/cloud-sdk untuk menggunakan image gcloud CLI guna memanggil perintah gcloud untuk men-deploy image di Cloud Run.
    • args: Tambahkan argumen untuk perintah gcloud run deploy sebagai nilai kolom ini.

    Langkah build berikut men-deploy image yang di-build sebelumnya ke 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. Menyimpan log pengujian ke Cloud Storage: Anda dapat mengonfigurasi Cloud Build untuk menyimpan log pengujian apa pun di Cloud Storage dengan menentukan lokasi bucket dan jalur yang ada ke log pengujian. Langkah build berikut menyimpan log pengujian yang Anda simpan dalam file JUNIT XML ke bucket Cloud Storage:

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

    Cuplikan berikut menunjukkan file konfigurasi build lengkap untuk semua langkah yang dijelaskan di atas:

    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. Mulai build: secara manual atau menggunakan pemicu build.

    Setelah build selesai, Anda dapat melihat detail repositori di Artifact Registry.

    Anda juga dapat melihat metadata asal build dan memvalidasi asal.

Langkah berikutnya