GitHub CI / CD Action bersama NodeJS

Gilang Virga Perdana
10 min readAug 5, 2021

--

Halo teman teman, saya Gilang kali ini saya ingin membahas tentang CI / CD atau Continues Integration/Continues Deployment atau yang mempunyai pengertian antara lain sebuah “jembatan” antara tim operasional dan development dengan melakukan automasi pembangunan, testing, dan perilisan aplikasi. CI/CD juga berguna dalam membantu developer dan tester dalam melakukan rilis dan update aplikasi atau software dengan lebih cepat dan aman, terutama karena CI/CD dilakukan dalam ‘environment’ yang terstruktur.

Perlu saya garis bawahi lagi, bahwa tujuan saya disini adalah ingin men-deploy otomatis aplikasi berbasis NodeJS ke VPS atau Linux Server dengan bantuan CI / CD dari Github dengan kata lain setiap ada pembaruan source code, stagging server / production server akan langsung sync dengan source code baru kita secara otomatis saat source code kita diperbaharui di GitHub.

Environment :

1. Visual Studio Code.

2. Linux Server with 1GB RAM (20.04 LTS) with Public IP.

3. GitHub.

4. NodeJS Project.

Dokumentasi :

  1. Buatlah repository pada GitHub

2. Generate project baru Node Js atau kita bisa gunakkan repo yang sudah ada pada github untuk sekedar testing deploy. Repo ada di https://github.com/2pai/ga-ci-cd-nodejs .

Kurang lebih directory yang didapat adalah seperti diatas. Jika kalian ingin menggunakan project sendiri silahkan, disini penulis hanya ingin fokus untuk mendeploy aplikasi menggunakan CI / CD nya saja.

3. Upload ke GitHub Repositori

Inisialisasi project ke github repository yang sudah dibuat, lalu push ke repository tujuan yang sudah dibuat.

$ git add * (untuk inisialisasi github project ke project kita)$ git commit -m “first commit” (untuk menambahkan tag ke semua file yang baru diperbaharui)$ git remote add origin url_repo_kalian (untuk menambah path url repository dengan kata lain file akan di push ke url repository tersebut).

Setelah proses inisialisasi github, silahkan push ke branch master.

$ git push -u origin master (untuk push file ke repository github pada branch master).

Cek pada repository github.

Source code sudah masuk kedalam repository baru kita, sekarang saatnya untuk konfigurasi CI / CD automated build nya.

4. Clone repository ke VPS terlebih dahulu

Pada saat konfigurasi pertama, silahkan untuk cloning terlebih dahulu repository / source code yang ada pada github.

Keterangan:Silahkan SSH ke vps yang kalian miliki, lalu jalankan:$ mkdir apps (membuat direktori baru bernama apps, nama bebas boleh apa saja)$ git clone repository_kalian.com (untuk cloning/download repository kalian dari github ke VPS)

Cek aplikasi sudah terdapat di VPS kita

Terlihat aplikasi NodeJS kita sudah terdapat pada VPS kita. Langkah selanjutnya adalah konfigurasi CI / CD pada github.

5. Konfigurasi Workflow CI pada Github

Setelah kalian melakukan tahapan diatas, silahakan untuk konfigurasi pada Github untuk Workflow atau alur kerja deploy (CI / CD) nya.

a. Pergi ke menu action pada Repository github

b. Lalu set up new workflow

c. Buat CI terlebih dahulu

Pada gambar diatas terlihat kita membuat workflow untuk CI terlebih dahulu untuk NodeJS, dimana CI akan berjalan jika kita men-trigger branch master saat ada pembaharuan source code atau kita re-push ke branch yang sudah kita tentukan (yaitu branch master disini).

Setelah workflow CI terbuat seperti diatas, silahkan commit untuk save workflow tersebut.

Dan terlihat kita sudah membuat workflow untuk CI nya, saatnya kita melakukan percobaan untuk men-trigger CI nya dengan cara pull terlebih dahulu.

Pull ulang repository untuk menambahkan workflow yang sudah kita buat tadi

$ git pull url_repository atau git pull origin master

