PHP Laravel

Gitlab Continuous Integration & Continuous Delivery Untuk Project Laravel

July 24, 2019

Sudah lama ndak nulis nih, kali ini saya ingin membahas salah satu topik yang dulu saya sangat takuti karena istilahnya yang serem menurut saya.

Jadi untuk topik kali ini adalah Continuous Integration (CI) & Continuous Delivery (CD) yang mana ini sebenarnya adalah materi untuk devops.

Akan tetapi menurut saya buat kamu yang bekerja sebagai backend saya rasa perlu tahu hal ini. Yuk kita bahas lebih dalam tentang CI & CD lalu bagaimana cara mengintegrasikan kedalam project kamu.

Continuous Integration

Mari kita bahas dulu pengertian nya dulu Continuous Integration (CI), kalau kita buka google translate maka kita akan mendapatkan terjemahan seperti ini Integrasi berkelanjutan.

Apasih integrasi berkelanjutan ini dan kenapa kita perlu integrasi berkelanjutan?

Ok jadi begini ketika kita ngoding, bikin sebuah sistem aplikasi maka seiring waktu fitur akan selalu bertambah. Dengan begitu kodingan kita juga semakin banyak bukan.

Nah kodingan kita yang semakin banyak itu perlu kita maintain. Maintain biar apa? Biar bisa kita pastikan aplikasi tidak error.

Terkadang saat menambahkan fitur baru kita tidak perlu membuat koding baru, biasanya kita bisa menggunakan kodingan yang sudah ada dengan sedikit modifikasi.

Untuk itu kita perlu pastikan bahwa modifikasi yang dilakukan itu tidak merubah fungsionalitas dari fitur yang sudah kita buat sebelumnya.

Untuk memastikan bahwa kodingan baru tidak merusak kodingan lama banyak tehnik yang biasa dilakukan dalam hal itu orang biasa menyebut tehniknya adalah dengan unit test.

Metode menulis test ini ada banyak macamnya ada yang menggunakan TDD, BDD, kemudian ada jenis controller test dan functional test.

Apapun test yang dilakukan tujuanya adalah untuk memastikan bahwa kodingan baru tidak merusak fungsionaltas yang sudah ada sebelumnya.

Nah sebelum kita deploy ke production aplikasi kita harus lolos segala test yang sudah kita setup sebelumnya.

Disini CI menjadi salah satu solusi untuk melakukan pengecekan itu semua. Dia akan mensimulasikan penginstallan aplikasi pada spesifikasi mesin yang sudah kita tentukan dan melakukan test apakah pass testnya atau tidak.

Dengan begitu kita akan membuat kita lebih mudah untuk bekerja berkolaborasi dengan developer lain. Karena sering kali kita test di laptop kita tapi di server tidak jalan maka dengan CI akan lebih mudah untuk memastikan semua berjalan dengan benar.

Continuous Delivery

Kalau untuk Continuous Delivery (CD) kalau kita transalate di google translate maka kita akan mendapatkan artinya adalah Pengiriman terus menerus.

Jadi setelah code kita berhasil di test oleh tahap CI maka sekarang waktunya deploy ke production. Biasanya proses ini dilakukan oleh devops, dia akan masuk ke server dengan ssh selanjutnya pull repository nya dan melakukan bash command untuk behavior aplikasi, seperti misalnya migrasi database.

Tapi ternyata proses deployment itu bisa kita lakukan secara otomatis, nah disini lah poses yang sering di sebut dengan istilah Continuous Delivery itu berlangsung. Jadi kita tidak perlu masuk ke server sudah bisa otomatis update sendiri di server nya.

Jadi dengan begini kerjaan kita akan bisa berlangsung dengan cepat, kita tidak perlu melakukan proses deployment secara manual. Meskipun diawal tetap kita akan melakukan beberapa setup secara manual.

Gitlab CI & CD

Sekarang setelah kita tau apa itu CI dan CD dan apa kegunaan nya mari coba kita implementasikan pada repository gitlab.

Di gitlab sudah tersedia fitur CI dan CD ini tidak seperti di github yang mana kita harus menggunkan travis atau circle ci.

Kali ini saya akan memberikan cotoh CI dan CD nya langsung untuk aplikasi web blog ini.

