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.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!