Mengimplementasikan deployment canary Cloud Run dengan cabang Git dan Cloud Build

Last reviewed 2023-05-26 UTC

Dokumen ini menunjukkan cara mengimplementasikan pipeline deployment untuk Cloud Run yang menerapkan progres kode dari cabang developer ke produksi dengan pengujian canary otomatis dan pengelolaan traffic berbasis persentase. Dokumen ini ditujukan bagi administrator platform yang bertanggung jawab untuk membuat dan mengelola pipeline CI/CD. Dokumen ini mengasumsikan bahwa Anda memiliki pemahaman dasar tentang konsep Git, Cloud Run, dan pipeline CI/CD.

Dengan Cloud Run, Anda dapat men-deploy dan menjalankan aplikasi dengan sedikit biaya tambahan atau upaya. Banyak organisasi menggunakan pipeline rilis yang kuat untuk memindahkan kode ke dalam produksi. Cloud Run menyediakan kemampuan pengelolaan traffic unik yang memungkinkan Anda menerapkan teknik pengelolaan rilis lanjutan dengan sedikit upaya.

Tujuan

  • Membuat layanan Cloud Run
  • Mengaktifkan cabang developer
  • Mengimplementasikan pengujian canary
  • Meluncurkan produk ke produksi dengan aman

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Sebelum memulai

  1. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  2. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  3. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

Mempersiapkan lingkungan Anda

  1. Di Cloud Shell, buat variabel lingkungan untuk digunakan dalam tutorial ini:

    export PROJECT_ID=$(gcloud config get-value project)
    export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
    
  2. Mengaktifkan API berikut:

    • Resource Manager
    • GKE
    • Cloud Build
    • Container Registry
    • Cloud Run
    gcloud services enable \
        cloudresourcemanager.googleapis.com \
        container.googleapis.com \
        secretmanager.googleapis.com \
        cloudbuild.googleapis.com \
        containerregistry.googleapis.com \
        run.googleapis.com
    
  3. Memberikan peran Cloud Run Admin (roles/run.admin) ke akun layanan Cloud Build

    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member=serviceAccount:[email protected] \
      --role=roles/run.admin
    
  4. Memberikan peran Pengguna Akun Layanan IAM (roles/iam.serviceAccountUser) ke akun layanan Cloud Build untuk akun layanan runtime Cloud Run

    gcloud iam service-accounts add-iam-policy-binding \
    [email protected] \
      --member=serviceAccount:[email protected] \
      --role=roles/iam.serviceAccountUser
    

Menetapkan nilai Git

Jika sebelumnya Anda belum pernah menggunakan Git di Cloud Shell, tetapkan nilai user.name dan user.email yang ingin Anda gunakan:

    git config --global user.email YOUR_EMAIL_ADDRESS
    git config --global user.name YOUR_USERNAME
    git config --global credential.helper store
  • YOUR_EMAIL_ADDRESS: Email yang digunakan dengan akun GitHub Anda
  • YOUR_USERNAME: ID pengguna GitHub Anda

Jika Anda menggunakan MFA dengan GitHub, buat token akses pribadi dan gunakan sebagai sandi saat berinteraksi dengan GitHub melalui command line.

Simpan ID pengguna GitHub Anda dalam variabel lingkungan untuk memudahkan akses:

export GH_USER=YOUR_GITHUB_ID

Melakukan fork repositori project

Untuk membuat versi repositori lab Anda yang dapat ditulis sendiri, lakukan fork repositori contoh ke akun GitHub Anda melalui UI GitHub.

Gandakan repositori sampel

Clone dan siapkan repositori sampel:

git clone https://github.com/$GH_USER/software-delivery-workshop.git cloudrun-progression

cd cloudrun-progression/labs/cloudrun-progression

Hubungkan repositori Git Anda.

Dengan Cloud Build, Anda dapat membuat dan mengelola koneksi ke repositori kode sumber menggunakan Konsol Google Cloud. Anda dapat membuat dan mengelola koneksi menggunakan repositori Cloud Build generasi pertama atau kedua. Tutorial ini menggunakan repositori Cloud Build generasi kedua.

Berikan izin yang diperlukan

Untuk menghubungkan host GitHub, berikan peran Cloud Build Connection Admin (roles/cloudbuild.connectionAdmin) ke akun pengguna Anda:

PN=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")
CLOUD_BUILD_SERVICE_AGENT="service-${PN}@gcp-sa-cloudbuild.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
 --member="serviceAccount:${CLOUD_BUILD_SERVICE_AGENT}" \
 --role="roles/secretmanager.admin"

Membuat koneksi host

  1. Konfigurasikan koneksi repositori Cloud Build:

    gcloud alpha builds connections create github $GH_USER --region=us-central1
    
  2. Klik link yang diberikan di output dan ikuti petunjuk di layar untuk menyelesaikan koneksi.

  3. Verifikasi penginstalan koneksi GitHub Anda:

    gcloud alpha builds connections describe $GH_USER --region=us-central1
    