Pertama buat file configuration nya .gitlab-ci.yml seperti berikut ini.

image: php:7.1
services:
  - mysql:5.7
variables:
  MYSQL_DATABASE: ahmadrosid.com
  MYSQL_ROOT_PASSWORD: secret
cache:
  paths:
    - vendor/
before_script:
  - apt-get update -yqq
  - apt-get install gnupg -yqq
  - apt-get install libcurl4-gnutls-dev libicu-dev libmcrypt-dev libvpx-dev libjpeg-dev libpng-dev libxpm-dev zlib1g-dev libfreetype6-dev libxml2-dev libexpat1-dev libbz2-dev libgmp3-dev libldap2-dev unixodbc-dev libpq-dev libsqlite3-dev libaspell-dev libsnmp-dev libpcre3-dev libtidy-dev -yqq
  - docker-php-ext-install mbstring pdo_mysql curl json intl gd xml zip bz2 opcache
  - 'which ssh-agent || ( apt-get install -qq openssh-client )'
  - eval $(ssh-agent -s)
  - mkdir -p ~/.ssh
  - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
  - ssh-add <(echo "$SSH_PRIVATE_KEY")
  - curl -sS https://getcomposer.org/installer | php
  - php composer.phar install
  - cp .env.example .env
  - php artisan key:generate
  - php artisan config:cache
  - php artisan migrate
  - php artisan db:seed
test:
  script:
    - php vendor/bin/phpunit

deploy_staging:
  type: deploy
  environment:
    name: staging
    url: ahmadrosid.com
  script:
    - ssh root@ahmadrosid.com "cd /var/www/ahmadrosid.com/ && git checkout master && git pull origin master && exit"
  only:
    - master

Kita bahas sedikit yang wajib di pahami disini bahwa gitlab ci ini menjalankan prosesnya didalam docker, jadi untuk konfigurasi yang kita perlukan adalam memakai image docker yang ada di docker hub.

Disini saya menggunakan image php versi 7.1 image: php:7.1 kamu juga bisa mengunakan versi 7.2 atau 7.3 sesuaikan dengan setup di servermu.

Karena pada aplikasi ini kita butuh database maka kita bisa menambahkan service seperti berikut ini.

services:
  - mysql:5.7
variables:
  MYSQL_DATABASE: ahmadrosid.com
  MYSQL_ROOT_PASSWORD: secret

Agar migration bisa dijalankan kita perlu menambahkan settingan ini di .env.example.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=ahmadrosid.com
DB_USERNAME=root
DB_PASSWORD=secret

Kemudian kita bisa menambahkan setingan ssh untuk deployment nya pada bari ini.

ssh-add <(echo "$SSH_PRIVATE_KEY")

Jangan lupa untuk copy local ssh key server.

cat ~/.ssh/id_rsa.pub | ssh root@domain "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Kita bisa menambahkan private data, yang mana ini berguna untuk menyembunyikan secret key untuk configurasi ci nya.

Gitlab CI config

Selanjutnya tambahkan $SSH_PRIVATE_KEY variable nya isinya secret key di local ~/.ssh/id_rsa.pub.

Variable config gitlab ci

Sekarang ketika kita push ke origin master maka akan jalan ci dan cd nya. Seperti berikut ini hasi log nya.

Gitlab CI & CD

Kita juga bisa melihat hasil log build nya seperti berikut ini :

build log

Pada konfigurasi ini kita menggunakan deploymen untuk branch master, akan tetapi bisa juga kita buat deployment untuk release tag. Dan jika tidak ingin melakukan deployment saat push code baru kamu bisa menggunakan branch yang lain kecuali yang sudah di seting di configurasi gitlab ci nya. Yang mana contoh pada tutorial ini adalah master.

deploy_staging:
  type: deploy
  only:
    - master

Kesimpulan

GImana sangat mudah bukan untuk menggunakan CI dan CD di gitlab ini. Mudah - mudahan tutorial kali ini bisa menambah informasi buat kamu yang sedang belajar tentang CI dan CD gitlab. Next time kita bahas di github dan bitbucket.

Terimakasih sudah mampir disini, jangan lupa untuk share artikel ini ya.

Subscribe to My Newsletter

Thank you for your interest in my blog. Sign up to my newsletter to stay current on the latest news and information me and to be the first to see new blog posts.