Suling’s CI/CD In a Nutshell

Imam Maulana Rachbini
Sulang
Published in
3 min readMay 17, 2018

Continous Integration (CI) dan Continous Delivery (CD) adalah konsep implementasi sebuah proses yang memudahkan developer untuk menggabungkan code yang baru dengan code utama, dan juga berguna untuk melakukan serangkain unit testing pada setiap stage yang ada, dan diakhiri dengan proses deployment.

CI/CD saat cocok diterapkan untuk pengembangan software yang bertipe agile. Karena CI/CD membuat proses dari building, testing, hingga deployment yang sampai akhirnya dapat digunakan oleh user jauh lebih cepat, sehingga user atau stakeholders lain pun sesegera mungkin dapat memberikan feedback untuk pengembangan software lebih lanjut.

Nah, berikut ini akan dijelaskan secara singkat mengenai tahapan-tahapan CI/CD yang diimplementasikan pada Suling. Pada Suling, kami mengimplementasikan 3 stage, yaitu Build, Test, dan Deploy.

Building Stage

stages:
- build
- test
- deploy
build:
image: node:latest
stage: build
script:
- cd frontend/v2
- npm install
- NODE_ENV=production npm run build

Building stage di atas adalah proses mem-build frontend ReactJS. image node:latest maksudnya adalah menggunakan base image node dengan versi paling baru. Proses building dijalankan pada bagian script, yaitu change directory ke directory frontend ReactJS, lalu npm install akan menjalankan instalasi depedensi yang dibutuhkan oleh ReactJS, dan selanjutnya dilakukan building apps dengan menjalankan perintah production npm run build, dan temporary environtment server frontend tersebut disimpan pada variabel NODE_ENV.

Test Stage

be_tests:
image: python:3.6
stage: test
before_script:
- cd backend/v1
- pip install -r requirements.txt
- python manage.py makemigrations
- python manage.py migrate
- python manage.py collectstatic --no-input
when: on_success
script:
- coverage run --source="." manage.py test
- coverage report -m
- pycodestyle --exclude='manage.py','./hound/*', './*/migrations','./*/apps.py','./*/urls.py','./*/models.py' ./

Selanjutnya bagian test stage, yang akan test untuk backend, yaitu Django. Di stage ini menggunakan image python versi 3.6. Pada bagian before script (sebelum dijalankan stage), adalah tahapan yang dilakukan untuk menginstall requirements/depedensi untuk apps ini, dan diteruskan dengan migrasi database. Ketika before script tersebut sukses (when: on_success), maka akan dijalankan Test Stage-nya, yaitu menjalankan unit test untuk apps Django tersebut, lalu menampilkan code coverage dan juga mengecek lint.

Deployment Stage

deploy_stag:
script:
# install ssh-agent
- 'which ssh-agent || ( apt-get update -y
&& apt-get install openssh-client -y )'
# run ssh-agent
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan -H 52.148.80.48 >> ~/.ssh/known_hosts
- ssh -t suling@52.148.80.48 "sudo rm -rf suling-stag &&
git clone -b sit_uat --single-branch
https://gitlab .com/PPL2018csui/
Kelas-C/ppw-final.git suling-stag"
- ssh -t suling@52.148.80.48
"bash stag.sh && cd suling-stag && sudo bash run.sh"
when: on_success
only:
- sit_uat
stage: deploy
environment:
name: staging

script di atas adalah contoh untuk deployment ke server staging, yang mana hanya akan dijalankan jika ada update ke branch ‘sit_uat’ yang didefinisikan pada bagian ‘only’. Script pada stage Test diawali dengan meng-install ‘ssh-agent’, agar gitlab dapat mengakses server azure dengan ssh, lalu menjalankan ssh-agent di perintah berikutnya. Selanjutnya adalah menulis $SSH_PRIVATE_KEY dengan perintah echo ke file /dev/null pada gitlab, agar mendapatkan akses ssh ke server azure nantinya. Selanjutnya mengubah permission pada file ~/.ssh dengan chmod 700 yang artinya ‘owner can read, write and execute’. Selanjutnya menambahkan ssh fingerprint dengan perintah ssh-keyscan. Setelah konfigurasi siap, maka dilakukan ssh ke server azure, dan server azure tersebut akan melakukan clone dari gitlab repository, khususnya branch sit_uat. Setelah berhasil clone, maka selanjutnya server azure akan melakukan build apps yang commandnya terdefinisi pada file run.sh, dan deployment berhasil.

--

--