Dengan menggunakan koneksi host yang baru saja Anda konfigurasikan, tautkan contoh repositori yang Anda fork:

 gcloud alpha builds repositories create cloudrun-progression \
     --remote-uri=https://github.com/$GH_USER/software-delivery-workshop.git \
     --connection=$GH_USER \
     --region=us-central1

Menetapkan variabel nama repositori

Simpan nama repositori untuk digunakan nanti:

export REPO_NAME=projects/$PROJECT_ID/locations/us-central1/connections/$GH_USER/repositories/cloudrun-progression

Men-deploy layanan Cloud Run

Di bagian ini, Anda akan mem-build dan men-deploy aplikasi produksi awal yang digunakan selama tutorial ini.

Men-deploy layanan

  • Di Cloud Shell, build dan deploy aplikasi, termasuk layanan yang memerlukan autentikasi. Untuk membuat layanan masyarakat, gunakan flag --allow-unauthenticated.

        gcloud builds submit --tag gcr.io/$PROJECT_ID/hello-cloudrun
    
        gcloud run deploy hello-cloudrun \
          --image gcr.io/$PROJECT_ID/hello-cloudrun \
          --platform managed \
          --region us-central1 \
          --tag=prod -q
    

    Outputnya akan terlihat seperti berikut:

    Deploying container to Cloud Run service [hello-cloudrun] in project [sdw-mvp6] region [us-central1]
    ✓ Deploying new service... Done.
      ✓ Creating Revision...
      ✓ Routing traffic...
    Done.
    Service [hello-cloudrun] revision [hello-cloudrun-00001-tar] has been deployed and is serving 100 percent of traffic.
    Service URL: https://hello-cloudrun-apwaaxltma-uc.a.run.app
    The revision can be reached directly at https://prod---hello-cloudrun-apwaaxltma-uc.a.run.app
    

Output-nya mencakup URL layanan dan URL unik untuk revisi. Nilai Anda akan sedikit berbeda dari yang ditunjukkan di sini.

Memvalidasi deployment

  1. Setelah deployment selesai, lihat layanan yang baru di-deploy di halaman Revisi di Konsol Cloud.

  2. Di Cloud Shell, lihat respons layanan terautentikasi:

    PROD_URL=$(gcloud run services describe hello-cloudrun --platform managed --region us-central1 --format=json | jq --raw-output ".status.url")
    
    echo $PROD_URL
    
    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $PROD_URL
    

Mengaktifkan Deployment Cabang

Di bagian ini, Anda akan mengaktifkan URL unik untuk cabang pengembangan di Git.

Siapkan Pemicu Cabang

Setiap cabang ditunjukkan oleh URL yang diidentifikasi oleh nama cabang. Commit ke cabang memicu deployment, dan update dapat diakses di URL yang sama.

  1. Di Cloud Shell, siapkan pemicu:

    gcloud alpha builds triggers create github \
    --name=branchtrigger \
    --repository=$REPO_NAME \
    --branch-pattern='[^(?!.*main)].*' \
    --build-config=labs/cloudrun-progression/branch-cloudbuild.yaml \
    --region=us-central1
    
  2. Untuk meninjau pemicu, buka halaman Pemicu Cloud Build di Konsol Cloud.

Membuat perubahan pada cabang

  1. Di Cloud Shell, buat cabang baru:

    git checkout -b new-feature-1
    
  2. Buka aplikasi contoh menggunakan editor favorit Anda atau menggunakan Cloud Shell IDE:

    edit app.py
    
  3. Dalam aplikasi contoh, ubah baris 24 untuk menunjukkan v1.1, bukan v1.0:

    @app.route('/')
    
    def hello_world():
        return 'Hello World v1.1'
    
    
  4. Untuk kembali ke terminal, klik Buka Terminal.

Menjalankan pemicu cabang

  1. Di Cloud Shell, commit perubahan dan kirim ke repositori jarak jauh:

    git add . && git commit -m "updated" && git push origin new-feature-1
    
  2. Untuk meninjau build yang sedang berlangsung, buka layar histori Build Cloud Build.

  3. Untuk meninjau revisi baru, setelah build selesai, buka halaman Cloud Run Revisions di Konsol Cloud:

  4. Di Cloud Shell, dapatkan URL unik untuk cabang ini:

    BRANCH_URL=$(gcloud run services describe hello-cloudrun --platform managed --region us-central1 --format=json | jq --raw-output ".status.traffic[] | select (.tag==\"new-feature-1\")|.url")
    
    echo $BRANCH_URL
    
  5. Akses URL yang diautentikasi:

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $BRANCH_URL
    

    Output respons yang diperbarui akan terlihat seperti berikut:

    Hello World v1.1
    

Mengotomatiskan pengujian canary

Saat kode dirilis ke produksi, biasanya kode dirilis ke sebagian kecil traffic live sebelum memigrasikan semua traffic ke code base baru.

