Continous deployment dengan gitlab ci

Continous deployment dengan gitlab ci

gitlab ci logo

Pendahuluan

Pada saat kita selesai mengembangkan sebuah aplikasi, tentu saja kita ingin agar fitur baru yang telah dikerjakan dapat dirasakan oleh pengguna. Hal ini dapat dilakukan dengan melakukan deployment. Deployment dapat dilakukan secara manual, namun pada artikel kali ini, kita akan membahas cara agar deployment dapat dilakukan secara otomatis menggunakan runner yang disedakan oleh gitlab.

.gitlab-ci.yml

Ini adalah .gitlab-ci.yml yang dipakai pada proyek PPL kelompok kami, saya akan menjelaskan fungsi dari bagian-bagian yang ada:

stages:
  - test
  - sonar-scanner-test
  - deploy


unit-test:
  image: golang:alpine3.13
  stage: test
  script:
    - apk add --no-cache git build-base
    - go get ./...
    - go test $(go list ./... | grep -v /vendor/) -v -coverprofile .testCoverage.txt
  artifacts:
    paths:
      - .testCoverage.txt

checkstyle:
  image: golang:1.16
  stage: test
  script:
    - go get ./...
    - go get -u golang.org/x/lint/golint
    - golint -set_exit_status ./...
  allow_failure: true

sonarqube-dev:
  stage: sonar-scanner-test
  image:
    name: sonarsource/sonar-scanner-cli:latest
    entrypoint: [""]
  script:
    - sonar-scanner
      -Dsonar.host.url=$SONARQUBE_HOST_URL
      -Dsonar.login=$SONARQUBE_TOKEN
      -Dsonar.projectKey=$SONARQUBE_PROJECT_KEY
      -Dsonar.branch.target=staging
      -Dsonar.branch.name=$CI_COMMIT_REF_NAME
      -Dsonar.exclusions=mocks/**,infrastructures/**,main.go
  except:
    - staging
    - master

sonarqube:
  stage: sonar-scanner-test
  image:
    name: sonarsource/sonar-scanner-cli:latest
    entrypoint: [""]
  script:
    - sonar-scanner
      -Dsonar.host.url=$SONARQUBE_HOST_URL
      -Dsonar.login=$SONARQUBE_TOKEN
      -Dsonar.projectKey=$SONARQUBE_PROJECT_KEY
      -Dsonar.branch.name=$CI_COMMIT_REF_NAME
      -Dsonar.exclusions=mocks/**,infrastructures/**,main.go
  only:
    - staging
    - master
    

deployment-staging:
  image: ruby:2.4
  stage: deploy
  before_script:
    - gem install dpl
    - wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh
  script:
    - dpl --provider=heroku --app=$HEROKU_STAGING_APP --api-key=$HEROKU_TOKEN
  environment:
    name: Staging
    url: $HEROKU_STAGING_URL
  only:
    - staging

deployment-production:
  image: ruby:2.4
  stage: deploy
  before_script:
    - gem install dpl
    - wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh
  script:
    - dpl --provider=heroku --app=$HEROKU_PRODUCTION_APP --api-key=$HEROKU_TOKEN
  environment:
    name: Production
    url: $HEROKU_PRODUCTION_URL
  only:
    - master

Stages

stages:
  - test
  - sonar-scanner-test
  - deploy

stages merupakan urutan dari tahapan yang akan dikerjakan oleh runner, pada kasus kali ini, urutan dari pekerjaan yang ada adalah test -> sonar-scanner-test -> deploy. Agar pekerjaan pada tahapan selanjutnya dapat dimulai, semua pekerjaan pada stage yang dikerjakan harus selesai dan sukses dikerjakan(kecuali pekerjaan tersebut ditandai sebagai allow_failure=true). Jika terdapat beberapa pekerjaan yang valid, maka pekerjaan tersebut akan dikerjakan secara bersamaan.

jobs

deployment-staging:
  image: ruby:2.4
  stage: deploy
  before_script:
    - gem install dpl
    - wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh
  script:
    - dpl --provider=heroku --app=$HEROKU_STAGING_APP --api-key=$HEROKU_TOKEN
  environment:
    name: Staging
    url: $HEROKU_STAGING_URL
  only:
    - staging

Jobs merupakan fitur utama dari runner ini, proses deployment dikerjakan disini. Terdapat beberapa bagian dari jobs yang akan dijelaskan satu per satu disini.

image

image: ruby:2.4

Jobs menggunakan image dari docker sebagai environment saat melakukan tugasnya. Untuk melihat image yang dapat dipakai, dapat dilihat di https://hub.docker.com/search.

stage

stage: deploy

Disini, kita mendefinisikan pekerjaan ini berada di tahapan apa.

before script & script

  before_script:
    - gem install dpl
    - wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh
  script:
    - dpl --provider=heroku --app=$HEROKU_STAGING_APP --api-key=$HEROKU_TOKEN

Pada before script, kita memasukkan command yang sifatnya sebagai persiapan dari deployment. Pada script, kita memasukkan command yang merupakan tahapan dari deployment itu sendiri, pada kasus ini kita menggunakan program bernama dpl untuk melakukan proses deployment ke heroku secara otomatis.

environment

  environment:
    name: Staging
    url: $HEROKU_STAGING_URL

Bagian ini digunakan untuk menandai untuk enviroment mana deployment ini dilakukan. Pada kasus ini, deployment akan dilakukan ke environment staging, dengan URL ‘$HEROKU_STAGING_URL’.

only & except

  only:
    - staging

Jika anda ingin pekerjaan tersebut hanya dikerjakan pada branch tertentu, maka anda dapat menambahkan perintah only pada gitlab ci.

  except:
    - staging
    - master

Sedangkan jika anda ingin pekerjaan tersebut tidak dikerjakan pada branch tertentu, maka anda dapat menambahkan perintah except pada gitlab ci.

allow failure

  allow_failure: true

Pada saat suatu pekerjaan gagal diselesaikan, maka pekerjaan tahapan selanjutnya tidak akan dikerjakan. Pada kasus dimana pekerjaan tersebut tidak krusial pada pengembangan software(contohnya pada jobs checkstyle), anda dapat menambahkan allow_failure: true untuk menanadai bahwa tahapan pekerjaan selanjutnya dapat dikerjakan walaupun pekerjaan ini gagal.

environment variable

$HEROKU_STAGING_URL

Pada proses deployment, sebaiknya kita tidak memberikan api key atau informasi yang sensitif pada .gitlab-ci.yml . Oleh karena itu, kita dapat menggunakan fitur environment variable yang disediakan oleh gitlab untuk menyembunyikan variabel tersebut. Untuk menambahkan environment variable, anda memerlukan akses maintainer atau lebih tinggi pada project. Jika anda memiliki akses tersebut, maka akan terdapat tombol CI/CD pada setting.
settings->ci/cd

Pada bagian settings, terdapat kolom variable yang dapat dikembangkan menjadi tabel berisi mapping key dan value.

settings->ci/cd

Disini kita dapat menambahkan variabel ke dalam project. Terdapat dua atribut khusus untuk masing-masing variabe yaitu: protected dan masked. Jika variabel tersebut ditandai sebagai protected, maka variabel tersebut hanya dapat dipakai bada branch yang sifatnya protected. Sedangkan jika variabel tersebut ditandai sebagai masked, maka runner akan menyembunyikan variabel tersebut jika variabel tersebut ditampilkan pada output log.

Kesimpulan

Perintah yang ditampilkan di atas dapat membantu dalam otomasi deployment. Continous deployment dengan gitlab ci dapat menghemat waktu dan biaya pada tahapan pengembangan software.