CI/CD Spring Boot menuntut lint yang konsisten, pengujian yang terpercaya, dan preview release yang bisa dipantau sebelum masuk ke production. Artikel ini menunjukkan konfigurasi GitHub Actions yang menjalankan lint, unit atau integration test, membangun artifact, dan mengirimkan aplikasi ke environment staging sebagai preview release, termasuk pengaturan env variable, caching build, dan strategi rollback ketika validasi gagal.

1. Struktur pipeline modern untuk proyek Spring Boot

Pipeline dimulai dengan linting untuk mendeteksi gaya kode atau bug potensial, dilanjutkan unit/integration test, lalu build artifact, dan berakhir pada preview release di environment staging. Mengatur job secara paralel mempercepat developer experience (DX): lint dapat berjalan bersamaan dengan test awal, sedangkan build artifact menunggu hasil tes lengkap.

Alur recommended:

  • Lint job: Checkstyle/SpotBugs analisis sebelum masuk ke tahap berat.
  • Test job: Unit + integration (gunakan profile khusus agar tidak mempengaruhi production). Jika menggunakan Gradle, bisa `./gradlew test`. Maven memakai `mvn verify`.
  • Build job: Membuat jar/war dan menyimpan artifact jika lint+test lolos.
  • Preview release job: Deploy ke staging (misal container registry + kubernetes / cloud run) dengan environment variable yang jelas.

2. Lint otomatis dan deteksi sebelum merge

Linting menggunakan Checkstyle atau SpotBugs membantu mencegah gaya kode yang menyimpang. Pada GitHub Actions, jalankan lint di job independen agar hasilnya muncul cepat di pull request. Gunakan cache dependencies untuk tool lint agar tidak mengulang download.

Contoh job lint Checkstyle

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up JDK
        uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: 17
      - name: Cache Gradle dependencies
        uses: actions/cache@v4
        with:
          path: ~/.gradle/caches
          key: gradle-cache-${{ hashFiles('**/*.gradle*') }}
      - name: Run Checkstyle
        run: ./gradlew checkstyleMain || true

Gunakan `|| true` hanya bila ingin melihat diagnostics tanpa memblokir pipeline; namun sebaiknya lint failure menghentikan pipeline di workflow final.

3. Menggabungkan unit dan integration test

Jalankan unit test dan integration test baru setelah lint sukses. Jika integration test membutuhkan database, gunakan container dengan services atau environment variable untuk konfigurasi test.

jobs:
  test:
    needs: lint
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres:15-alpine
        env:
          POSTGRES_DB: app_test
          POSTGRES_USER: user
          POSTGRES_PASSWORD: password
        options: >-
          --health-cmd="pg_isready"
          --health-interval=5s
          --health-timeout=10s
          --health-retries=5
    steps:
      - uses: actions/checkout@v4
      - name: Set up JDK
        uses: actions/setup-java@v4
        with:
          java-version: 17
      - name: Run tests
        run: ./gradlew test integrationTest

Jaga agar job test bertahan pada database container yang sehat melalui health check. Gunakan profile terpisah untuk connection string agar tidak memengaruhi data production.

4. Build artifact dan penerusan antar job

Build fokus pada packaging jar/war dan menyimpan artifact untuk digunakan job berikutnya (contohnya preview release). GitHub Actions mendukung actions/upload-artifact dan actions/download-artifact.

jobs:
  build:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up JDK
        uses: actions/setup-java@v4
        with:
          java-version: 17
      - name: Build artifact
        run: ./gradlew bootJar
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: spring-boot-jar
          path: build/libs/*.jar

Job preview release nantinya mendownload artifact ini. Bila menggunakan Maven, ganti perintah `./mvn package` dan adaptasi path.

5. Preview release otomatis ke environment staging

Preview release bisa berarti deploy ke namespace staging atau mengirim container image ke registry staging. Dalam contoh ini, kita simpan artifact, bangun container, dan deploy ke Kubernetes atau VM staging. Pastikan env variable sensitif (API key, credentials) disimpan di GitHub Secrets dan diteruskan atas nama job.

jobs:
  preview:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Download artifact
        uses: actions/download-artifact@v4
        with:
          name: spring-boot-jar
      - name: Deploy to staging
        env:
          STAGING_HOST: ${{ secrets.STAGING_HOST }}
          APP_TOKEN: ${{ secrets.STAGING_TOKEN }}
        run: |
          scp build/libs/app.jar $STAGING_HOST:/opt/app/app.jar
          ssh $STAGING_HOST "systemctl restart spring-app"

Sesuaikan langkah deploy dengan lingkungan masing-masing (container registry, Helm, dsb). Preview release harus membiarkan tim QA mengakses staging URL sehingga feedback cepat.

6. Cache, env variable, dan DX optimization

Caching Gradle/Maven mempercepat build. Gunakan key berbasis file manifest (hashFiles('**/build.gradle*')) agar cache invalid saat dependency berubah. Job lint + test bisa dijalankan paralel sehingga hasil awal muncul cepat di PR.

Env variable penting disimpan di Secrets. Gunakan nama konsisten seperti STAGING_DB_URL, STAGING_API_KEY, dan referensikan di job preview. Untuk debugging, tambahkan logging yang cukup di job deploy.

7. Strategi rollback dan penangguhan jika validasi gagal

Jika lint/test gagal, workflow otomatis berhenti. Untuk preview release, sediakan mekanisme rollback manual/dgn script yang memeriksa hasil deploy. Contoh strategi:

  • Gunakan feature flag di staging agar fitur baru tidak otomatis terlihat bila validasi tidak lengkap.
  • Sediakan job tambahan yang memeriksa readiness probe staging dan mengirim notifikasi (Slack/Email) jika gagal.
  • Rollback otomatis: job terakhir bisa memicu deployment versi sebelumnya jika health check gagal setelah deploy.

Selalu rekam output log GitHub Actions untuk keperluan debugging. Jika preview release gagal, periksa log deploy di job preview, environment variable, dan dependency image.

Kesimpulan

Pipeline CI/CD Spring Boot modern mencakup lint, testing, build artifact, dan preview release otomatis. Dengan GitHub Actions, caching, artifact sharing, dan env variable yang tepat, Anda menjaga kualitas kode tanpa mengorbankan kecepatan delivery. Tambahkan monitoring rollback dan lint parallel untuk menjaga DX tetap responsif dan aman.