Di bagian ini, Anda akan menerapkan pemicu yang diaktifkan saat kode di-commit ke cabang utama. Pemicu men-deploy kode ke URL canary unik dan mengarahkan 10% dari semua traffic live ke revisi baru.

  1. Di Cloud Shell, siapkan pemicu cabang:

    gcloud alpha builds triggers create github \
      --name=maintrigger \
      --repository=$REPO_NAME \
      --branch-pattern=main \
      --build-config=labs/cloudrun-progression/main-cloudbuild.yaml \
      --region=us-central1
    
  2. Untuk meninjau pemicu baru, buka halaman Pemicu Cloud Build di Konsol Cloud.

  3. Di Cloud Shell, gabungkan cabang ke baris utama dan kirim ke repositori jarak jauh:

    git checkout main
    git merge new-feature-1
    git push origin main
    
  4. Untuk meninjau build yang sedang diproses, buka halaman Builds Cloud Build.

  5. Setelah build selesai, buka halaman Revisi Cloud Run di Konsol Cloud untuk meninjau revisi baru. Perhatikan bahwa 90% traffic dialihkan ke produksi, 10% ke canary, dan 0% ke revisi cabang.

Tinjau baris kunci main-cloudbuild.yaml yang mengimplementasikan logika untuk deployment canary.

Baris 39-45 men-deploy revisi baru dan menggunakan tanda tag untuk mengarahkan traffic dari URL canary unik:

gcloud run deploy ${_SERVICE_NAME} \
--platform managed \
--region ${_REGION} \
--image gcr.io/${PROJECT_ID}/${_SERVICE_NAME} \
--tag=canary \
--no-traffic

Baris 61 menambahkan tag statis ke revisi yang mencatat SHA singkat Git deployment:

gcloud beta run services update-traffic ${_SERVICE_NAME} --update-tags=sha-$SHORT_SHA=$${CANARY} --platform managed --region ${_REGION}

Baris 62 memperbarui traffic untuk merutekan 90% ke produksi dan 10% ke canary:

gcloud run services update-traffic ${_SERVICE_NAME} --to-revisions=$${PROD}=90,$${CANARY}=10 --platform managed --region ${_REGION}
  1. Di Cloud Shell, dapatkan URL unik untuk revisi canary:

    CANARY_URL=$(gcloud run services describe hello-cloudrun --platform managed --region us-central1 --format=json | jq --raw-output ".status.traffic[] | select (.tag==\"canary\")|.url")
    
    echo $CANARY_URL
    
  2. Tinjau endpoint canary secara langsung:

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $CANARY_URL
    
  3. Untuk melihat respons berbasis persentase, buat serangkaian permintaan:

    LIVE_URL=$(gcloud run services describe hello-cloudrun --platform managed --region us-central1 --format=json | jq --raw-output ".status.url")
    for i in {0..20};do
      curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $LIVE_URL; echo \n
    done
    

Merilis ke Produksi

Setelah deployment canary divalidasi dengan sebagian kecil traffic, Anda akan merilis deployment ke seluruh traffic live lainnya.

Di bagian ini, Anda akan menyiapkan pemicu yang diaktifkan saat membuat tag di repositori. Pemicu memigrasikan 100% traffic ke revisi yang sudah di-deploy berdasarkan commit SHA tag. Menggunakan commit SHA memastikan revisi yang divalidasi dengan traffic canary adalah revisi yang digunakan untuk sisa traffic produksi.

  1. Di Cloud Shell, siapkan pemicu tag:

    gcloud alpha builds triggers create github \
      --name=tagtrigger \
      --repository=$REPO_NAME \
      --tag-pattern=. \
      --build-config=labs/cloudrun-progression/tag-cloudbuild.yaml \
      --region=us-central1
    
  2. Untuk meninjau pemicu baru, buka halaman Pemicu Cloud Build di Konsol Cloud.

  3. Di Cloud Shell, buat tag baru dan kirim ke repositori jarak jauh:

    git tag 1.1
    git push origin 1.1
    
  4. Untuk meninjau build yang sedang berjalan, buka layar histori Build Cloud Build di Konsol Cloud.

  5. Setelah build selesai, buka halaman Revisi Cloud Run di Konsol Cloud untuk meninjau revisi baru. Perhatikan bahwa revisi diperbarui untuk menunjukkan tag produksi dan menayangkan 100% traffic langsung.

  6. Di Cloud Shell, untuk melihat respons berbasis persentase, buat serangkaian permintaan:

    LIVE_URL=$(gCloud Run services describe hello-cloudrun --platform managed --region us-central1 --format=json | jq --raw-output ".status.url")
    
    for i in {0..20};do
      curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $LIVE_URL; echo \n
    done
    
  7. Tinjau baris utama tag-cloudbuild.yaml yang menerapkan logika deployment produksi.

    Baris 37 memperbarui revisi canary dengan menambahkan tag produksi. Revisi yang di-deploy kini diberi tag untuk produksi dan canary:

    gcloud beta run services update-traffic ${_SERVICE_NAME} --update-tags=prod=$${CANARY} --platform managed --region ${_REGION}
    

    Baris 39 memperbarui traffic untuk URL layanan dasar untuk mengarahkan 100% traffic ke revisi yang diberi tag sebagai produksi:

    gcloud run services update-traffic ${_SERVICE_NAME} --to-revisions=$${NEW_PROD}=100 --platform managed --region ${_REGION}
    

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Langkah selanjutnya