Konfigurasi CI/CD untuk Nodejs menggunakan Bitbucket Pipeline ke AWS EC2 dengan CodeDeploy

Kadek Pradnyana
JavaScript Indonesia Community
6 min readSep 13, 2020
Photo by JJ Ying on Unsplash

Artikel ini merukapan kontribusi pertama saya di komunitas JavaScript Indonesia, jika kalian ingin mendapatkan artikel — artikel lainnya jangan lupa untuk support saya melalui claps dan komentarnya ya 😃

Karena ini merupakan latihan yang panjang, jadi mohon persiapkan kopi dan pisang gorengnya ya 😅

Sebelum melanjutkan membaca latihan ini, pastikan kalian memiliki akses ke AWS dan bitbucket Repository Setting. Memiliki instance EC2 yang sedang online/running.

Pendahuluan

CI/CD (Continuous Integration/Continuous Deployment) merupakan sebuah environment yang wajib diimplementasikan untuk menunjang produktifitas dan efisiensi dalam merilis sebuah aplikasi, baik itu web apps maupun mobile apps. Jika ingin mengetahui lebih dalam tentang CI/CD, kalian bisa membaca artikel ini.

Konfigurasi pada AWS

IAM Role, AWS Secret Access Key & AWS Access Key ID (IAM Service)

Silahkan login ke AWS Console. Lalu pilih service Identity and Access Management (IAM). Pada navigasi pane di sebelah kiri, klik Roles dan selanjutnya Create Role dan ikuti langkah — langkah berikut:

Memilih AWS Service, EC2 instance dan Menambahkan Permissions

Pastikan Role yang ditambahkan sebagai berikut:

  • AmazonEC2RoleforAWSCodeDeploy
  • AmazonS3FullAccess
  • AWSCodeDeployFullAccess
  • AWSCodeDeployRole
  • AWSCodeDeployDeployerAccess

Setelah berhasil membuat IAM Role, selanjutnya adalah menambahkan IAM Role tersebut ke instance EC2.

Setelah menambahkan IAM Role baru ke intances EC2 yang sudah berjalan, jangan lupa untuk di Reboot ya 👍

Kemudian membuat access key. Masuk ke IAM service, pada navigasi menu, pilih Users kemudian pilih user name kalian. Selanjutnya masuk pada tab Security credentials dan pilih Create access key. Setelah berhasil membuat accesskey, jangan lupa untuk menyimpan access key tersebut di tempat yang rahasia ya.

Langkah selanjutnya adalah membuat IAM Groups. Masih pada IAM service, pilih menu Groups pada menu di sebelah kiri. Klik Create New Group dan berikan nama sesuai dengan yang kamu inginkan. Kemudian klik Next Step dan tambahkan policy berikut:

  • AmazonS3FullAccess
  • AWSCodeDeployFullAccess

Selanjutnya klik Next Step maka kamu akan ada di halaman review group, kemudian klik tombol Create Group. Setelah selesai maka hasilnya akan seperti gambar dibawah:

Halaman Groups dengan tab Permissions aktif

Selanjutnya kita akan menambahkan user yang ada ke group yang kita buat sebelumnya. Caranya dengan berpindah ke tab Users (masih pada halaman detail group) dan tambahkan user dengan mengklik tombol Add Users to Group.

Application Name, Deployment Config & Deployment Group (Code Deploy service)

CodeDeploy merupakan sebuah service yang akan berkomunikasi dengan Pipeline nantinya. Ada 2 modul harus dipersiapkan, yaitu Application dan Deployment Group. Pertama, kita masuk ke service CodeDeploy. Klik Create Application kemudian masukkan nama aplikasi yang diinginkan dan pada menu Compute Platform pilih EC2/On-premises.

Membuat Aplikasi pada CodeDeploy service
Membuat Aplikasi pada CodeDeploy service

Setelah aplikasi terbuat, scroll kebawah dan klik menu Create Deployment Group. Ikuti langkah — langkah pada gambar berikut:

Beri nama Deployment Group dan Service Role

Untuk service role, silahkan pilih IAM Role yang kita buat pertama kali.

Sesi Environment configuration, pilih Amazon EC2 Instances

Pada sesi Environment configuration, centang Amazon EC2 instances dan pilih EC2 berdasarkan tag yang ada saat ini pada instance kalian.

Sesi Deployment settings, pilih OneAtATime

Pada sesi Deployment settings pilih opsi CodeDeployDefault.OneAtATime.

Sesi Load balancer, uncheck Enable load balancing

Pada sesi Load balancer, uncheck pilihan Enable load balancing.

S3 Bucket

S3 akan digunakan oleh CodeDeploy untuk menyimpan Revisions. Dan ini merupakan tahap terakhir konfigurasi pada AWS. Silahkan masuk ke service S3. Kemudian Create Bucket dan berikan nama sesuai dengan project yang kalian buat.

Application Name, Deployment Group Name, dan S3 Bucket Name akan kita tambahkan pada bitcbuket pipeline selanjutnya.

CodeDeploy Agent

Langkah terakhir adalah dengan meng-install CodeDeploy agent pada instance EC2. Seperti yang saya bahas sebelumnya, CodeDeploy agent bertugas untuk menjalankan command pada pipeline kemudian CodeDeploy agent akan memberikan response ke pipeline apakah command yang kita jalankan berstatus success atau failed.

Silahkan login ke EC2 dengan SSH kemudian install CodeDepoy agent dengan comand dibawah.

