DATABASE DATABASE-AS-CODE CI-CD DEVOPS GITOPS SCHEMA-MANAGEMENT DECLARATIVE AUTOMATION DATA-INTEGRITY SOFTWARE-DELIVERY DATABASE-MIGRATIONS SQL

Declarative Database Change Management: Mengelola Skema Database sebagai Kode untuk CI/CD Modern

⏱️ 10 menit baca
👨‍💻

Declarative Database Change Management: Mengelola Skema Database sebagai Kode untuk CI/CD Modern

Pernahkah Anda merasa pusing ketika harus melakukan perubahan pada skema database? Dari penambahan kolom, perubahan tipe data, hingga penyesuaian indeks, proses ini seringkali penuh dengan tantangan. Mulai dari lupa menerapkan perubahan di lingkungan staging, perbedaan skema antar developer, hingga drama saat deployment ke produksi karena skema tidak sinkron. Jika ini terdengar familiar, Anda tidak sendirian.

Di dunia pengembangan modern yang serba cepat, di mana CI/CD (Continuous Integration/Continuous Deployment) menjadi tulang punggung, manajemen perubahan skema database seringkali tertinggal. Kita sudah biasa mengelola kode aplikasi di Git dan mengotomatisasi deployment, tapi bagaimana dengan database?

Di artikel ini, kita akan menyelami konsep Declarative Database Change Management. Ini adalah pendekatan yang mengubah cara kita berpikir tentang perubahan database, menjadikannya bagian integral dari workflow CI/CD Anda. Bayangkan database Anda bisa ‘di-deploy’ semudah kode aplikasi Anda!

1. Pendahuluan: Mengapa Database Change Management Itu Krusial?

Dalam ekosistem aplikasi web modern, database adalah jantungnya. Setiap perubahan pada kode aplikasi hampir pasti memerlukan atau memengaruhi skema database. Jika manajemen perubahan skema tidak dilakukan dengan baik, kita akan menghadapi segudang masalah:

Pendekatan Declarative Database Change Management hadir sebagai solusi. Alih-alih berfokus pada langkah-langkah untuk mengubah skema (imperatif), kita akan berfokus pada keadaan akhir yang diinginkan dari skema database Anda (deklaratif). Ini adalah kunci untuk integrasi database yang mulus ke dalam praktik DevOps dan GitOps modern.

2. Imperatif vs. Deklaratif: Memahami Perbedaannya

Untuk memahami kekuatan pendekatan deklaratif, mari kita bandingkan dengan pendekatan imperatif yang mungkin lebih sering Anda gunakan.

Pendekatan Imperatif (Migration Scripts)

Ini adalah pendekatan tradisional yang digunakan oleh banyak ORM (Object-Relational Mapper) dan tool migrasi seperti Flyway atau Liquibase.

Pendekatan Deklaratif (Desired State)

Pendekatan ini mendefinisikan apa yang Anda inginkan dari skema database Anda, dan membiarkan tool yang mengurus bagaimana cara mencapainya.

3. Manfaat Pendekatan Deklaratif untuk Database Anda

Pendekatan deklaratif menawarkan sejumlah manfaat signifikan, terutama untuk tim yang menerapkan CI/CD dan GitOps:

4. Bagaimana Cara Kerja Declarative Database Change Management?

Prinsip dasarnya sederhana, tetapi implementasinya membutuhkan tool yang tepat.

  1. Source of Truth di Git: Seluruh definisi skema database Anda (DDL) disimpan dalam satu atau beberapa file (misalnya, schema.sql, tables/users.sql, tables/products.sql) di repositori Git Anda. Ini adalah desired state.

  2. Tool Perbandingan Otomatis: Saat pipeline CI/CD berjalan atau developer ingin menerapkan perubahan, tool khusus akan melakukan perbandingan:

    • Membandingkan desired state (file DDL di Git) dengan current state (skema database aktual di lingkungan target).
  3. Generasi Skrip Migrasi: Jika ada perbedaan, tool akan secara cerdas menghitung skrip SQL ALTER TABLE atau CREATE INDEX yang paling efisien untuk mengubah current state menjadi desired state. Ini adalah keajaiban dari pendekatan deklaratif.

  4. Penerapan Perubahan: Skrip migrasi yang dihasilkan kemudian dapat:

    • Di-review secara manual (opsional, tapi sangat disarankan untuk produksi).
    • Diterapkan secara otomatis ke database target.
  5. Alur Kerja GitOps (Ideal):

    • Developer membuat perubahan pada file schema.sql di branch fitur.
    • Membuat Pull Request (PR).
    • CI pipeline secara otomatis menjalankan tool deklaratif untuk diff antara branch PR dan main. Ini akan menunjukkan skrip ALTER TABLE yang akan dihasilkan.
    • Tim mereview perubahan skema (dan skrip yang dihasilkan).
    • Setelah merge ke main, CD pipeline secara otomatis mengambil schema.sql terbaru dan menerapkan perubahan ke database produksi.

5. Tool Populer untuk Pendekatan Deklaratif

Beberapa tool telah muncul untuk mendukung pendekatan deklaratif ini:

6. Implementasi Praktis di CI/CD Pipeline Anda

Mari kita lihat bagaimana Anda bisa mengintegrasikan pendekatan deklaratif ini ke dalam pipeline CI/CD Anda. Kita akan menggunakan pseudo-code dengan asumsi tool seperti Atlas.

Langkah 1: Definisikan Desired State Skema Anda

Mulailah dengan memiliki representasi lengkap dari skema database Anda dalam file DDL yang disimpan di Git.

-- schema.sql
-- Ini adalah desired state untuk database Anda
CREATE TABLE IF NOT EXISTS users (
  id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  username VARCHAR(50) NOT NULL UNIQUE,
  email VARCHAR(255) NOT NULL UNIQUE,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS products (
  id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  price DECIMAL(10, 2) NOT NULL,
  description TEXT,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

Langkah 2: Integrasi ke CI (Validasi dan Review)

Ketika seorang developer membuat perubahan pada schema.sql dan membuka Pull Request, pipeline CI harus:

  1. Validasi Skema: Pastikan file schema.sql valid secara sintaksis.
  2. Tampilkan Perubahan (Diff): Bandingkan skema di branch PR dengan skema di branch main (atau database produksi) dan tampilkan skrip migrasi yang akan dihasilkan. Ini sangat membantu dalam code review.
  3. Deteksi Drift (Opsional): Bandingkan juga schema.sql di main dengan skema database produksi aktual untuk mendeteksi perubahan manual yang tidak terversioning.
# .github/workflows/ci-db-schema.yaml
name: DB Schema CI

on:
  pull_request:
    branches: [ main ]
    paths:
      - 'schema.sql' # Hanya trigger jika schema.sql berubah

jobs:
  validate-schema:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Setup Atlas
      uses: ariga/setup-atlas@v1 # Contoh setup Atlas
      with:
        version: latest
    - name: Show Schema Diff
      # Bandingkan schema.sql di PR dengan schema.sql di main
      # dan tampilkan skrip migrasi yang akan dihasilkan
      run: |
        git fetch origin main:main
        atlas schema diff --from "file://$(git rev-parse --show-toplevel)/schema.sql?ref=$(git rev-parse HEAD)" \
                          --to "file://$(git rev-parse --show-toplevel)/schema.sql?ref=main" \
                          --dev-url "docker://mysql/8/dev" # Gunakan database dev sementara
      # Output dari perintah ini akan muncul di PR comment atau log CI

Langkah 3