automation deployment menggunakan ci/cd pada gitlab

1
1466

halo sobat sekolahlinux, kali ini saya akan membahas sedikit bagaimana cara menggunakan feature ci/cd pada gitlab, pada tutorial ini yang saya gunakan adalah gitlab-ee jadi saya tidak akan membahas cara membuat runner nya, karena yang saya gunakan adalah shared runner yang disediakan oleh gitlab-ee.

pada gitlab project dashboard saya membuat 3 variable yaitu, untuk membuatnya kalian bisa ke GITLAB-LOGIN >> PROJECT >> SETTINGS >> CI/CD >> SCRECT VARIABLES

  • $username = berisi username login ke ke account gitlab atau private registry
  • $password = berisi password untuk username gitlab atau private registry
  • $PRIVATE_KEY = berisi ssh private-key yang sebelumnya saya generate di komputer lokal saya

pada script ci/cd .gitlab-ci.yml yang saya buat kali ini saya membaginya menjadi 3 stages yaitu:

  • compile-java = pada stage ini akan dijalankan perintah untuk compile java serta unit test
  • build-image = pada stage ini hasil dari stage compile-java akan dibuat image docker lalu kemudia di push ke private registry milik gitlab
  • deploy-k8s = pada stage ini akan dilakukan deploy image baru pada kubernetes yang sudah di push ke private registry milik gitlab

untuk script .gitlab-ci.yml nya kurang lebih seperti dibawah

image: docker:latest
services:
- docker:dind
- mysql
- registry.gitlab.com/sekolahlinux/keycloak:3.1.0.Final

variables:
  MYSQL_ROOT_PASSWORD: root2017
  MYSQL_DATABASE: sekolahlinux
  MYSQL_USER: sekolahlinux
  MYSQL_PASSWORD: sekolahlinux2017
      
stages:
- compile-java
- build-image
- deploy-k8s