Setelah pull ulang, mari kita coba untuk men-trigger CI dengan merubah beberapa source code. Disini saya akan merubah endpoint yang ada yaitu menambahkan endpoint /hello untuk menampilkan tulisan ‘Hello, Indonesia !” pada server.test.js

Setelah menambahakan content, kita akan menambahkan endpointnya pada server.js

Setelah melakukan perubahan, push ke github agar kita mengetahui apakah workflow yang kita buat berjalan atau tidak.

Push ke branch lain (disini menggunakan branch ‘hello’, dan lakukan pull request “compare & pull request”.

Compare & pull request lalu create pull request.

Setelah create pull request, akan tampil seperti gambar dibawah ini yang menandakan ini adalah proses pipeline berjalan.

Dan setelah beberapa saat kita menunggu, kita akan mendapatkan info seperti dibawah ini yang menandakan bahwa proses CI akan ter-automasi dimana semua pembaruan code tidak ada yang gagal.

Namun, ini belom memberikkan jawaban pasti apakah benar CI bekerja atau hanya kebetulan? Kita akan mencoba untuk membuat CI menemukkan kesalahan coding dengan merubah sedikit kodingan menjadi salah.

Disini kita akan mencoba mengagalkan aplikasi kita dengan sengaja menuliskan typo pada source code kita. Setelah seperti ini lakukan push dan pull request seperti cara diatas lagi.

Setelah kita push, kita buat kembali pull request.

Create pull request dan ternyata hasilnya adalah

Terlihat bahwa fitur CI mendeteksi bahwa ada sebuah kegagalan pada source code, yang kita bisa lihat detail pada console CI di githubnya seperti gambar dibawah ini:

Terlihat, bahwa error terdeteksi oleh fitur CI, yaitu pada run npm test gagal karena terdeteksi salah. Maka dari itu kita bisa menyimpulkan bahwa fitur CI bekerja. Tidak sampai sini tentunya, karena dokumen ini adalah dokumentasi CI / CD maka kita akan melanjutkan ke tahap CD sekaligus. Adapula untuk CI yang ini akan saya benahi ke settingan awal dimana semua berjalan.

Namun, sampai disini kita sudah bisa memberikan sedikit kesimpulan bahwasannya CI sangat berguna nantinya pada seorang developer untuk mengembangkan suatu aplikasi dengan efisien, mengapa? Karena developer hanya susah diawal, namun pada saat proses pengembangan semua sistem deployment sudah terotomatisasi.

6. Konfigurasi Workflow CD pada Github

Setelah kita konfigurasi fitur CI pada github, kita juga akan melakukan konfigurasi untuk proses deployment nya, yaitu CD pada github.

Sebelum melanjutkan ke proses CD, ada baiknya untuk merge terlebih dahulu brach hello ke branch master agar nanti saat proses deployment versi aplikasi adalah versi terbaru yang kita buat.

Merge pull request dan lanjut ke bagian CD.

a. Buat workflow CD

Konsep CD yang kita akan buat adalah pada saat source code diperbaharui maka CD akan langsung mengirim ke VM/VPS kita. Silahkan membuat actions lagi dan tambahkan script berikut:

Dalam script CD diatas, untuk alasan keamanan kita tidak mungkin membiarkan host, ip, username, password VPS kita ter-expose pada workflow. Maka dari itu kita akan menaruh credentials tersebut di setting github, namun untuk menaruhnya kita harus mempunya publickey terlebih dahulu. Adapun cara generate public key pada VPS sebagai berikut:

$ ssh-keygen -t rsa -b 4096 -m PEM -C “cicd-nodejs”

Kita akan cek bahwa apakah key kita sudah ter-generate yaitu bisa dicek pada

/root/.ssh/

Ada dua file yang ter-generate yaitu “id_rsa-github-actions-nodejs” sebagai private key. Dimana private key adalah key yang akan kita store dalam github action sebagai secret. Dan “id_rsa-github-actions-nodejs.pub” adalah key yang akan kita daftarkan kepada server kita (agar github punya izin masuk dengan private key tersebut).

Oke, setelah dua file key tersebut tergnerate, kita copy private key tersebut dan define di github setting.

Copy private key dari BEGIN RSA PRIVATE KEY sampai ke END RSA PRIVATE KEY ke github.

Pergi ke setting pada repository kita, lalu masuk ke secret dan New Secret.

Lalu kita berikkan nama sesuai file yml pada workflow CD kita, karena kita define sebagai secrets.PRIVATE_KEY maka kita berikan nama PRIVATE_KEY dan paste privatekey VPS kita ke VALUE lalu kemudian Add Secret.

Setelah berhasil menambahkan Private key, sekarang kita menambahkan kebutuhan lainnya yang akan disecret. Ingat, kita akan menambahkan IP VPS & USERNAME juga kedalam Secrets, maka kita akan menambahkan IP VPS & USERNAME kita kedalam Secrets github. Kurang lebih jadinya seperti ini:

Perlu diingat, masing masing VPS memiliki konfigurasinya masing, masing. Silahkan sesuaikan dengan konfigurasi VPS masing masing. Setelah langkah ini terlewati, sekarang saatnya kita mendaftarkan public key yang tadi ter-generate ke dalam authorized keys di VPS kita, yang berada pada path /home/ubuntu/.ssh/authorized_keys/ sesuaikan dengan user masing masing, karena disini saya define ke github USERNAME = ubuntu, maka dari itu kita harus define di directory user ubuntu.

Copy public key kedalam authorized keys pada path /home/ubuntu/.ssh/authorized_keys/

Paste di line pertama

Save, exit.

Setelah SSH berhasil terkonfigurasi, silahkan pergi ke VPS untuk menyalankan terlebih dahulu project dengan pm2.

Pastikan kalian sudah melakukan Instalasi keperluan nodejs & pm2:

$ apt install npm$ npm install pm2 -g

Setelah menginstall dependencies, silahkan coba jalani terlebih dahulu project node js menggunakan pm2.

$ cd CICD-NodeJS$ pm2 start index.js — name CICDApps

Pastikan pm2 selalu aktif saat proses CD berlangsung, karena jika mati, Github CD tidak bisa terhubung dengan VPS.

Setelah seperti ini, kembali ke github. Tidak lupa untuk save/commit yml workflow CD yang tadi kita buat. Lalu cek ke actions.

Akan muncul seperti ini

Itu tandanya workflow sedang berjalan. Mengapa? Karena kita setting workflow di file yml tadi bahwasannya ada file pada master, maka CD akan automasi running.

Jika sudah seperti ini

Itu tandanya kita berhasil deploy ke VPS menggunakan fitur CD dari Github.

Sekarang saatnya membuktikan source code yang sudah berada pada branch master akan ter-deploy secara otomatis.

Terlihat, sesuai yang kita buat tadi, bahwa pada endpoint / yaitu akan muncul kata kata “This App is running properly!” ini artinya kita sudah berhasil menjalankan fitur CI / CD dari github.

Terakhir, kita akan membuktikan bahwa proses deployment ini sudah full automatic adalah disaat kita melakukan perubahan, kita hanya tinggal re-push ke repository yang sudah kita buat.

Saya menambah endpoint berupa /ping dan jika diakses akan bertuliskan “Pong!”. Sekarang saya akan melakukan re-push ke branch hello lalu membuat pull request dan merge ke branch master (untuk membuktikan CI) dan melihat bagaimana semua ini akan berjalan otomatis (CI / CD).

Demikianlah sedikit alur kerja dari CI / CD. Pada intinya CI / CD ini memungkinkan kita untuk tidak perlu repot memikirkan bagaimana proses deploy suatu aplikasi yang sedang dikembangkan, kita bisa fokus saja dalam proses pengembangan itu sendiri tanpa harus pusing memikirkan teknik deploying yang benar.

Adapun untuk kesulitan atau tantangan pada teknik CI / CD hanyalah awalan saja, yaitu disaat mendesain file yml (workflow) dari CI / CD tersebut, selebihnya kita akan sangat dimudahkan dengan penggunaan fitur CI / CD ini.

Sekian dari saya, kurang lebihnnya mohon maaf. Semoga dengan artikel ini bisa memberikan manfaat bagi kalian para pembaca. Terima kasih.

Adapun untuk source code dari latihan ini bisa kunjungi Github saya di https://github.com/gilangvperdana/CICD-NodeJS

--

--