Merilis dengan Cloud Deploy

1. Tujuan

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

Alur deployment akan dipicu oleh pipeline cloudbuild yang akan membuat rilis Cloud Deploy dan melakukan deployment di cluster pratinjau. Setelah memastikan 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 harus menyetujui pipeline produksi di UI Cloud Deploy, dan pada akhirnya mempromosikannya.

Tujuan tutorial ini dapat dibagi menjadi langkah-langkah berikut:

  • Menyiapkan ruang kerja Anda
  • 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 Anda

Kita akan menyiapkan lingkungan di sini sesuai kebutuhan untuk menjalankan tutorial ini. Setelah langkah ini selesai, kita akan membuat cluster GKE tempat deployment dapat dijalankan.

  1. Menetapkan default konfigurasi gcloud

gcloud config set project <your project>

gcloud config set deploy/region us-central1

  1. Meng-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 deploy 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 deploy 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 requiredApproval yang ditetapkan ke true. Hal ini tidak akan mengizinkan promosi ke target produk hingga persetujuan diberikan. Anda memerlukan peran Role/clouddeploy.agreementr untuk menyetujui rilis.

  1. Membuat Target Deploy
         `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 telah dikonfigurasi.

Menentukan pipeline Cloud Deploy

  1. Buat file di direktori deploy 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 stage yang merupakan daftar semua target tempat pipeline pengiriman ini dikonfigurasi untuk di-deploy.

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

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

  1. Menerapkan Pipeline

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

4. Fase Pengembangan

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

  1. Membangun 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. Setelah deployment divalidasi dan disetujui, Anda akan memindahkan rilis ke 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 agar dapat memahami cara kerja Cloud Deploy. Untuk tujuan demo, kami telah membuat file Cloud Deploy yang sama dan memasukkannya ke repositori github dengan contoh aplikasi go dan kami akan menggunakan Cloud Deploy untuk merilis 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}"

Tinjau rilis

Saat dibuat, rilis Cloud Deploy akan otomatis diluncurkan di target pertama yang sedang dipratinjau.

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

Di layar ini, Anda akan melihat representasi grafis pipeline Anda.

  1. Pastikan garis batas hijau di sisi kiri kotak pratinjau menunjukkan bahwa rilis telah di-deploy ke lingkungan tersebut.
  2. Jika perlu, tinjau detail tambahan tentang rilis dengan mengklik nama rilis di bagian Detail Rilis di bagian bawah layar.
  3. Pastikan rilis berhasil men-deploy aplikasi, jalankan perintah berikut secara tertutup

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 Preview pada port 8080

Tindakan ini akan membawa Anda ke halaman baru yang menampilkan pesan "Hello World!" (Halo Dunia)

  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 proses.

gcloud beta deploy releases promote \

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

--delivery-pipeline=sample-app \

--quiet

Meninjau promosi rilis

  1. Buka pipeline sample-app di Konsol Google Cloud
  2. Konfirmasi garis batas hijau di sisi kiri kotak Canary yang berarti bahwa rilis telah di-deploy ke lingkungan tersebut.
  3. Memverifikasi bahwa aplikasi telah 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 Preview pada port 8080

Tindakan ini akan membawa Anda ke halaman baru yang menampilkan pesan "Hello World!" (Halo Dunia)

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

Menyetujui rilis produksi

Ingat, saat membuat target prod melalui prod.yaml, kami menentukan bahwa tag requireApproval sebagai true. Hal ini akan memaksa persyaratan persetujuan untuk promosi di produksi.

  1. Promosikan rilis terbatas ke produksi dengan perintah berikut

gcloud beta deploy releases promote \

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

--delivery-pipeline=sample-app \

--quiet

  1. Buka pipeline sample-app di Konsol Google Cloud
  2. Perhatikan indikator kuning yang menunjukkan "1 tertunda".

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

  1. Klik "Tinjau" tepat di bawah pemberitahuan berwarna kuning.
  2. Pada layar berikutnya, klik "Tinjau" lagi untuk mengakses layar persetujuan untuk produksi
  3. Jika perlu, tinjau Perbedaan Manifes untuk meninjau perubahan. Dalam hal ini adalah file yang sama sekali baru.
  4. Klik "Setujui" tombol
  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 saat 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 Preview pada port 8080

Tindakan ini akan membawa Anda ke halaman baru yang menampilkan pesan "Hello World!" (Halo Dunia)

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