LEARNFAZZ Backend Deployment

Norman Bintang
LEARNFAZZ
Published in
3 min readMay 24, 2019

LEARNFAZZ dibangun dari beberapa services, salah satunya adalah backend service. Dalam kehidupannya, backend service dideploy ke dalam tiga environment berbeda, yaitu development, staging, dan production. Berikut adalah hal-hal yang harus diperhatikan untuk deployment.

Config

Tentu ada beberapa configuration yang berbeda antara development dan production, seperti secret key, database yang digunakan, dan lainnya. Sangat menyusahkan apabila code production dan development harus berbeda untuk membedakan configuration ini. Cara kami mengatasinya adalah dengan memasukkan config yang perlu diatur dalam environment variable. Dalam sistem operasi linux, mengatur environment variable dapat dilakukan dengan perintah berikut.

export NAME=VALUE;

NAME menandakan apa nama variable yang dibuat,
VALUE menandakan nilai yang akan diassign ke variable yang dibuat.

Development

Environment ini adalah environment di mana developer bekerja, yaitu pada komputer masing-masing. Tidak ada hal-hal khusus yang perlu diperhatikan. Cara menjalankannya juga sangat mudah, asalkan semua dependency seperti golang, database, sudah terinstall pada komputer yang ingin digunakan.

Production

Environment ini dijalankan pada server yang dapat diakses oleh semua orang. Awalnya kami menggunakan Portainer yang disediakan oleh Fasilkom UI. Tetapi karena suatu dan lain hal, kami memutuskan untuk memindahkannya ke Kubernetes.

Deployment ke environment ini kami lakukan secara otomatis dengan bantuan GitLab CI/CD. Deployment akan dijalankan saat sebuah branch berhasil dimerge ke branch utama. Berikut ini adalah script yang kami buat pada berkas gitlab-ci.yml untuk melakukan deployment ke kubernetes.

back-end:deployment-to-gcp-registry:
image: docker:latest
services:
- docker:dind
stage: deploy
dependencies: []
tags:
- docker
before_script:
- docker info
- if [ $CI_COMMIT_TAG ]; then DOCKER_IMAGE_VERSION=$CI_COMMIT_TAG; else DOCKER_IMAGE_VERSION=$CI_COMMIT_SHORT_SHA; fi
script:
- echo $DOCKER_IMAGE_VERSION
- cd back-end/
- docker build -t $GCP_DOCKER_IMAGE_TAG .
- docker tag $GCP_DOCKER_IMAGE_TAG:latest $GCP_DOCKER_IMAGE_TAG:$DOCKER_IMAGE_VERSION
- docker images
- echo "$GCP_SERVICE_KEY" > key.json
- docker login -u _json_key --password-stdin https://asia.gcr.io < key.json
- docker push $GCP_DOCKER_IMAGE_TAG
- docker push $GCP_DOCKER_IMAGE_TAG:$DOCKER_IMAGE_VERSION
retry: 1
only:
refs:
- staging
- development
changes:
- back-end/**/*
- .gitlab-ci.yml
environment:
name: staging
back-end-deployment-to-kubernetes:
stage: rollout
image: google/cloud-sdk
dependencies: []
before_script:
- if [ $CI_COMMIT_TAG ]; then DOCKER_IMAGE_VERSION=$CI_COMMIT_TAG; else DOCKER_IMAGE_VERSION=$CI_COMMIT_SHORT_SHA; fi
script:
- cd back-end/
- echo "$GCP_SERVICE_KEY" > key.json
- gcloud auth activate-service-account --key-file=./key.json
- gcloud config set project $GCP_PROJECT_ID && gcloud config set container/cluster $GCP_CLUSTER_NAME && gcloud config set compute/zone $GCP_COMPUTE_ZONE && gcloud container clusters get-credentials $GCP_CLUSTER_NAME --zone $GCP_COMPUTE_ZONE
- sed 's@latest@'"$DOCKER_IMAGE_VERSION"'@' deployment_template.yaml > deployment.yaml
- cat deployment.yaml
- kubectl delete deployments --all && kubectl apply -f deployment.yaml && kubectl rollout status deployment.extensions/learnfazz-backend
only:
refs:
- staging
- development
changes:
- back-end/**/*
- .gitlab-ci.yml
environment:
name: staging

Karena ini adalah environment production, yang digunakan untuk mendemokan aplikasi saat sprint review, dan juga yang kami gunakan saat exhibition, tentunya kami tidak ingin ada bug baru yang kami buat yang dapat merusak fungsionalitas dari versi sebelumnya. Untuk itu, sebelum dapat melakukan deployment, kami menjalankan lint dan test terlebih dahulu sebelum service dapat dideploy. Berikut ini adalah gambaran dari pipeline kami.

Pipeline deployment ke production

Staging

Environment ini sebenarnya mirip dengan production, yang bisa diakses untuk semua orang. Bedanya environment ini dibuat dengan tujuan developer lain yang memerlukan service backend dapat mencoba menggunakan fitur terbaru dari service backend secepat mungkin, walaupun belum dideploy ke production. Karena tujuannya agar developer lain dapat mencoba dengan cepat, kami tidak menjalankan lint maupun test terlebih dahulu untuk deployment ke environment ini. Berikut adalah pipeline yang kami buat.

Pipeline staging

--

--