Konfigurasi CI/CD untuk Nodejs menggunakan Bitbucket Pipeline ke AWS EC2 dengan CodeDeploy
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:
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:
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.
Setelah aplikasi terbuat, scroll kebawah dan klik menu Create Deployment Group. Ikuti langkah — langkah pada gambar berikut:
Untuk service role, silahkan pilih IAM Role yang kita buat pertama kali.
Pada sesi Environment configuration, centang Amazon EC2 instances dan pilih EC2 berdasarkan tag yang ada saat ini pada instance kalian.
Pada sesi Deployment settings pilih opsi CodeDeployDefault.OneAtATime.
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.
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.
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.
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.
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.