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).
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:
- Memasukkan file .txt kedalam webserver nginx
- Build image nginx
- Push image nginx
- 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.
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 bersamasource 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:
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
Admin LUKMANLAB, DevOps Engineer, Site Reliability Engineer, System Administrator.