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 siap

Contoh 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.