Merilis dengan Cloud Deploy

1. Tujuan

Dalam tutorial ini, Anda akan membuat tiga cluster GKE bernama pratinjau, canary, dan produksi. Kemudian, buat target Cloud Deploy yang sesuai dengan setiap cluster dan pipeline Cloud Deploy yang akan menentukan urutan langkah untuk melakukan deployment di target tersebut.

Alur deployment akan dipicu oleh pipeline cloudbuild yang akan membuat rilis Cloud Deploy dan melakukan deployment di cluster pratinjau. Setelah memverifikasi bahwa deployment dalam pratinjau berhasil dan berfungsi seperti yang diharapkan, Anda akan mempromosikan rilis secara manual di cluster canary. Promosi rilis di cluster produksi akan memerlukan persetujuan. Anda akan menyetujui pipeline produksi di UI Cloud Deploy dan akhirnya mempromosikannya.

Tujuan tutorial ini dapat dibagi menjadi langkah-langkah berikut:

  • Menyiapkan ruang kerja
  • Menentukan target Cloud Deploy
  • Menentukan pipeline Cloud Deploy
  • Membuat Rilis
  • Mempromosikan deployment
  • Menyetujui rilis produksi

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nama project adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API, dan Anda dapat memperbaruinya kapan saja.
  • Project ID harus unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis menghasilkan string unik; biasanya Anda tidak peduli dengan kata-katanya. Pada sebagian besar codelab, Anda harus mereferensikan Project ID (dan biasanya diidentifikasi sebagai PROJECT_ID). Jadi, jika Anda tidak menyukainya, buat ID acak lain, atau, Anda dapat mencoba sendiri dan melihat apakah tersedia. Kemudian file akan "dibekukan" setelah project dibuat.
  • Ada nilai ketiga, Nomor Project yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan API/resource Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Untuk menonaktifkan resource agar tidak menimbulkan penagihan di luar tutorial ini, ikuti petunjuk "pembersihan" yang ada di akhir codelab. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

2. Penyiapan Platform

Menyiapkan ruang kerja

Kita akan menyiapkan lingkungan yang diperlukan untuk menjalankan tutorial ini. Setelah langkah ini selesai, kita akan memiliki cluster GKE yang dibuat tempat kita dapat menjalankan deployment.

  1. Menetapkan setelan default konfigurasi gcloud

gcloud config set project <your project>

gcloud config set deploy/region us-central1

  1. Clone Repo

git clone https://github.com/gushob21/software-delivery-workshop

cd software-delivery-workshop/labs/cloud-deploy/

cloudshell workspace .

rm -rf deploy && mkdir deploy

  1. Menetapkan variabel lingkungan

export PROJECT_ID=$(gcloud config get-value project)

export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")

  1. Aktifkan API

gcloud services enable \

