Halaman ini menjelaskan cara membuat pipeline continuous integration dan continuous deployment (CI/CD) di Google Cloud hanya menggunakan produk yang dihosting dan metodologi GitOps yang populer.
Engineer Google telah menyimpan file konfigurasi dan deployment di repositori kode sumber utama kami selama bertahun-tahun. Metodologi ini dijelaskan dalam buku Site Reliability Engineering, Chapter 8 (Beyer dkk., 2016), dan telah ditunjukkan oleh Kelsey Hightower selama presentasi utama Google Cloud Next '17.
Bagian penting dari GitOps adalah ide tentang "environments-as-code": mendeskripsikan deployment secara deklaratif menggunakan file (misalnya, manifes Kubernetes) yang disimpan di repositori Git.
Dalam tutorial ini, Anda akan membuat pipeline CI/CD yang otomatis membangun image container dari kode yang di-commit, menyimpan image di Artifact Registry, dan memperbarui manifes Kubernetes di file repositori Git, serta men-deploy aplikasi ke Google Kubernetes Engine (GKE) menggunakan manifes tersebut.
Tutorial ini menggunakan dua repositori Git:
- repositori aplikasi: berisi kode sumber dari aplikasi itu sendiri
- repositori env: berisi manifes untuk Deployment Kubernetes
Saat Anda mengirim perubahan ke repositori app, pipeline Cloud Build akan menjalankan pengujian, mem-build image container, dan mengirimnya ke Artifact Registry. Setelah mengirim image, Cloud Build akan memperbarui manifes Deployment dan mengirimkannya ke repositori env. Tindakan ini memicu pipeline Cloud Build lain yang menerapkan manifes ke cluster GKE dan, jika berhasil, menyimpan manifes di cabang env lain.
Kami memisahkan repositori app dan env karena keduanya memiliki siklus proses dan penggunaan yang berbeda. Pengguna utama repositori aplikasi adalah manusia dan repositori ini dikhususkan untuk aplikasi tertentu. Pengguna utama repositori env adalah sistem otomatis (seperti Cloud Build), dan repositori ini mungkin digunakan bersama oleh beberapa aplikasi. Repositori env dapat memiliki beberapa cabang yang masing-masing dipetakan ke lingkungan tertentu (Anda hanya menggunakan produksi dalam tutorial ini) dan mereferensikan image container tertentu, sedangkan repositori aplikasi tidak demikian.
Setelah menyelesaikan tutorial ini, Anda memiliki sistem tempat Anda dapat dengan mudah:
- Membedakan antara deployment yang gagal dan berhasil dengan melihat histori Cloud Build,
- Mengakses manifes yang saat ini digunakan dengan melihat cabang production dari repositori env,
- Melakukan rollback ke versi sebelumnya dengan mengeksekusi kembali build Cloud Build yang sesuai.
Tentang tutorial ini
Tutorial ini menggunakan Cloud Source Repositories untuk menghosting repositori Git, tetapi Anda dapat mendapatkan hasil yang sama dengan produk pihak ketiga lainnya seperti GitHub, Bitbucket, atau GitLab.
Pipeline ini tidak menerapkan mekanisme validasi sebelum deployment. Jika menggunakan GitHub, Bitbucket, atau GitLab, Anda dapat mengubah pipeline untuk menggunakan Permintaan Pull untuk tujuan ini.
Meskipun kami merekomendasikan Spinnaker kepada tim yang ingin menerapkan pola deployment tingkat lanjut (biru/hijau, analisis canary, multi-cloud, dll.), set fiturnya mungkin tidak diperlukan untuk keberhasilan strategi CI/CD bagi organisasi dan project yang lebih kecil. Dalam tutorial ini, Anda akan mempelajari cara membuat pipeline CI/CD yang sesuai untuk aplikasi yang dihosting di GKE dengan alat.
Untuk memudahkan, tutorial ini menggunakan satu lingkungan—produksi—di repositori env, tetapi Anda dapat memperluasnya untuk men-deploy ke beberapa lingkungan jika diperlukan.
Tujuan
- Membuat repositori Git di Cloud Source Repositories.
- Membuat image container dengan Cloud Build dan menyimpannya di Artifact Registry.
- Buat pipeline CI.
- Membuat pipeline CD.
- Uji pipeline CI/CD.
Biaya
Dalam dokumen ini, Anda akan menggunakan komponen Google Cloud yang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.
Sebelum memulai
Pilih atau buat project Google Cloud.
Aktifkan penagihan untuk project Anda.
Buka Cloud Shell untuk mengeksekusi perintah yang tercantum dalam tutorial ini. Cloud Shell adalah lingkungan shell interaktif untuk Google Cloud yang dapat Anda gunakan untuk mengelola project dan resource dari browser web.
Jika perintah
gcloud config get-value project
tidak menampilkan ID project yang Anda pilih, konfigurasikan Cloud Shell agar menggunakan project Anda.gcloud config set project [PROJECT_ID]
Di Cloud Shell, aktifkan API yang diperlukan.
gcloud services enable container.googleapis.com \ cloudbuild.googleapis.com \ sourcerepo.googleapis.com \ artifactregistry.googleapis.com
Buat repositori Docker Artifact Registry yang bernama
my-repository
di regionus-central1
untuk menyimpan image container Anda.gcloud artifacts repositories create my-repository \ --repository-format=docker \ --location=us-central1
Di Cloud Shell, buat cluster GKE yang akan Anda gunakan untuk men-deploy aplikasi sampel tutorial ini.
Autopilot
Buat cluster Autopilot bernama
hello-cloudbuild
:gcloud container clusters create-auto hello-cloudbuild \ --region us-central1
Standar
Buat cluster Standard satu node bernama
hello-cloudbuild
:gcloud container clusters create hello-cloudbuild \ --num-nodes 1 --region us-central1
Jika Anda belum pernah menggunakan Git di Cloud Shell, konfigurasikan dengan nama dan alamat email Anda. Git akan menggunakannya untuk mengidentifikasi Anda sebagai penulis commit yang akan Anda buat di Cloud Shell.
git config --global user.email "YOUR_EMAIL_ADDRESS" git config --global user.name "YOUR_NAME"
Setelah menyelesaikan tutorial ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Lihat Pembersihan untuk mengetahui detail selengkapnya.
Membuat repositori Git di Cloud Source Repositories
Di bagian ini, Anda akan membuat dua repositori Git (aplikasi dan env) yang digunakan dalam tutorial ini, dan melakukan inisialisasi pada aplikasi dengan beberapa kode contoh.
Di Cloud Shell, buat dua repositori Git.
gcloud source repos create hello-cloudbuild-app gcloud source repos create hello-cloudbuild-env
Clone kode contoh dari GitHub.
cd ~ git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd ~/kubernetes-engine-samples/management/gitops-style-delivery/
Konfigurasikan Cloud Source Repositories sebagai jarak jauh.
PROJECT_ID=$(gcloud config get-value project) git remote add google \ "https://source.developers.google.com/p/${PROJECT_ID}/r/hello-cloudbuild-app"
Kode yang Anda clone berisi aplikasi "Halo Dunia".
Membuat image container dengan Cloud Build
Kode yang Anda clone berisi Dockerfile berikut.
Dengan Dockerfile ini, Anda dapat membuat image container dengan Cloud Build dan menyimpannya di Artifact Registry.
Di Cloud Shell, buat build Cloud Build berdasarkan commit terbaru dengan perintah berikut.
cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ COMMIT_ID="$(git rev-parse --short=7 HEAD)" gcloud builds submit --tag="us-central1-docker.pkg.dev/${PROJECT_ID}/my-repository/hello-cloudbuild:${COMMIT_ID}" .
Cloud Build mengalirkan log yang dihasilkan oleh pembuatan image container ke terminal saat Anda mengeksekusi perintah ini.
Setelah build selesai, pastikan image container baru Anda tersedia di Artifact Registry.
Membuat pipeline continuous integration
Di bagian ini, Anda akan mengonfigurasi Cloud Build untuk otomatis menjalankan pengujian unit kecil, membangun image container, lalu mengirimnya ke Artifact Registry. Mengirim commit baru ke Cloud Source Repositories akan otomatis memicu pipeline ini. File cloudbuild.yaml
yang disertakan dalam kode adalah konfigurasi pipeline.
Buka halaman Pemicu Cloud Build.
Klik Create trigger.
Isi opsi berikut:
- Di kolom Nama, ketik
hello-cloudbuild
. - Di bagian Peristiwa, pilih Kirim ke cabang.
- Di bagian Sumber, pilih
hello-cloudbuild-app
sebagai Repositori dan^master$
sebagai Cabang. - Di bagian Konfigurasi build, pilih File konfigurasi Cloud Build.
- Di kolom Lokasi file konfigurasi Cloud Build, ketik
cloudbuild.yaml
setelah/
.
- Di kolom Nama, ketik
Klik Buat untuk menyimpan pemicu build Anda.
Tips: Jika perlu membuat Pemicu Build untuk banyak project, Anda dapat menggunakan Build Triggers API.
Di Cloud Shell, kirim kode aplikasi ke Cloud Source Repositories untuk memicu pipeline CI di Cloud Build.
cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ git push google master
Buka konsol Cloud Build.
Build yang baru saja Anda jalankan dan selesaikan akan muncul. Anda dapat mengklik build untuk mengikuti eksekusinya dan memeriksa log-nya.
Membuat pipeline continuous delivery
Cloud Build juga digunakan untuk pipeline continuous delivery. Pipeline dijalankan setiap kali commit dikirim ke cabang candidate dari repositori hello-cloudbuild-env. Pipeline menerapkan versi baru manifes ke cluster Kubernetes dan, jika berhasil, menyalin manifes ke cabang produksi. Proses ini memiliki properti berikut:
- Cabang kandidat adalah histori upaya deployment.
- Cabang produksi adalah histori deployment yang berhasil.
- Anda dapat melihat deployment yang berhasil dan gagal di Cloud Build.
- Anda dapat melakukan rollback ke deployment sebelumnya dengan mengeksekusi ulang build yang sesuai di Cloud Build. Rollback juga memperbarui cabang produksi agar mencerminkan histori deployment secara akurat.
Anda akan memodifikasi pipeline continuous integration untuk memperbarui cabang kandidat dari repositori hello-cloudbuild-env, yang memicu pipeline continuous delivery.
Memberikan akses Cloud Build ke GKE
Untuk men-deploy aplikasi di cluster Kubernetes, Cloud Build memerlukan Peran Identity and Access Management Developer Kubernetes Engine.
Shell
Di Cloud Shell, jalankan perintah berikut:
PROJECT_NUMBER="$(gcloud projects describe ${PROJECT_ID} --format='get(projectNumber)')" gcloud projects add-iam-policy-binding ${PROJECT_NUMBER} \ --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role=roles/container.developer
Konsol
Di Konsol Google Cloud, buka halaman Setelan Cloud Build:
Halaman Izin akun layanan akan muncul:
Tetapkan status peran Developer Kubernetes Engine ke Aktifkan.
Melakukan inisialisasi repositori hello-cloudbuild-env
Anda harus melakukan inisialisasi repositori hello-cloudbuild-env dengan dua cabang (produksi dan kandidat) serta file konfigurasi Cloud Build yang menjelaskan proses deployment.
Di Cloud Shell, clone repositori hello-cloudbuild-env dan buat cabang produksi.
cd ~ gcloud source repos clone hello-cloudbuild-env cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ git checkout -b production
Salin file
cloudbuild-delivery.yaml
yang tersedia di repositori hello-cloudbuild-app dan lakukan commit pada perubahan tersebut.cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ cp ~/hello-cloudbuild-app/cloudbuild-delivery.yaml ~/kubernetes-engine-samples/management/gitops-style-delivery/cloudbuild.yaml git add . git commit -m "Create cloudbuild.yaml for deployment"
File
cloudbuild-delivery.yaml
menjelaskan proses deployment yang akan dijalankan di Cloud Build. Proses ini memiliki dua langkah:Cloud Build menerapkan manifes di cluster GKE.
Jika berhasil, Cloud Build akan menyalin manifes di cabang produksi.
Buat cabang kandidat dan kirimkan kedua cabang agar tersedia di Cloud Source Repositories.
git checkout -b candidate git push origin production git push origin candidate
Berikan peran Source Repository Writer IAM ke akun layanan Cloud Build untuk repositori hello-cloudbuild-env.
PROJECT_NUMBER="$(gcloud projects describe ${PROJECT_ID} \ --format='get(projectNumber)')" cat >/tmp/hello-cloudbuild-env-policy.yaml <<EOF bindings: - members: - serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com role: roles/source.writer EOF gcloud source repos set-iam-policy \ hello-cloudbuild-env /tmp/hello-cloudbuild-env-policy.yaml
Membuat pemicu untuk pipeline continuous delivery
Di bagian ini, Anda akan mengonfigurasi Cloud Build agar dipicu oleh pengiriman ke cabang kandidat dari repositori hello-cloudbuild-env.
Buka halaman Pemicu di Cloud Build.
Klik Create trigger.
Isi opsi berikut:
- Di kolom Nama, ketik
hello-cloudbuild-deploy
. - Di bagian Peristiwa, pilih Kirim ke cabang.
- Di bagian Sumber, pilih
hello-cloudbuild-env
sebagai Repositori dan^candidate$
sebagai Cabang. - Di bagian Konfigurasi, pilih File konfigurasi Cloud Build (yaml atau json).
- Di kolom Lokasi file konfigurasi Cloud Build, ketik
cloudbuild.yaml
setelah/
.
- Di kolom Nama, ketik
Klik Buat.
Mengubah pipeline continuous integration untuk memicu pipeline continuous delivery
Di bagian ini, Anda akan menambahkan beberapa langkah ke pipeline continuous integration yang menghasilkan versi baru manifes Kubernetes dan mengirimkannya ke repositori hello-cloudbuild-env untuk memicu pipeline continuous integration.
Ganti file
cloudbuild.yaml
dengan contoh yang diperluas dalam filecloudbuild-trigger-cd.yaml
.cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ cp cloudbuild-trigger-cd.yaml cloudbuild.yaml
cloudbuild-trigger-cd.yaml
adalah versi yang diperluas dari filecloudbuild.yaml
. Ini menambahkan langkah-langkah untuk membuat manifes Kubernetes baru dan memicu pipeline continuous delivery.Lakukan commit pada modifikasi dan kirimkan ke Cloud Source Repositories.
cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ git add cloudbuild.yaml git commit -m "Trigger CD pipeline" git push google master
Tindakan ini akan memicu pipeline continuous integration di Cloud Build.
Periksa build continuous integration.
Build yang baru saja Anda jalankan dan selesaikan untuk repositori hello-cloudbuild-app akan muncul. Anda dapat mengklik build untuk mengikuti eksekusinya dan memeriksa log-nya. Langkah terakhir dari pipeline ini mengirim manifes baru ke repositori hello-cloudbuild-env, yang memicu pipeline continuous delivery.
Periksa build continuous delivery.
Build yang baru saja Anda jalankan dan selesaikan untuk repositori hello-cloudbuild-env akan muncul. Anda dapat mengklik build untuk mengikuti eksekusi dan memeriksa log-nya.
Menguji pipeline yang lengkap
Pipeline CI/CD lengkap kini dikonfigurasi. Di bagian ini, Anda akan mengujinya secara keseluruhan.
Buka halaman Layanan GKE.
Buka Layanan Google Kubernetes Engine
Daftar ini berisi satu layanan bernama hello-cloudbuild yang dibuat oleh build continuous delivery yang baru saja diselesaikan.
Klik endpoint untuk layanan hello-cloudbuild. "Hello World!" akan muncul. Jika tidak ada endpoint, atau jika terjadi error load balancer, Anda mungkin harus menunggu beberapa menit hingga load balancer benar-benar dimulai. Klik Refresh untuk memperbarui halaman jika diperlukan.
Di Cloud Shell, ganti "Halo Dunia" dengan "Hello Cloud Build", baik di aplikasi maupun di pengujian unit.
cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ sed -i 's/Hello World/Hello Cloud Build/g' app.py sed -i 's/Hello World/Hello Cloud Build/g' test_app.py
Lakukan commit pada perubahan tersebut dan kirim ke Cloud Source Repositories.
git add app.py test_app.py git commit -m "Hello Cloud Build" git push google master
Tindakan ini akan memicu pipeline CI/CD yang lengkap.
Setelah beberapa menit, muat ulang aplikasi di browser. "Hello Cloud Build!" akan muncul.
Menguji rollback
Di bagian ini, Anda akan melakukan rollback ke versi aplikasi yang bertuliskan "Halo Dunia!".
Buka konsol Cloud Build untuk repositori hello-cloudbuild-env.
Klik pada build yang kedua paling baru yang tersedia.
Klik Bangun ulang.
Setelah build selesai, muat ulang aplikasi di browser. "Halo Dunia!" akan muncul lagi.
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.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Menghapus resource
Jika ingin menyimpan project Google Cloud yang digunakan dalam tutorial ini, hapus setiap resource:
Hapus repositori Git lokal.
cd ~ rm -rf ~/hello-cloudbuild-app rm -rf ~/hello-cloudbuild-env
Hapus repositori Git di Cloud Source Repositories.
gcloud source repos delete hello-cloudbuild-app --quiet gcloud source repos delete hello-cloudbuild-env --quiet
Hapus Pemicu Cloud Build.
Buka halaman Pemicu di Cloud Build.
Untuk setiap pemicu, klik Lainnya more_vert, lalu Hapus.
Hapus repositori Docker di Artifact Registry.
gcloud artifacts repositories delete my-repository \ --location=us-central1
Hapus izin yang diberikan ke Cloud Build untuk terhubung ke GKE.
PROJECT_NUMBER="$(gcloud projects describe ${PROJECT_ID} \ --format='get(projectNumber)')" gcloud projects remove-iam-policy-binding ${PROJECT_NUMBER} \ --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role=roles/container.developer
Hapus cluster GKE.
gcloud container clusters delete hello-cloudbuild \ --region us-central1
Langkah berikutnya
- Lihat fitur Cloud Build yang lebih canggih: Mengonfigurasi urutan langkah membangun, Membangun, Menguji, dan Men-deploy Artefak, Membuat Langkah Membangun Kustom
- Pelajari cara menduplikasi repositori GitHub atau Bitbucket ke Cloud Source Repositories
- Menghubungkan Cloud Build langsung ke repositori GitHub Anda