Command install CodeDeploy agent pada ubuntu

Pastikan rubah posisi region sesuai dengan region EC2 dan S3 kalian, kali ini tidak perlu reboot instance. Jika cara diatas tidak berhasil, silahkan ikuti tutorial yang ada pada dokumentasi CodeDeploy.

Konfigurasi pada Bitbucket

Bitbucket Pipeline

Akhirnya bisa berpindah ke tahap pembuatan pipeline di Bitbucket setelah ribetnya konfigurasi di AWS 😅. But, keep spirit guys! 👊

Silahkan login ke Bitbucket dan masuk ke repository project yang akan kita deploy ke EC2. Kemudian mengaktifkan Pipeline pada project tersebut dengan cara masuk ke halaman Settings > pipeline > Settings dan klik switch button pada pilihan Enable pipeline.

Mengaktifkan pipeline pada Bitbucket
Mengaktifkan pipeline pada Bitbucket

Langkah selanjutnya adalah memasukkan semua variable environment yang akan kita gunakan pada saat deploy. Masukkan semua nama environment yang ada pada gambar dibawah pada menu Settings > pipeline > Repository variables.

  • APPLICATION_NAME: berisi nama application yang kita buat pada CodeDeploy.
  • DEPLOYMENT_GROUP: berisi nama deployment group di dalam Application yang kita buat pada CodeDeploy.
  • S3_BUCKET: nama s3 yang kita buat sebelumnya untuk menampung data revisions

Oke, konfigurasi environment sudah selesai. Sekarang saatnya kita membuat file bitbucket-pipelines.yml pada root directory project kalian.

Kemudian buat file baru dengan nama appspec.yml pada root project directory. File appspec.yml berisi beberapa hooks yang digunakan oleh CodeDeploy untuk menjalankan perintah saat post atau pre-install aplikasi.

appspec.yml digunakan oleh CodeDeploy untuk eksekusi command

Kemudian buat folder baru dengan nama shells. Dan tambahkan 3 file baru di dalam folder shells dengan nama stop_server.sh, install_dependencies.sh, dan start_server.sh.

Masukkan perintah dibawah pada file stop_server.sh.

Pada file install_dependencies.sh masukkan perintah dibawah.

Masukkan perintah dibawah pada file start_server.sh.

Terakhir, silahkan commit dan lakukan Pull Request atau langsung push ke branch master. Sampai disini proses sudah selesai, untuk selanjutnya setiap kali ada aktifitas merge ke branch master maka Bitbucket akan mentrigger Pipeline dan menjalankan deployment secara otomatis.

Untuk proses deployment, kita dapat melihatnya pada halaman Pipeline pada repository project.

Jika proses deployment kedua gagal (error message: Directory not empty), kalian bisa coba untuk menghapus deployment group yang kita gunakan pada AWS kemudian membuat kembali dengan nama yang sama.

Kesimpulan

Akhirnya kita berhasil membuat CI/CD (Continuous Integration/Continuous Deployment) dengan Bitbucket Pipeline dan EC2. Dengan CI/CD proses deployment dan update aplikasi kita akan menjadi lebih mudah, tidak repot lagi untuk SSH ke instance setiap update versi terbaru dari aplikasi yang kita buat. Namun pada beberapa kasus, Continuous Deployment atau proses deploy otomatis mungkin bukan pilihan yang tepat.

Jika team kalian tidak merekomendasikan deploy otomatis setiap kali ada merge ke branch master, mungkin kita bisa menerapkan metode Continuous Delivery. Dengan metode ini memungkinkan kita untuk menjalankan deployment hanya saat dilakukan action manual.

Kita dapat melakukan ini dengan mudah pada Bitbucket Pipeline. Cukup merubah beberapa baris kode pada file bitbucket-pipelines.yml dan metode Continuous Delivery berhasil kita terapkan.

Perhatikan pada section custom. Dibawahnya diikuti dengan nama deployment tersebut. Biasanya sih diberi nama production, staging, testing, dll. Selanjutnya lakukan commit dan merge ke branch master kalian. Nah seharusnya proses deployment sudah tidak otomatis lagi, melainkan kita akan memberikan perintah secara manual.

Untuk memberikan perintah manual, masuk ke halaman Pipelines pada Bitbucket. Di sebelah kanan atas, kalian akan melihat button Run pipeline. Klik tombol tersebut maka akan muncul pilihan branch. Pilih branch master dan pipeline yang akan kita gunakan adalah custom: production.

Menjalankan Pipeline secara manual

Tunggu beberapa saat maka proses deployment akan berjalan. Sampai disini semua proses CI/CD sudah selesai, baik itu deployment otomatis maupun secara manual. Kalian juga bisa menambahkan custom deployment sebanyak yang kalian mau dengan tujuan instance yang berbeda. Mungkin kita akan bahas pada tutorial selanjutnya ya 😃

Sekian dulu untuk tutorial CI/CD dengan Bitbucket Pipeline. Semoga dapat membantu menunjang produktifitas teman — teman semua dalam bekerja. Kalau kalian ada pertanyaan atau menemukan masalah, silahkan ajukan di kolom komentar ya.

Terima kasih dan sampai jumpa pada tutorial selanjutnya.

--

--

Kadek Pradnyana
JavaScript Indonesia Community

Hi, I’m a self-taught. Writes all of my experiences into this mini blog and keen to get feedbacks from the community. Happy learning!