Deployment & Continuous Integration
Dalam PPL Salemba, kami mengembangkan sebuah aplikasi menggunakan react js. Supaya aplikasi yang kami buat bisa diakses melalui internet, kita perlu membahas bagaimana aplikasi ini di-deploy. Di kelompok kami, proses deployment dilakukan dengan pendekatan serverless melalui gitlab ci dan docker.
Sebelum itu, saya akan membahas terlebih dahulu apa itu docker.
Docker merupakan salah satu teknologi yang sangat membantu proses pengembangan software dari design, development, sampai production. Docker menjadi sangat penting dalam proses ini karena dengan beberapa baris instruksi (tergantung kebutuhan), file konfigurasi dari Docker tersebut dapat digunakan di semua komputer yang sudah menginstall Docker.
Docker memiliki beberapa komponen, dua di antaranya yang mendasar adalah image dan container. Perumpamaan terhadap kedua hal ini mirip dengan class dan object. Dalam hal ini, docker container berperan sebagai class dan docker image berperan sebagai object yang dibuat oleh class tersebut. Image merupakan sebuah rancangan container yang dapat dibuat menggunakan file konfigurasi yang biasa disebut Dockerfile. Kemudian, docker image ini akan dibuat instansiasinya yang berbentuk container. Dockerfile adalah sebuah file yang menetukan langkah-langkah yang diperlukan dalam pembuatan sebuah Docker Image.
Selain itu, kita tidak perlu membuat sebuah image dari awal. Kita bisa pull image yang sudah dibuat orang lain melalui docker registry. Hal ini bisa menghemat banyaknya konfigurasi yang perlu kita lakukan untuk aplikasi kita. Sebagai contoh, berdasarkan gambar di atas, potongan kode tersebut melakukan pull image ‘node’ sehingga kita bisa melakukan command seperti “npm install” dan perintah lain yang berhubungan dengan NodeJS dan NPM tanpa harus menginstall keduanya terlebih dahulu pada image yang dibuat. Salah satu docker registry yang terkenal adalah https://hub.docker.com/
Berikutnya, saya akan membahas lebih lanjut proses deployment.
Continuous Integration
Continuous Integration merupakan proses integrasi kode yang sudah dibuat pada shared repository secara otomatis yang bertujuan untuk mendeteksi error sehingga dapat segera dilakukan perbaikan.
Berdasarkan gambar di atas, urutan tahapan integrasi yang dilakukan adalah melakukan testing pada backend, frontend, serta proses deployment. Kode ini terletak pada file .gitlab-ci.yml.
Testing
Untuk proses testing, kelompok kami menggunakan library coverage. Coverage ini berperan memberikan informasi bagian kode mana saja yang sudah di test dan mana yang belum, serta memberikan persentase baris kode yang sudah dieksekusi ketika proses testing dilaksanakan.
Continuous Deployment
Continous deployment merupakan proses deploy secara otomatis pada product environment. Apabila program terbaru sudah lulus semua testing, program tersebut langsung bisa disajikan pada product environment
Ada 2 tahapan pada continuous deployment, yaitu packaging dan deploy
Packaging
Pada tahap packaging, program/aplikasi di-build dengan menggunakan docker menjadi docker image yang nantinya akan di push ke docker registry PPL 2019 di https://registry.docker.ppl.cs.ui.ac.id.
Setelah dilakukan packaging, docker image yang sudah dipush harus di pull secara manual melalui interface Portainer PPL 2019 yaitu https://portainer.docker.ppl.cs.ui.ac.id. Hal ini dilakukan karena tidak dapat dilakukan proses pull image secara otomatis karena keterbatasan penggunaan portainer.
Deployment
Dalam melakukan deployment, kita bisa melakukan 2 macam bentuk, yaitu deployment melalui environment staging dan environment development. Hal ini tergantung di mana proses CI/CD dilakukan. Jika CI/CD dilakukan pada branch dev, maka proses deployment dilakukan melalui branch tsb, begitu juga dengan stagging. Dalam pengimplementasian di kelompok kami, kami hanya mengizinkan proses deployment melalui branch stagging
Deploy & Orchestration
Karena kami tidak menggunakan portainer, maka flow deployment sedikit berbeda. Pertama, branch stagging di-update pada gitlab melalui proses push,. lalu akan dijalankan gitlab ci.yml dan pada akhirnya image berhasil di-build, kemudian image yang sudah di-build akan di-push ke AWS Serverless (untuk backend) atau AWS S3 (untuk frontend). AWS Serverless ini lah yang digunakan untuk menjalankan backend.
Bagaimana cara menghubungkan frontend dengan backend? Dengan pendekatan serverless, kita memiliki akses ke API yang dimiliki oleh AWS. Pertama ada command yang disebut dengan await untuk mengambil data secara asynchronous. Lalu, ada command fetch yang digunakan untuk mengambil data berdasarkan URL, bisa juga untuk mengakses Database (kami menggunakan dynamoDB)