CI/CD GitLab Sederhana – Build, Push, Deploy Nginx

CI/CD GitLab disini kita praktikkan dengan sederhana untuk belajar proses CI/CD yang biasanya diimplementasikan.

GitLab merupakan sebuah tools yang mendukung git repository, continuous integration dan delivery, wiki, issue-tracking dan lain sebagainya. Disini kita hanya pakai dua kelebihan tersebut yaitu sebagai git repository dan CI/CD.

Sebagian besar dari anda mungkin sudah familiar dengan github, secara tidak langsung anda sudah belajar dan pakai git maupun repository git.

Nah, selanjutnya adalah mengenai CI/CD atau (Continuous Integration / Continuous Delivery).

CI/CD GitLab Stage
CI/CD Stage

Jadi, CI/CD merupakan metode yang menangani integrasi secara terus menerus maupun deliver secara terus menerus sebuah aplikasi dengan menerapkan otomatisasi yang dipecah kedalam beberapa stage sebuah pengembangan software.

Seperti gambar diatas CI menangani stage (build, test, merge) kemudian dilanjut CD menangani (automatically release to repository) dan dilanjut deployment yang berfungsi untuk deploy aplikasi ke server hingga Production.


Bagi anda yang baru belajar CI/CD (Continuous Integration / Continuous Delivery) tentu melakukan proses penyusunan pipeline yang cukup memakan waktu. Ada juga mungkin dari anda, belum coba namun sudah menyerah dan cari-cari tools lain yang lebih mudah. 😀

Kali ini admin ingin membagikan study case yang mungkin dengan itu anda bisa terbantu dan juga bisa meng-explore lebih jauh teknik ini sesuai kebutuhan spesifik anda.

Study case ini hanya melakukan integration dan delivery sederhana yaitu:

  1. Memasukkan file .txt kedalam webserver nginx
  2. Build image nginx
  3. Push image nginx
  4. Delivery (deploy/run) image nginx ke sebuah server

Proses diatas akan dilakukan secara otomatis oleh GitLab jika kita melakukan Tagging repository yang ada di GitLab.

Penjelasan diatas sebetulnya penjelasan garis besar, secara teknis ada beberapa script seperti Bash, Dockerfile, dan juga dependency tambahan yang digunakan untuk mendukung proses CI/CD agar prosesnya berjalan dengan baik sebagaimana mestinya.

CI/CD GitLab Pipeline Process
Pipeline Stage

Seperti gambar diatas, artikel ini akan membahas proses Packaging dan Deployment. Pada proses packaging admin hanya melakukan proses building image Docker yang kemudian di Push ke DockerHub. Adapaun proses deployment, admin melakukan remove and run Container sesuai Image yang dirilis pada server.

Pekerjaan diatas akan kita definisikan kedalam satu file .gitlab-ci.yml yang bertugas melakukan otomatisasi 4 poin diatas.

CI/CD menggunakan GitLab itu menulisnya didalam sebuah file .gitlab-ci.yml yang diletakkan bersama source code aplikasi anda.

1 – Packaging

Pada stage ini admin melakukan building docker image dan hasil build tersebut akan di push kedalam image registry. Adapaun script-nya sebagai berikut:

build_push:
  image: docker:latest
  stage: packaging
  services:
    - docker:dind

  before_script:
    - echo $PASSWORD | docker login --username $USERNAME --password-stdin
    
  script:
    - docker build -t $IMAGE:$VERSION .
    - docker push $IMAGE:$VERSION
  only:
    - tags

2 – Deployment

Stage deployment admin melakukan deploy image yang telah di push tadi kedalam server tujuan. Script ya sebagai berikut:

deploy:
  image: alpine:latest
  stage: deployment
  before_script:
    - apk update -qq
    - apk add -qq git
    - 'which ssh-agent || ( apk add -qq openssh-client )'
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | ssh-add -
    - mkdir -p ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
  script:
    - scp deploy.sh $SERVER_USER@$SERVER_HOST:~/
    - ssh $SERVER_USER@$SERVER_HOST "bash deploy.sh nginx $IMAGE $VERSION"
  only:
    - tags

Full Code .gitlab-ci.yml

Adapun code lengkap file .gitlab-ci.yml seperti code dibawah. File ini diletakkan paling luar agar langsung bisa dibaca oleh tool GitLab.

Strukturnya adalah sebagai berikut:

GitLab CI/CD File Sturcture
Structure Code

File .gitlab-ci.yml:

stages:
  - packaging
  - deployment

variables:
  IMAGE: lukmanlab/nginx-deployment
  VERSION: $CI_COMMIT_TAG

build_push:
  image: docker:latest
  stage: packaging
  services:
    - docker:dind

  before_script:
    - echo $PASSWORD | docker login --username $USERNAME --password-stdin
    
  script:
    - docker build -t $IMAGE:$VERSION .
    - docker push $IMAGE:$VERSION
  only:
    - tags

deploy:
  image: alpine:latest
  stage: deployment
  before_script:
    - apk update -qq
    - apk add -qq git
    - 'which ssh-agent || ( apk add -qq openssh-client )'
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | ssh-add -
    - mkdir -p ~/.ssh
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
  script:
    - scp deploy.sh $SERVER_USER@$SERVER_HOST:~/
    - ssh $SERVER_USER@$SERVER_HOST "bash deploy.sh nginx $IMAGE $VERSION"
  only:
    - tags

Ada beberapa variable yang digunakan untuk mendungkung proses CI/CD diatas terutamanya dalam proses deployment. Berikut variable yang admin definisikan didalam GitLab:

Rata-rata variable yang berhubungan dengan auth ke dockerHub dan juga Server.

Sekian

Search: ci/cd, ci/cd menggunakan gitlab, cara ci/cd gitlab, ci/cd sederhana docker gitlab

Leave a Reply