Untuk mempercepat developer experience (DX) pada tim backend Spring Boot, otomatisasi pra-merge yang menjalankan linting, pengujian, dan preview build adalah fondasi yang mesti terpasang. Artikel ini memandu langkah demi langkah agar setiap Pull Request divalidasi oleh lint/tooling, unit test, dan preview build sebelum bisa di-merge ke main branch.

Dengan pendekatan ini, tim mendapatkan feedback cepat, kualitas kode konsisten, dan artefak build yang bisa dipresentasikan ke QA/PM tanpa menunggu merge selesai. Prinsip yang dijabarkan tetap relevan untuk proyek menggunakan Maven maupun Gradle.

1. Menetapkan standar lint dan unit test sebelum merge

Mulai dengan memastikan phase lint dan unit test otomatis dijalankan ketika PR dibuat. Untuk Spring Boot yang menggunakan Maven, tambahkan plugin checker style atau spotbugs serta unit test pada mvn verify. Pada Gradle, pastikan ./gradlew check mencakup lint dan test yang diperlukan.

Contoh konfigurasi Maven (pom.xml) yang mengaktifkan Checkstyle harus diletakkan di bagian plugin:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-checkstyle-plugin</artifactId>
  <version>3.2.0</version>
  <executions>
    <execution>
      <phase>verify</phase>
      <goals><goal>check</goal></goals>
    </execution>
  </executions>
</plugin>

Untuk Gradle, tambahkan di build.gradle:

plugins {
  id 'checkstyle'
}

checkstyle {
  toolVersion = '10.5'
  configFile = file('config/checkstyle/checkstyle.xml')
}

tasks.check {
  dependsOn tasks.checkstyleMain, tasks.checkstyleTest
}

Tujuan lint di pipeline adalah menangkap gaya atau anti pattern sebelum test dijalankan sehingga log build tetap rapi. Pastikan konfigurasi yang sama digunakan lokal dan di CI agar konsistensi tetap terjaga.

2. Pipeline GitHub Actions untuk lint, unit test, dan preview build

Gunakan GitHub Actions untuk orchestration. Berikut contoh workflow yang menjalankan lint+test, lalu menghasilkan artefak preview build yang bisa diunduh atau dipasang di environment staging.

name: Pre-merge Quality Gates

on:
  pull_request:
    branches:
      - 'main'

jobs:
  lint-test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        build: [maven, gradle]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/cache@v4
        with:
          path: |
            ~/.m2/repository
            ~/.gradle/caches
          key: ${{ runner.os }}-build-${{ matrix.build }}-${{ hashFiles('**/pom.xml','**/build.gradle') }}
          restore-keys: ${{ runner.os }}-build-${{ matrix.build }}-
      - name: Setup JDK
        uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: '17'
      - name: Run {{ matrix.build }} checks
        run: |
          if [ "${{ matrix.build }}" = "maven" ]; then
            mvn -B verify
          else
            ./gradlew check
          fi

  preview-build:
    runs-on: ubuntu-latest
    needs: lint-test
    steps:
      - uses: actions/checkout@v4
      - name: Build artifact
        run: ./mvnw package -DskipTests
      - name: Upload preview artifact
        uses: actions/upload-artifact@v4
        with:
          name: preview-build
          path: target/*.jar

Strategi cache dependency mempercepat job lint/test. Gunakan kunci dengan kombinasi hitungan file build agar cache invalidates saat dependensi berubah. Caching juga menekan waktu build yang bisa mempercepat DX.

3. Preview build dan sharing ke QA/PM

Artefak preview build (misalnya file .jar atau docker image) harus tersedia untuk QA/PM. Alternatif praktis:

  • Gunakan job tambahan untuk deploy artefak ke preview environment (misalnya namespace staging di Kubernetes) dengan parameter PR-ID.
  • Jika tidak deploy, unggah artefak ke storage yang bisa diakses dengan tautan tetap. Tambahkan badge PR atau komentar otomatis yang menautkan ke artefak.

Contoh langkah tambahan untuk comment link artefak:

- name: Comment preview link
  uses: peter-evans/create-or-update-comment@v4
  with:
    issue-number: ${{ github.event.pull_request.number }}
    body: Preview build siap: https://storage.example.com/previews/${{ github.run_id }}.jar

Praktik ini menjaga QA/PM bisa mencoba build tanpa blocking tinggal menunggu merge.

4. Memblokir merge jika job gagal

Setel cabang utama (main) agar menerima merge hanya jika workflow sukses. Aktifkan branch protection rules di GitHub:

  • Require status checks to pass sebelum merge.
  • Masukkan nama job lint-test dan preview-build sebagai status checks wajib.
  • Tambahkan batasan agar hanya maintainer tertentu dapat mengabaikan kegagalan.

Dengan cara ini, tidak ada kode masuk ke main tanpa lint/test lulus. Jika job preview build gagal, PR otomatis ditandai sebagai gagal dan pengembang memiliki log lengkap untuk debugging.

5. Monitoring pipeline ringan

Pantau pipeline dengan cara ringan:

  • Gunakan badge build di README untuk melihat status terakhir.
  • Tambahkan webhook ke Slack/Teams untuk job gagal agar tim responsif.
  • Gunakan GitHub Actions Auto-cancel untuk membatalkan job lama ketika branch diperbarui, menghemat resource.

Jika pipeline sering gagal karena timeout, evaluasi langkah mana yang paling lama dan pertimbangkan caching lebih agresif atau pemecahan job menjadi lebih kecil.

Penutup

Otomasi DX di Spring Boot dengan lint, unit test, dan preview build sebelum merge tidak hanya menjaga kualitas, tapi juga memberikan visibilitas cepat kepada QA/PM. Dengan GitHub Actions, caching dependensi, artefak preview, dan proteksi merge, tim mendapatkan feedback loop tertutup yang praktis dan transparan.