Pendahuluan
Pada task ini, tahapan pertama adalah implementasi Build & Deploy menggunakan CI/CD dengan deployment aplikasi menggunakan Docker Compose. Docker Compose digunakan untuk menjalankan beberapa aplikasi dalam bentuk container pada STB1.
Proses build Docker image dilakukan menggunakan GitLab CI/CD. Setiap perubahan source code yang akan dirilis diberikan Git tag sebagai penanda versi terbaru. Git tag tersebut kemudian digunakan oleh pipeline untuk menentukan versi Docker image yang akan dibuat.
Setelah proses build selesai, Docker image dikirim ke GitLab Container Registry. Image yang telah tersimpan di registry selanjutnya digunakan pada proses deployment di STB1 menggunakan Docker Compose.
Dengan pendekatan ini, proses deployment tidak lagi dilakukan dengan membangun image secara langsung pada server. Server deployment cukup mengambil image yang telah dibuat oleh pipeline dan menjalankannya menggunakan konfigurasi Docker Compose.
Tujuan
Implementasi Docker Compose dilakukan untuk menerapkan proses build dan deployment aplikasi menggunakan CI/CD dengan image versioning.
Tujuan implementasi di antaranya adalah:
- Membuat Docker image secara otomatis menggunakan GitLab CI/CD.
- Menyimpan Docker image pada GitLab Container Registry.
- Menggunakan Git tag sebagai penanda versi image.
- Melakukan deployment aplikasi menggunakan Docker Compose.
- Memisahkan proses build dengan proses deployment.
- Memastikan aplikasi menggunakan image dengan versi yang telah ditentukan.
- Melakukan pengujian terhadap container dan service setelah deployment.
Infrastruktur Deployment
Deployment Docker Compose dilakukan pada STB1 karena file dan konfigurasi Docker untuk aplikasi berada pada server tersebut. STB1 digunakan sebagai host untuk menjalankan container aplikasi.
Directory yang digunakan untuk menyimpan konfigurasi deployment adalah:
/opt/deploy-appsUntuk masuk ke directory tersebut dapat digunakan perintah:
cd /opt/deploy-appsKemudian isi directory dapat diperiksa menggunakan:
ls -lahSalah satu file Compose yang digunakan untuk menjalankan aplikasi adalah:
docker-compose.apps.ymlFile tersebut berisi konfigurasi aplikasi, image yang digunakan, network, environment, dan pengaturan container lainnya.
Service Aplikasi
Aplikasi yang dijalankan menggunakan Docker Compose terdiri dari beberapa service yang saling berkomunikasi. Service frontend menggunakan React JS dan berfungsi sebagai antarmuka aplikasi. Request dari frontend diteruskan ke Golang BFF yang berfungsi sebagai backend-for-frontend.
BFF tersebut kemudian berkomunikasi dengan service backend sesuai kebutuhan aplikasi. Salah satu service backend menggunakan FrankenPHP dengan nama kelas-01, sedangkan service lainnya menggunakan Golang dengan nama kelas-02.
Untuk penyimpanan data digunakan dua database, yaitu MySQL dan PostgreSQL sesuai dengan kebutuhan masing-masing service. Dengan menggunakan Docker Compose, seluruh service tersebut dapat didefinisikan dan dijalankan melalui konfigurasi yang terpusat.
GitLab Runner
Proses build Docker image dijalankan menggunakan GitLab Runner yang telah dikonfigurasi pada environment STB1.
Runner yang digunakan dalam implementasi adalah:
runner-docker-rndRunner menggunakan tag:
docker-rndExecutor yang digunakan adalah Docker. Docker executor memungkinkan job GitLab CI/CD dijalankan menggunakan container.
Runner juga dikonfigurasi agar dapat berkomunikasi dengan Docker daemon melalui Docker socket:
/var/run/docker.sockDengan konfigurasi tersebut, job pipeline dapat menjalankan perintah Docker seperti docker build, docker login, dan docker push.
Pemeriksaan Docker
Sebelum menjalankan proses build maupun deployment, environment Docker dapat diperiksa terlebih dahulu untuk memastikan seluruh komponen yang dibutuhkan tersedia dan dapat digunakan.
Untuk melihat versi Docker digunakan:
docker --versionSedangkan versi Docker Compose dapat diperiksa menggunakan:
docker compose versionPemeriksaan ini dilakukan untuk memastikan Docker dan Docker Compose tersedia dan dapat digunakan pada environment yang digunakan.
GitLab Container Registry
Docker image hasil proses build disimpan pada GitLab Container Registry. Registry berfungsi sebagai tempat penyimpanan image yang dapat diakses oleh server deployment.
Dengan menggunakan registry, proses build dan deployment dapat dipisahkan. GitLab Runner bertugas membuat image, sedangkan STB1 bertugas mengambil image dari registry dan menjalankannya menggunakan Docker Compose.
Pendekatan tersebut juga membuat server deployment tidak perlu memiliki source code aplikasi untuk melakukan proses build. Server hanya membutuhkan akses ke registry dan konfigurasi deployment.
Login ke GitLab Container Registry
Sebelum melakukan push Docker image, pipeline melakukan login ke GitLab Container Registry.
Perintah yang digunakan adalah:
echo "${CI_REGISTRY_PASSWORD}" | docker login "${CI_REGISTRY}" \
-u "${CI_REGISTRY_USER}" \
--password-stdinCredential yang digunakan berasal dari variabel GitLab CI/CD. Dengan menggunakan variabel tersebut, credential registry tidak perlu ditulis secara langsung di dalam source code.
Parameter --password-stdin digunakan agar password diberikan melalui standard input dan tidak dituliskan secara langsung sebagai argument command.
Image Versioning
Image versioning merupakan salah satu bagian penting dalam implementasi ini. Docker image tidak menggunakan tag latest sebagai identifikasi utama, tetapi menggunakan tag versi yang dibuat melalui Git.
Contoh versi image yang digunakan adalah:
v0.1.0
v0.1.1
v0.1.2
v0.1.3
...
v0.1.19Sebagai contoh, apabila aplikasi dirilis menggunakan versi:
v0.1.19Catatan: tag di atas hanya sebagai contoh.
Maka image yang dihasilkan akan memiliki tag:
registry.gitlab.com/klikto/...:v0.1.19Penggunaan versi seperti ini membuat setiap image dapat diidentifikasi dengan jelas. Image versi sebelumnya juga tetap dapat digunakan apabila dibutuhkan.
Membuat Git Tag
Git tag digunakan untuk memberikan penanda terhadap versi source code yang akan di-build. Setelah perubahan source code selesai dan siap dirilis, tag dapat dibuat menggunakan perintah:
git tag v0.1.19Kemudian tag dikirim ke GitLab dengan perintah:
git push origin v0.1.19GitLab akan menerima tag tersebut dan menjalankan pipeline sesuai dengan konfigurasi .gitlab-ci.yml.
Nilai tag kemudian dapat digunakan oleh pipeline melalui variabel:
CI_COMMIT_TAGDengan demikian, versi source code dan versi Docker image dapat menggunakan identifier yang sama.
Proses Build Docker Image
Pada tahap build, pipeline menggunakan Dockerfile yang terdapat pada repository untuk membuat Docker image.
Perintah yang digunakan adalah:
docker build \
-t "${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG}" .Variabel CI_REGISTRY_IMAGE menunjukkan alamat image pada GitLab Container Registry, sedangkan CI_COMMIT_TAG berisi tag Git yang menjalankan pipeline.
Sebagai contoh, jika pipeline dijalankan menggunakan tag:
v0.1.19Maka image yang dihasilkan akan memiliki tag:
${CI_REGISTRY_IMAGE}:v0.1.19Dengan mekanisme ini, proses pemberian versi image tidak perlu dilakukan secara manual karena versi image akan mengikuti Git tag yang digunakan saat pipeline dijalankan.
Push Docker Image
Setelah proses build berhasil, image dikirim ke GitLab Container Registry menggunakan:
docker push "${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG}"Setelah proses push selesai, image dapat ditemukan pada Container Registry project GitLab. Image tersebut selanjutnya dapat digunakan oleh server deployment, termasuk STB1 yang menjalankan Docker Compose.
Pipeline CI/CD
Pipeline Docker Compose terdiri dari proses build dan deployment. Tahap build bertugas menghasilkan image, sedangkan tahap deploy bertugas menjalankan image tersebut pada STB1.
Struktur stage secara umum adalah:
stages:
- build
- deployPada tahap build, pipeline melakukan login ke registry, build image, dan push image. Pada tahap deploy, pipeline melakukan koneksi ke STB1 menggunakan SSH. Setelah berhasil terhubung, pipeline masuk ke directory deployment dan menjalankan Docker Compose.
Pemisahan kedua tahap tersebut membuat proses build dan deployment menjadi lebih terstruktur. Proses build berfokus pada pembuatan image, sedangkan proses deploy berfokus pada penggunaan image yang telah tersedia di registry.
Deployment ke STB1
Setelah image berhasil dikirim ke GitLab Container Registry, proses deployment dilakukan pada STB1.
Pipeline mengakses server menggunakan SSH dan masuk ke directory:
cd /opt/deploy-appsImage yang dibutuhkan kemudian diambil dari registry menggunakan:
docker compose -f docker-compose.apps.yml pullPerintah tersebut digunakan untuk mengambil image sesuai dengan versi yang telah ditentukan pada konfigurasi Compose.
Setelah image berhasil diperbarui, aplikasi dijalankan menggunakan:
docker compose -f docker-compose.apps.yml up -dParameter -d digunakan agar container berjalan di background sehingga proses deployment dapat dilanjutkan tanpa mempertahankan terminal secara aktif.
Pemeriksaan Container
Setelah proses deployment selesai, status container perlu diperiksa untuk memastikan seluruh service berhasil dijalankan.
Pemeriksaan dapat dilakukan menggunakan:
docker compose -f docker-compose.apps.yml psSelain itu, seluruh container yang sedang berjalan dapat diperiksa menggunakan:
docker psDari hasil pemeriksaan tersebut dapat diketahui status masing-masing service, termasuk apakah container berada dalam kondisi Up atau mengalami error.
Beberapa container aplikasi yang digunakan antara lain:
frontend
bff
deploy-apps-kelas-01-1
deploy-apps-kelas-02-1
kelas-03
nginx-kelas-00Pemeriksaan Image yang Digunakan
Selain memeriksa status container, image yang digunakan oleh container juga perlu diperiksa. Daftar image yang tersedia pada host dapat dilihat menggunakan:
docker imagesUntuk melihat informasi lebih detail dari sebuah container dapat digunakan perintah:
docker inspect deploy-apps-kelas-01-1Pemeriksaan ini dilakukan untuk memastikan container menggunakan image dengan versi yang sesuai. Dengan demikian, proses verifikasi tidak hanya memastikan container berjalan, tetapi juga memastikan versi image yang digunakan sudah benar.
Pengujian Service
Setelah seluruh container berjalan, aplikasi perlu diuji untuk memastikan service dapat menerima request. Salah satu endpoint yang dapat digunakan untuk pengujian adalah:
curl http://localhost/api/studentsJika endpoint menghasilkan response dari aplikasi, maka service backend dapat dianggap telah berhasil berjalan. Pengujian endpoint juga membantu memastikan konfigurasi network dan hubungan antar-service pada Docker Compose berjalan sesuai dengan konfigurasi.
Pengujian Komunikasi Antar-Service
Karena aplikasi terdiri dari beberapa service, komunikasi antar-container juga perlu diuji. Sebagai contoh, komunikasi dari container BFF menuju service kelas-01 dapat diuji menggunakan:
docker exec bff wget -qO- --timeout=5 http://kelas-01/api/studentsJika command tersebut menghasilkan response dari service backend, maka BFF berhasil berkomunikasi dengan container kelas-01.
Pengujian seperti ini penting untuk memastikan bahwa service tidak hanya berjalan secara individual, tetapi juga dapat berkomunikasi sesuai dengan arsitektur aplikasi.
Hasil Implementasi
Setelah seluruh konfigurasi diterapkan, proses Build & Deploy menggunakan Docker Compose berhasil dilakukan melalui GitLab CI/CD. Source code diberikan Git tag sebagai penanda versi. Tag tersebut kemudian digunakan oleh pipeline untuk membuat Docker image dengan versi yang sama.
Image hasil build dikirim ke GitLab Container Registry. Selanjutnya, pipeline melakukan koneksi ke STB1 menggunakan SSH dan menjalankan Docker Compose untuk mengambil image serta menjalankan container.
Hasil deployment kemudian diverifikasi dengan memeriksa status container, image yang digunakan, dan endpoint aplikasi. Dengan proses tersebut, perubahan aplikasi dapat diproses mulai dari source code hingga menjadi container yang berjalan pada STB1 dengan versi image yang dapat diidentifikasi.
Kesimpulan
Implementasi Docker Compose berhasil menerapkan proses Build & Deploy menggunakan GitLab CI/CD dan GitLab Container Registry. Git tag digunakan sebagai penanda versi source code dan sekaligus digunakan sebagai versi Docker image. GitLab Runner dengan Docker executor menjalankan proses build image dan push image ke GitLab Container Registry.
Setelah image tersedia, proses deployment dilakukan pada STB1 melalui koneksi SSH dengan menggunakan Docker Compose. Server deployment tidak perlu melakukan proses build ulang karena image sudah dibuat dan disimpan pada registry oleh pipeline.
Penggunaan image versioning memberikan keuntungan dalam proses pengelolaan deployment karena setiap image memiliki versi yang jelas. Dengan demikian, versi aplikasi yang sedang digunakan dapat diketahui dan perubahan antarversi dapat dilacak melalui Git tag dan Docker image.
Docker Compose juga memberikan proses deployment yang relatif sederhana karena seluruh service aplikasi dapat dikelola melalui file Compose. Metode ini menjadi tahap awal sebelum implementasi deployment menggunakan Kubernetes K3s dan ArgoCD pada tahap berikutnya.
