Pengenalan dan Tujuan
Preview environment CI otomatis dengan Docker Compose memberikan lingkungan sementara yang cocok untuk QA atau review fitur sebelum merge. Tanpa setup ini, reviewer harus menebak kondisi dependency atau mengandalkan build lokal masing-masing. Menggunakan Docker Compose menjaga konsistensi stack, sedangkan pipeline CI memastikan environment dipasang dan dibersihkan secara otomatis.
Artikel ini membahas urgensi preview environment, struktur repo yang mendukung override khusus CI, job pipeline yang membangun dan menjalankan Compose dengan health check, serta strategi cleanup, pembatasan runtime, dan penanganan secret yang aman.
Urgensi Preview Environment dan Tantangan Dependency
Reviewer dan QA membutuhkan lingkungan yang mencerminkan produksi tanpa harus menjalankan semuanya di mesin lokal mereka. Tanpa preview environment otomatis, bug yang muncul hanya di integrasi akhirnya terlambat terdeteksi. Tantangan utama adalah mengelola dependency yang kompleks—misalnya, service utama perlu database, cache, atau sistem queue yang juga harus berjalan dalam versi tertentu.
Docker Compose memudahkan menata dependency tersebut sebagai service. Namun, pada pipeline CI, kita tidak hanya ingin menjalankan compose, tetapi juga memastikan semua dependency siap sebelum tester mengakses URL preview. Oleh karena itu, perlu ada mekanisme health check, port ekspos, dan pemantauan runtime.
Struktur Repository dan Docker Compose
Struktur repo idealnya memisahkan compose utama untuk pengembangan lokal dan override untuk pipeline CI. Misalnya:
docker-compose.yml # service utama dan dependency default
docker-compose.override.yml# pengaturan dev local (volume, port)
docker-compose.ci.yml # pengaturan khusus pipeline (non-interaktif, wait scripts)
ci/health-check.sh # skrip sederhana memastikan endpoint siapContoh isi docker-compose.yml:
version: '3.9'
services:
app:
build: .
ports:
- '3000:3000'
environment:
- DATABASE_URL=postgres://user:pass@db:5432/app
db:
image: postgres:alpine
environment:
- POSTGRES_PASSWORD=pass
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
File docker-compose.ci.yml bisa menyesuaikan runtime CI, misalnya menonaktifkan volume besar, mematikan dependensi yang tidak perlu, serta memasukkan skrip health check:
services:
app:
environment:
- NODE_ENV=production
command: yarn start:ci
db:
environment:
- POSTGRES_HOST_AUTH_METHOD=trust
Dengan override ini, pipeline CI cukup menjalankan compose dengan flag -f docker-compose.yml -f docker-compose.ci.yml.
Job CI untuk Menjalankan Preview Environment
Contoh job GitHub Actions berikut membangun image, menjalankan Compose, memanggil health check, dan mengekspose URL hasil port mapping.
name: Preview Environment CI
on:
pull_request:
branches: [main]
jobs:
preview:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and run preview
run: |
docker compose -f docker-compose.yml -f docker-compose.ci.yml build app
docker compose -f docker-compose.yml -f docker-compose.ci.yml up -d
./ci/health-check.sh http://localhost:3000/health 120
env:
PREVIEW_URL: http://localhost:3000
- name: Report preview URL
run: echo "Preview tersedia di $PREVIEW_URL"
Skrip ci/health-check.sh dapat menggunakan curl untuk menunggu respon 200:
#!/usr/bin/env bash
url=$1
timeout=${2:-60}
start=$(date +%s)
while true; do
if curl -sf "$url" >/dev/null; then
echo "Health check sukses"
exit 0
fi
if [ $(($(date +%s) - start)) -ge $timeout ]; then
echo "Health check gagal setelah $timeout detik" >&2
exit 1
fi
sleep 2
done
Job ini menjamin preview environment hanya tersedia selama job berjalan. Informasi port atau URL bisa dikomunikasikan ke komentar PR menggunakan GitHub Actions API atau action pihak ketiga.
Cleanup, Pembatasan Waktu, dan Secret Injection
Cleanup otomatis penting agar resource tidak menumpuk. Gunakan kombinasi docker compose down dalam langkah post atau finally agar container dihentikan walaupun job gagal. Contoh di atas bisa dilengkapi:
- name: Teardown preview
if: always()
run: docker compose -f docker-compose.yml -f docker-compose.ci.yml down --volumes --remove-orphans
Batasi runtime preview dengan timeout global (misalnya 20 menit) dan health check untuk menghentikan job jika service tidak siap. Untuk secret, gunakan mekanisme CI: GitHub Actions memanfaatkan ${{ secrets.DB_PASSWORD }} dan pass melalui environment ke Compose melalui file env atau pass-through environment var.
Hindari menulis secret langsung ke docker-compose.ci.yml. Lebih baik simpan di .env.ci yang tidak dikomit dan muat memakai action dotenv atau atur env: di job.
Manfaat Developer Experience dan Feedback Cepat
Dengan preview environment otomatis, QA dan reviewer mendapatkan konteks penuh fitur yang diuji tanpa setup manual. Ini mempercepat umpan balik karena pengujian terjadi dalam kondisi konsisten dan terotomatisasi. Developer juga mendapat kepastian apakah dependency seperti database atau service eksternal sudah terintegrasi.
Penerapan ini meningkatkan DX karena membebaskan tim dari troubleshooting manual dan memastikan pipeline sendiri menjadi dokumentasi hidup bagi keadaan preview environment.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!