Deploy Docker ke server dengan bantuan gitlab CI/CD
Perubahan fitur pada software akan selalu terjadi mengikuti hukum software evolusi Lehman & Belady. Maka dibutuhkan cara deployment software ke produksi secara otomatis dan tanpa cacat (error-prone) secara berulang-ulang. Terdapat banyak tools yang bisa kita gunakan untuk mencapai hal tersebut. Saya menggunakan Gitlab CI/CD untuk tugas ini.
Gitlab menyediakan 2 fasilitas:
- Gitlab-runner: sebagai penghubung antara server kita dengan server gitlab
- Gitlab registry: untuk menyimpan docker yang sudah kita build.
Untuk hasil akhir dari tutorial ini, teman-teman bisa mengacu pada contoh kode gitlab berikut.
Baiklah, langsung kita mulai saja tahapannya.
Tahapan singkat
- create project on gitlab
- register gitlab runner pada vps kita:
sudo gitlab-runner register -n — url https://gitlab.com — registration-token project_token — executor docker — description “Deployment Runner” — docker-image “docker:stable” — tag-list deployment — docker-privileged
- set up variables on gitlab project
- SSH key from VPS
- Username in VPS
- Private IP untuk dihubungkan dengan server gitlab
4. create .gitlab-ci.yml. script akan dijelaskan dibawah
5. create Dockerfile. Disini saya akan build image nginx yang menerima service dari end-user.
6. finish !
Penjelasan script Gitlab-CI.yml
Terdapat 2 stage, publish dan deploy.
1. Publish stage
Executor untuk gitlab-runner yang kita gunakan adalah docker.
Maka kita perlu mencantumakan image `docker:latest`.
Service yang digunakan adalah docker in docker, disingkat dind.
Apa maksudnya? Maksudnya adalah kita dapat build docker image menggunakan docker (rekursif ya?)
Lalu script yang harus di ekskusi diantaranya:
a. docker build pada kode disaat state-commit-nya sesuai dengan tag_latest dan tag_commit yang sudah di definisikan sebelumnya.
b. docker login pada repository gitlab-ci dengan menggunakan gitlab-token yang sudah didefine dan alamat registry dimana docker image telah dibuat.
c. docker push untuk push ke gitlab-registry sesuai dengan tag_commit dan tag_latest
2. Deploy stage
Stage publish selesai lanjut ke stage deployment.
Gitlab CI akan coba berkomunikasi dengan VPS tempat kita mendeploy kode melalui protokol SSH.
Authentikasi menggunakan key ID_RSA, disertai server user dan IP nya yang sudah kita di define pada variable di GITLAB sebelumnya.
Terdapat 2 command pertama untuk image alpine yang kita buat.
a. chmod og= $ID_RSA:
Revokes all permissions for group and others from the private key, such that only the owner can use it.
b. apk update dan apk add ssh untuk koneksi ke server vps.
Selanjutnya, terdapat 4 command docker diantaranya:
a. docker login pada gitlab-ci-registry.
Command yang sama seperti yang ada pada stage publish.
b. docker pull sesuai dengan tag_commit pada gitlab-ci-registry yang sudah di define.
c. docker rm untuk menghapus container yang sudah di build sebelumnya.
d. docker run untuk menjalankan container yang sudah di build sebelumnya.
https://gist.github.com/RiansyahTohamba/e4c33854279e12e1bb3f4e8dd96abe99
Masalah terkait deployment
- CI stack karena jobs tidak punya tag yang sesuai dengan gitlab runner?
solusi:
a. kita bisa mengisi tag pada tiap jobs/stage yang ada di script gitlab-ci.ymlpublish:
..
tags:
- deploymentb. kita bisa set untuk menjalankan jobs, walaupun job tersebut tidak tag yang sesuai dengan gitlab-runner yang ada di VPS kita.detail:
https://stackoverflow.com/questions/53370840/this-job-is-stuck-because-the-project-doesnt-have-any-runners-online-assigned
2. docker daemon belum jalan di gitlab?
ketika kita mengikuti script yang disediakan oleh blog Digital Ocean ini, maka akan ada beberapa masalah. Maka kita perlu tambahan script berikut.
docker build file, padahal ini dilakukan di gitlab. kenapa bisa terjadi?
docker build -t $TAG_COMMIT -t $TAG_LATEST .
Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?Tambahkan data docker host
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
DOCKER_DRIVER: overlay2
Referensi:
- https://www.digitalocean.com/community/tutorials/how-to-set-up-a-continuous-deployment-pipeline-with-gitlab-ci-cd-on-ubuntu-18-04#step-4-setting-up-an-ssh-key
- https://itnext.io/docker-in-docker-521958d34efd
- https://stackoverflow.com/questions/53370840/this-job-is-stuck-because-the-project-doesnt-have-any-runners-online-assigned
- https://stackoverflow.com/questions/70806828/why-gitlab-runner-throws-is-the-docker-daemon-running