Cara Deploy Menggunakan Docker & Gitlab

Proses deploy adalah tahap akhir dalam siklus pengembangan aplikasi. Proses ini melibatkan pengiriman source code yang telah diuji ke environment production, di mana aplikasi dapat diakses oleh end user. Proses deploy dapat dilakukan dengan berbagai cara tergantung pada jenis aplikasi, infrastruktur, dan persyaratan bisnis. Beberapa metode deploy yang umum adalah:

Deploy manual: Proses ini melibatkan developer upload server produksi secara langsung, menggunakan aplikasi seperti FTP, SSH, atau Git. Proses ini sederhana dan mudah dilakukan, tetapi memiliki risiko tinggi kesalahan manusia, inkonsistensi, dan downtime.
Deploy otomatis: Proses ini melibatkan penggunaan layanan yang dapat melakukan deploy kode secara otomatis, berdasarkan pemicu tertentu, seperti commit ke repositori, merge ke cabang utama, atau penyelesaian tes. Proses ini meningkatkan efisiensi, keandalan, dan konsistensi deploy, tetapi memerlukan konfigurasi dan integrasi yang lebih rumit.

Docker adalah platform container dimana fungsinya adalah untuk menjalankan sebuah aplikasi. Dengan menggunakan container kita akan terhindar dari masalah source code berjalan di local sedangkan diserver production bermasalah. Kasus ini terjadi biasanya karena perbedaan versi depedency yang dipakai. Sebelum kita membahas bagaimana proses deploy ke container menggunakan gitlab. Kita perlu mengetahui cara management data pada docker container. Dalam Docker “volume” merujuk pada mekanisme yang memungkinkan data pada container tetap persisten dan dapat diakses. Ada beberapa jenis volume yang dapat digunakan dalam Docker:

Volume Named:
Volume yang diberi nama dan dapat diakses. Volume ini dapat dibuat dan dihapus. contoh: docker volume create my_named_volume

Volume Anonymous:
Volume yang tidak diberi nama dan dikelola oleh Docker secara otomatis. Docker akan memberikan nama unik untuk volume ini. contoh docker run -v /data my_image

Volume Host:
Menjadikan volume pada host ke dalam container. Data dalam volume ini dapat diakses oleh container, dan perubahan yang dilakukan dalam container juga akan berefek di host. Contoh penggunaan volume host: 
docker run -v /host/path:/container/path my_image

Volume Bind:
Menyematkan (bind) volume dari suatu path di host ke path tertentu di dalam container. Perubahan dalam container akan berefek di host dan sebaliknya. Contoh penggunaan volume bind:
docker run -v $(pwd):/container/path my_image

Dari penjelasan tersebut bisa kita ambil kesimpulan volume yang dimaksud adalah lokasi data. Kita sudah membahas bagaimana memasukan data ke dalam container. Selanjutnya Docker Hub adalah layanan penyimpanan dan distribusi image Docker secara publik dan pribadi. Image Docker adalah paket yang berisi aplikasi atau layanan berserta semua dependensinya, serta instruksi untuk menjalankan aplikasi tersebut. Image Docker bisa kita dapatkan dengan cara membuat sendiri kemudian kita upload ke docker hub atau bisa dari orang lain yang sudah membuatkan dan sengaja dijadikan public supaya bisa digunakan seperti contohnya:
https://hub.docker.com/repositories/totorajo.

Image docker ini yang akan kita gunakan sebagai media untuk deployment. Misal kita perlu environment untuk aplikasi php 8 maka tinggal kita cari images docker yang berisi depedency php 8. Kita tidak perlu melakukan instalasi secara manual. Kita hanya perlu pull image docker sesuai dependency yang diperlukan dan isi datanya dari gitlab.com. Sebagai contoh kita ingin pull docker image untuk aplikasi berbasis php 7.4. Volume yang akan digunakan ada Volume Host di path /home/toto/apps. Maka kita hanya perlu jalankan perintah:

docker run -itd --restart unless-stopped -p 1001:80 -v /home/toto/apps:/var/www/html/ --name apps1 totorajo/php-7.4:v1
  • docker run -itd –restart unless-stopped berfungsi menjadikan container menjadi auto start ketika host restart
  • -p 1001:80 ini perintah untuk pengaturan port. 1001 adalah port yang diakses lewat browser tidak ada ketentuan khusus selagi port tersebut kosong maka bisa dipakai. 80 adalah port dari aplikasi pada container. untuk aplikasi menggunakan apache2 secara default 80. 
  • -v /home/toto/apps ini adalah volume host dimana source code berada
  • /var/www/html/ ini adalah directory volume pada container.
  • –name apps1 ini adalah nama container
  • totorajo/php-7.4:v1 ini adalah image docker yang akan digunakan yang didapat dari docker hub

Dari perintah diatas maka  container bisa diakses lewat browser dengan cara http://[ip-vm]:1001.

Kita sudah mencoba membuat container dengan menggunakan metode volume host. Artinya setiap ada source code pada volume host maka source code tersebut akan di eksekusi oleh container. Kita lanjutkan bagaimana distribusi source code dari gitlab.com ke vm kita menggunakan layanan gitlab-ci. Pastikan vm kita sudah memiliki file id-rsa. Jika belum silahkan buat dengan panduan https://totoraha.web.id/cara-membuat-ssh-keys-pada-linux/. Setelah selesai sekarang masuk menu setting pada gitlab kemudian pilih CI/CD dan cari menu Variables. Buat variabel baru dengan klik Add variable dan isikan key dari id-rsa vm. Setelah itu buat file .gitlab-ci.yml pada directory root source code dan isikan data berikut disesuaikan dengan vm yang akan digunakan:

stages:
  - deploy-staging

deploy-staging:
    stage: deploy-staging
    image: totorajo/gitlab-ci:v1
    before_script:
        - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y)'
        - mkdir -p ~/.ssh
        - eval $(ssh-agent -s)
        - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'

        - apt-get update
        - apt-get install sudo
        - which rsync || ( apt-get update -y && apt-get install rsync -y )    
    script:
        - ssh-add <(echo "$staging_hasim")
        - rsync -rvzD -e "ssh -o StrictHostKeyChecking=no" --exclude={.git,README.md,CHANGELOG,.idea,.gitlab-ci.yml,.gitignore,vendor,dev-note,cicd,node_modules} ./ [email protected]:/home/toto/apps/
    only:

         # branch yang dijadikan trigger
         - staging 

Setelah kita simpan maka ketika ada merge branch dari manapun ke branch staging proses deploy akan otomatis berjalan dan source terbaru akan dibaca oleh container. Semoga membantu.