compile-java:
  stage: compile-java
  only:
    - master
  image: maven:3.5-jdk-8
  script:
    - 'mvn package -e -X -Dspring.profiles.active=testing'
  artifacts:
    paths:
      - target/*.jar 

build-image:
  stage: build-image
  only:
    - master
  script:
    - mv target/*.jar .
    - docker login registry.gitlab.com -u $username -p $password
    - docker pull openjdk
    - docker build -t registry.gitlab.com/sekolahlinux/sekolahlinux-service .
    - docker push registry.gitlab.com/sekolahlinux/sekolahlinux-service

deploy-k8s:
  stage: deploy-k8s
  only:
    - master
  image: ubuntu
  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'
    - 'ssh-add <(echo "$PRIVATE_KEY")'
    - 'ssh -p22 root@sekolahlinux.com "kubectl apply -f /root/k8s/sekolahlinux-service.yml && kubectl set image deployment/sekolahlinux-service sekolahlinux-service=registry.gitlab.com/sekolahlinux/sekolahlinux-service:latest"'

sekarang kita bahas paramater-paramater yang digunakan pada script .gitlab-ci.yml diatas

  • image: = paramater ini berarti kita menjalankan seluruh proses stages/jobs diatas image docker:latest
    • image yang kita gunakan sebagai base adalah docker:latest
  • services: = paramater ini berarti kita ingin menjalankan service didalam image docker:latest, servicenya sendiri masih berupa docker image
    • service pertama yang kita gunakan adalah docker:dind yang berfungsi nantinya untuk build image docker dan push image tersebut ke private repository pada stage build-image
    • service kedua yaitu mysql yang digunakan untuk keperluan unit test saat proses stage compile-java yang memerlukan koneksi database mysql untuk write db nya, bagaimana applikasi dapat menghubungi service ini, bisa  dengan set host ke mysql jadi tanda baca seperti titik “.” slash “/” diganti menjadi dash atau strip “-“
    • service ketiga adalah keycloak yang digunakan untuk keperluan unit test saat proses stage compile-java yang memerlukan koneksi ke keycloak untuk authnya, (image keycloak yang saya gunakan disini adalah image keycloak yang sudah saya custom), bagaimana applikasi dapat menghubungi service ini, bisa dengan set host ke registry-gitlab-com-sekolahlinux-keycloak jadi tanda baca seperti titik “.” slash “/” diganti menjadi dash atau strip “-” detailnya kalian bisa baca disini (https://docs.gitlab.com/ce/ci/docker/using_docker_images.html#accessing-the-services)
  • variables: = paramater ini digunakan untuk membuat environment variable didalam image docker:latest yang nantinya bisa kita gunakan juga untuk keperluan lainnya, pada case ini saya menggunakanya untuk keperluan set user, db, password, root_password service mysql
    • MYSQL_ROOT_PASSWORD: = variable ini digunakan untuk set root password service mysql
    • MYSQL_DATABASE: = variable ini digunakan untuk membuat database pada service mysql
    • MYSQL_USER: = variable ini digunakan untuk membuat user mysql
    • MYSQL_PASSWORD: = variable ini digunakan untuk set password user yang kita buat menggunakan variable MYSQL_USER
  • stages: = paramater ini digunakan untuk mendaftarkan penamaan jobs atau step-step yang akan dilakukan yang akan dilakukan, penamaannya bebas, sesuai dengan team mengerti
    • dalam hal ini saya mendaftarkan 3 nama yaitu compile-java, build-image, deploy-k8s

STAGE COMPILE-JAVA

pada stage ini kita menggunakan base image baru yaitu maven:3.5-jdk-8

  • compile-java: = ini adalah blok penamaan, sebenernya kalau ini namanya bebas mau diisi apa saja dan tidak perlu didaftarkan, namun biasanya saya mengikuti penamaan sesuai dengan penamaan stage yang sudah ditentukan di paramater stages:
  • stage: = paramater ini digunakan untuk menentukan penamaan seluruh proses yang berjalan didalamnya, dan hanya bisa diisi sesuai dengan panamaan yang terdaftar di parameter stages: dalam case ini saya isi dengan compile-java
  • only: = paramater ini digunakan untuk menentukan hanya di branch mana jobs akan di jalankan, pada case ini saya hanya menjalankan job jika ada perubahan pada file di branch master
  • image: = paramater ini digunakan untuk menentukan image apa yang akan digunakan pada stage/jobs compile-java ini… berarti nanti proses jobs pada stage ini tidak terjadi diatas image docker:latest namun berada diatas image maven:3.5-jdk-8
  • script: = paramater ini digunakan untuk menjalankan perintah apapun, misalkan pada case ini saya menjalankan perintah untuk compile java menggunakan maven
  • artifacts: = paramater ini digunakan untuk menyimpan folder atau file hasil compile atau hasil perintah yang dijalankan pada paramater script untuk kemudian bisa di tranfer ke stage/job berikutnya di gitlab-ci, dan untuk menentukan folder/file apa yang akan disimpan menggunakan paramater path:  

STAGE BUILD-IMAGE

pada stage ini kita menggunakan base image default yaitu docker:latest

  • build-image: = ini adalah blok penamaan, sebenernya kalau ini namanya bebas mau diisi apa saja dan tidak perlu didaftarkan, namun biasanya saya mengikuti penamaan sesuai dengan penamaan stage yang sudah ditentukan di paramater stages:
  • stage: = paramater ini digunakan untuk menentukan penamaan seluruh proses yang berjalan didalamnya, dan hanya bisa diisi sesuai dengan panamaan yang terdaftar di parameter stages: dalam case ini saya isi dengan build-image
  • only: = paramater ini digunakan untuk menentukan hanya di branch mana jobs akan di jalankan, pada case ini saya hanya menjalankan job jika ada perubahan pada file di branch master
  • script: = paramater ini digunakan untuk menjalankan perintah apapun, misalkan pada case ini saya menjalankan perintah melakukan build image docker dengan metode Dockerfile, file Dockerfile sudah saya letakkan didalam repository gitlab, untuk kemudian akan melakukan push ke gitlab docker private registry

STAGE DEPLOY-K8S

  • deploy-k8s: = ini adalah blok penamaan, sebenernya kalau ini namanya bebas mau diisi apa saja dan tidak perlu didaftarkan, namun biasanya saya mengikuti penamaan sesuai dengan penamaan stage yang sudah ditentukan di paramater stages:
  • stage: = paramater ini digunakan untuk menentukan penamaan seluruh proses yang berjalan didalamnya, dan hanya bisa diisi sesuai dengan panamaan yang terdaftar di parameter stages: dalam case ini saya isi dengan build-image
  • only: = paramater ini digunakan untuk menentukan hanya di branch mana jobs akan di jalankan, pada case ini saya hanya menjalankan job jika ada perubahan pada file di branch master
  • image: = paramater ini digunakan untuk menentukan image apa yang akan digunakan pada stage/jobs deploy-k8s ini… berarti nanti proses jobs pada stage ini tidak terjadi diatas image docker:latest namun berada diatas image ubuntu
  • script: = paramater ini digunakan untuk menjalankan perintah apapun, misalkan pada case ini saya menjalankan perintah untuk inject ssh privkey untuk kemudian melakukan perintah ssh ke server kubernetes untuk melakukan update image pada deployment kubernates

kira-kira seperti itu prosesnya 🙂 masih banyak yang bisa kalian pelajari dari gitlab ci ini, untuk membaca doc nya silahkan berkunjung ke link di bawah ini

jika ada kekurangan, kesalahan & pertanyaan silahkan diberitahu di kolom komentar.

1 COMMENT