DevOps di Google Cloud (Part 1): Continuous Integration dan Continuous Deployment
Halo semua
Kini ritme pengembangan aplikasi melesat jauh lebih cepat. Beberapa tahun lalu developer merilis versi aplikasi baru dalam hitungan tahun atau beberapa bulan. Kini sebuah aplikasi bisa punya versi baru dalam hitungan minggu bahkan hari.
š» Mulai Belajar Pemrograman
Belajar pemrograman di Dicoding Academy dan mulai perjalanan Anda sebagai developer profesional.
Daftar SekarangSebelumnya, proses development (code, build, test) dan operations (deploy, operate, monitor) dijalankan secara terpisah. Sekarang praktik seperti ini sudah mulai ditinggalkan karena kedua proses ini bisa dijalankan secara berkelanjutan dengan apa yang kita kenal sebagai DevOps.
Nah, pada tulisan kali ini, kita akan mempelajari tentang dua contoh praktik DevOps, yaitu Continuous Integration (CI) dan Continuous Deployment (CD).
Continuous Integration atau integrasi berkelanjutan adalah salah satu praktik dari DevOps di mana kita sebagai developer bisa mengintegrasikan kode ke dalam repositori kode seperti GitHub dan menjalankan pengujian secara cepat dan otomatis.
Sedangkan Continuous Deployment atau penyebaran berkelanjutan merupakan praktik setelah kode berhasil terintegrasi, aplikasi kita bisa dibangun lalu rilis secara otomatis.
Nah di implementasi CI/CD kali ini kita akan menggunakan layanan dari Google Cloud. Semua layanan yang akan kita gunakan pun bersifat serverless alias kita tidak perlu menyediakan dan mengkonfigurasi server.
Untuk mengikuti tutorial ini, kita perlu menyiapkan beberapa hal berikut:
- Akun Google Cloud Platform,
- Node.js dan npm,
- git.
Menyiapkan project
- Pertama buat sebuah direktori baru kemudian lakukan inisialisasi project node.js.
1npm init
Kita bisa membiarkan isian tetap default atau kosong. - Selanjutnya tambahkan dependency library yang akan digunakan.
1npm install express --save - Buat berkas baru index.js. Lalu tambahkan kode berikut:
12345678910111213const express = require('express')const app = express()app.get('/', (req, res) => {res.send('<h1>Hello World!</h1>')})const PORT = process.env.PORT || 8080app.listen(PORT, () => {console.log(`Server is up and listening at port: ${PORT}`)})module.exports = app - Buka berkas package.json lalu tambahkan kode berikut pada object scripts:
123"scripts": {"start": "node index.js"}, - Jalankan perintah npm start pada terminal untuk menjalankan aplikasi secara lokal. Buka web browser lalu buka tautanĀ http://localhost:8080/.
- Karena kita ingin men-deploy aplikasi pada Google App Engine, maka kita perlu menyiapkan project pada Google Cloud Platform dan juga instance App Engine.Kalau belum punya, silakan buat baru ya
- Buat berkas app.yaml. Berkas ini akan berisi konfigurasi aplikasi yang akan dijalankan pada App Engine. Tambahkan baris kode berikut karena kita akan menggunakan runtime environment dari node.js.
1runtime: nodejs10 - Jalankan perintah berikut pada terminal untuk men-deploy aplikasi ke dalam App Engine:
1gcloud app deploy - Coba jalankan aplikasi yang telah di-deploy ke App Engine dengan membuka tautanĀ https://[PROJECT-ID].appspot.comĀ pada browser.
DevOps in Action: Membuat CI/CD Pipeline
Jika aplikasi sudah berjalan, selanjutnya kita akan mulai menerapkan CI/CD, di mana kita akan menunggah kode kita ke dalam repository GitHub, lalu setiap ada kode baru yang di-push, aplikasi akan menjalankan testing kemudian melakukan deploy aplikasi secara otomatis. Pipeline CI/CD yang akan kita buat kira-kira akan seperti ini:
- Pertama hubungkan project dengan GitHub. Jangan lupa untuk push kodenya ke dalam branch master.
- Karena kita akan melakukan pengujian aplikasi, maka kita perlu menambahkan library untuk testing.
1npm install mocha chai chai-http --save - Lalu buat berkas baru bernama test.js dan tambahkan skenario pengujian yang akan dijalankan.
1234567891011121314151617const chai = require('chai')const chaiHttp = require('chai-http')const app = require('./index')chai.use(chaiHttp)chai.should()describe('Simple test', () => {it('GET / should return 200', (done) => {chai.request(app).get('/').end((err, res) => {res.should.have.status(200)done()})})})
Pada kode di atas kita melakukan sebuah pengujian sederhana. Ketika endpoint ā/ā diakses, aplikasi akan memberikan response code 200. - Buka berkas package.json lalu tambahkan kode berikut ke dalam json object scripts:
1234"scripts": {"start": "node index.js","test": "mocha --exit"}, - Jalankan perintah berikut pada terminal untuk pengujian:
1npm run test
Hasil pengujian akan ditampilkan pada terminal.
123456Server is up and listening at port: 8080Simple testā GET / should return 2001 passing (27ms) - Selanjutnya, buat berkas baru bernama cloudbuild.yaml. Pada berkas inilah kita akan menentukan langkah apa saja yang akan dijalankan ketika proses build.
- Tambahkan tiga langkah berikut:
12345678910steps:# Instalasi dependencies- name: 'gcr.io/cloud-builders/npm'args: ['install']# Menjalankan pengujian- name: 'gcr.io/cloud-builders/npm'args: ['run', 'test']# Deploy aplikasi ke App Engine- name: 'gcr.io/cloud-builders/gcloud'args: ['app', 'deploy']
Kode di atas berarti Cloud Build akan menginstal library lalu menjalankan pengujian sebelum men-deploy ke App Engine. - Lakukan push kembali ke GitHub.
- Selanjutnya buka GCP console (https://console.cloud.google.com), lalu buka halaman Cloud Build (Navigation Menu -> Tools -> Cloud Build). Jika baru pertama kali membuka, enable APIĀ dulu ya.
- Buka halaman Triggers lalu klik Add trigger. Di sinilah kita akan melakukan konfigurasi untuk men-trigger Cloud Build.
- Pilih GitHub (atau code repository yang kalian gunakan). Lalu centang persetujuan dan klik Continue.
- Setelah proses autentikasi, pilih repository yang telah dibuat tadi. Klik Continue.
- Selanjutnya berikan nama trigger dan deskripsinya. Tentukan juga branch mana yang akan menjadi trigger ketika ada push. Pada bagian Build configuration, pilih Cloud Build configuration file dan arahkan ke berkas cloudbuild.yaml yang telah kita buat.
Pengaturan trigger kurang lebih akan seperti berikut:
- Jika sudah, klik Create trigger.
- Sampai di sini kita telah mengatur cloud build dan trigger. Mari kita kembali ke editor untuk mengubah kode. Buka berkas index.js lalu ubah ya. Kamu bisa mengubah tampilan pesan jadi Hello Dicoding!.
1res.send('<h1>Hello Dicoding!</h1>') - Simpan perubahan, lalu lakukan commit dan push kode ke GitHub.
- Ketika kode berhasil di-push, buka kembali halaman Cloud Build pada GCP console. Kamu akan melihat ada satu proses build yang sedang berjalan.
- Pilih proses tersebut untuk melihat detailnya. Pada halaman detail kamu dapat melihat proses build yang sedang dijalankan hingga log dari masing-masing step.
- Namun, step terakhir dari build akan mengalami kegagalan (step deploy). Ini disebabkan karena proses deployment dilakukan oleh Cloud Build, sementara Cloud Build tidak memiliki hak akses atau izin untuk men-deploy aplikasi ke App Engine.
- Untuk itu, kita perlu menambahkan permission kepada service account dari Cloud Build untuk melakukan deploy aplikasi. Buka halaman IAM (Navigation menu -> IAM & Admin).
- Pada daftar member, cari [PROJECT-NUMBER]@cloudbuild.gserviceaccount.com.
- Klik ikon pensil, lalu tambahkan role App Engine Admin. Klik Save.
DevOps
- Buka kembali halaman Cloud Build, lalu pilih build yang sebelumnya gagal. Klik Retry.
- Kali ini proses build seharusnya sudah berhasil. Jalankan aplikasi pada web browser, maka tampilan aplikasi akan berubah.
- Selamat! Kamu telah berhasil telah menerapkan continuous integration dan continuous deployment. Kamu pun bisaĀ menguji dan deploy aplikasi secara otomatis hanya dengan melakukan push ke repositori kode.
Oke, mungkin sekian dulu tulisan kali ini.
Ingin Belajar Lebih Lanjut?
Semoga ada pelajaran yang bisa diambil. Untuk kalian yang ingin belajar lebih dalam tentang produk dan layanan dari Google Cloud, yuk daftar kelas Menjadi Google Cloud Engineer.
Ada pertanyaan? Baca beberapa referensi berikut ini:
- https://cloud.google.com/cloud-build/
- https://cloud.google.com/serverless/
- https://www.youtube.com/watch?v=yP9a5gDRUqY
- https://www.youtube.com/watch?v=OxJ-zBjVhIM
- https://github.com/LittleFireflies/GAE-CI-CD
Boleh juga loh, tanya di kolom komentar. Sampai bertemu di tulisan berikutnya.
DevOps di Google Cloud (Part 1): Continuous Integration dan Continuous Deployment-end