cloudresourcemanager.googleapis.com \

    `container.googleapis.com \`

    `cloudbuild.googleapis.com \`

    `containerregistry.googleapis.com \`

    `secretmanager.googleapis.com \`

    `clouddeploy.googleapis.com` 
  1. Membuat cluster GKE
     `gcloud container clusters create preview \`
    

--zone=us-central1-a --async

    `gcloud container clusters create canary \`

--zone=us-central1-b --async

    `gcloud container clusters create prod \`

--zone=us-central1-c

Menentukan Target Cloud Deploy

  1. Buat file di direktori deployment bernama preview.yaml dengan perintah berikut di cloudshell:

cat <<EOF >deploy/preview.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: preview

annotations: {}

labels: {}

description: Target for preview environment

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-a/clusters/preview

EOF

    As you noticed, the "kind" tag is "Target". It allows us to add some metadata to the target, a description and finally the GKE cluster where the deployment is supposed to happen for this target.
  1. Buat file di direktori deployment bernama canary.yaml dengan perintah berikut di cloudshell:

cat <<EOF >deploy/canary.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: canary

annotations: {}

labels: {}

description: Target for canary environment

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-b/clusters/canary

EOF

  1. Buat file di direktori deploy bernama prod.yaml dengan perintah berikut di cloudshell:

cat <<EOF >deploy/prod.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: prod

annotations: {}

labels: {}

description: Target for prod environment

requireApproval: true

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-c/clusters/prod

EOF

Perhatikan tag requireApproval yang disetel ke true. Hal ini tidak akan mengizinkan promosi ke target produksi hingga persetujuan diberikan. Anda memerlukan peran roles/clouddeploy.approver untuk menyetujui rilis.

  1. Membuat Target Deployment
         `gcloud config set deploy/region us-central1` 
    

gcloud beta deploy apply --file deploy/preview.yaml

gcloud beta deploy apply --file deploy/canary.yaml

gcloud beta deploy apply --file deploy/prod.yaml

3. Pembuatan Aplikasi

Sebagai bagian dari pembuatan aplikasi baru, pipeline CICD biasanya disiapkan untuk melakukan build otomatis, pengujian integrasi, dan deployment. Langkah-langkah berikut dianggap sebagai bagian dari proses penyiapan untuk aplikasi baru. Setiap aplikasi baru akan memiliki pipeline deployment yang dikonfigurasi.

Menentukan pipeline Cloud Deploy

  1. Buat file di direktori deployment bernama pipeline.yaml dengan perintah berikut di cloudshell:

cat <<EOF >>deploy/pipeline.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: DeliveryPipeline

metadata:

name: sample-app

labels:

`app: sample-app`

description: delivery pipeline

serialPipeline:

stages:

- targetId: preview

`profiles:`

`- preview`

- targetId: canary

`profiles:`

`- canary`

- targetId: prod

`profiles:`

`- prod`

EOF

    As you noticed, the "kind" tag is "DeliveryPipeline". It lets you define the metadata for the pipeline, a description and an order of deployment into various targets via serialPipeline tag.

Tag serialPipeline berisi tag bernama stages yang merupakan daftar semua target tempat pipeline pengiriman ini dikonfigurasi untuk di-deploy.

targetId mengidentifikasi target spesifik yang akan digunakan untuk tahap pipeline pengiriman ini. Nilainya adalah properti metadata.name dari definisi target.

profiles adalah daftar nama profil Skaffold nol atau lebih, dari skaffold.yaml. Cloud Deploy menggunakan profil dengan rendering skaffold saat membuat rilis.

  1. Terapkan Pipeline

gcloud beta deploy apply --file deploy/pipeline.yaml

4. Fase Pengembangan

Saat aplikasi dikembangkan, toolchain CICD otomatis akan mem-build dan menyimpan aset. Perintah berikut dijalankan untuk mem-build aplikasi menggunakan skaffold dan menyimpan aset untuk deployment dengan Cloud Deploy. Langkah ini akan dilakukan oleh proses CICD Anda untuk setiap build aplikasi.

  1. Mem-build dan menyimpan aplikasi dengan skaffold

skaffold build \

--file-output=artifacts.json \

--default-repo gcr.io/$PROJECT_ID \

--push=true

5. Fase Rilis

Di akhir proses CICD, biasanya saat kode diberi Tag untuk produksi, Anda akan memulai proses rilis dengan memanggil perintah cloud deploy release. Kemudian, setelah deployment divalidasi dan disetujui, Anda akan memindahkan rilis melalui berbagai lingkungan target dengan mempromosikan dan menyetujui tindakan melalui proses otomatis atau persetujuan manual.

Membuat rilis

Kita telah membuat file Cloud Deploy di tutorial ini sebelumnya untuk mendapatkan pemahaman tentang cara kerja Cloud Deploy. Untuk tujuan demo, kami telah membuat file Cloud Deploy yang sama dan mendorongnya ke repo github dengan aplikasi go contoh dan kami akan menggunakan Cloud Deploy untuk melakukan rilis aplikasi tersebut.

export REL_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')

gcloud beta deploy releases create \

sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--description="Release demo" \

--build-artifacts=artifacts.json \

--annotations="release-id=rel-${REL_TIMESTAMP}"

Meninjau rilis

Saat rilis Cloud Deploy dibuat, rilis tersebut akan otomatis diluncurkan di target pertama yang merupakan pratinjau.

  1. Buka <Cloud Deploy> di konsol Google Cloud
  2. Klik "sample-app"

Di layar ini, Anda akan melihat representasi grafis pipeline.

  1. Konfirmasi garis batas hijau di sisi kiri kotak pratinjau yang berarti rilis telah di-deploy ke lingkungan tersebut.
  2. Tinjau detail tambahan tentang rilis secara opsional dengan mengklik nama rilis di bagian Detail Rilis di bagian bawah layar
  3. Pastikan rilis berhasil men-deploy aplikasi, jalankan perintah berikut di cloudshell

gcloud container clusters get-credentials preview --zone us-central1-a && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. Klik ikon pratinjau web di kanan atas layar.
  2. Pilih Pratinjau di port 8080

Tindakan ini akan mengarahkan Anda ke halaman baru yang menampilkan pesan "Hello World!"

  1. Gunakan ctrl+c di terminal untuk mengakhiri penerusan port.

Mempromosikan rilis

Setelah rilis di-deploy ke target pertama (pratinjau) dalam pipeline, Anda dapat mempromosikannya ke target berikutnya (canary). Jalankan perintah berikut untuk memulai prosesnya.

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

Meninjau promosi rilis

  1. Buka pipeline aplikasi contoh di konsol Google Cloud
  2. Pastikan ada garis batas hijau di sisi kiri kotak Canary yang berarti rilis telah di-deploy ke lingkungan tersebut.
  3. Verifikasi bahwa aplikasi di-deploy dengan benar dengan membuat tunnel ke aplikasi tersebut

gcloud container clusters get-credentials canary --zone us-central1-b && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. Klik ikon pratinjau web di kanan atas layar.
  2. Pilih Pratinjau di port 8080

Tindakan ini akan mengarahkan Anda ke halaman baru yang menampilkan pesan "Hello World!"

  1. Gunakan ctrl+c di terminal untuk mengakhiri penerusan port.

Menyetujui rilis produksi

Ingat saat membuat target produksi melalui prod.yaml, kita menentukan tag requireApproval sebagai true. Tindakan ini akan memaksa persyaratan persetujuan untuk promosi dalam produksi.

  1. Promosikan rilis canary ke produksi dengan perintah berikut

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

  1. Buka pipeline aplikasi contoh di konsol Google Cloud
  2. Perhatikan indikator kuning yang mencantumkan "1 tertunda".

Pesan ini menunjukkan bahwa ada rilis yang diantrekan untuk di-deploy ke produksi, tetapi memerlukan peninjauan dan persetujuan.

  1. Klik tombol "Tinjau" tepat di bawah pemberitahuan kuning.
  2. Di layar berikutnya, klik "Tinjau" lagi untuk mengakses layar persetujuan produksi
  3. Jika ingin, tinjau Perbedaan Manifes untuk meninjau perubahan. Dalam hal ini, file baru.
  4. Klik tombol "Setujui"
  5. Kembali ke halaman pipeline aplikasi contoh tempat Anda akan melihat rilis ke produksi yang sedang berlangsung.

Meninjau rilis produksi

Seperti lingkungan lainnya, Anda dapat meninjau deployment setelah selesai menggunakan langkah-langkah di bawah.

  1. Jalankan perintah berikut di cloudshell untuk membuat port-forward

gcloud container clusters get-credentials prod --zone us-central1-c && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. Klik ikon pratinjau web di kanan atas layar.
  2. Pilih Pratinjau di port 8080

Tindakan ini akan mengarahkan Anda ke halaman baru yang menampilkan pesan "Hello World!"

  1. Gunakan ctrl+c di terminal untuk mengakhiri penerusan port.