Yomu
CI/CD

Pipeline Java

CI/CD backend Java — PMD, JaCoCo, OWASP, build Docker, dan deployment VPS Swarm

Backend Java menggunakan Gradle Kotlin DSL dengan Java 21 dan Spring Boot 4.0.2. Pipeline terdiri dari empat file workflow dengan quality gate untuk kode, keamanan, dan artifact Docker. Deployment kini melalui GHCR → yomu-deployment → VPS Docker Swarm.

File Workflow

play

ci.yml

Jalankan pada push/PR ke main. Menjalankan tugas Gradle check. Memicu pmd.yml via workflow_dispatch jika lulus.

linters

pmd.yml

PMD 7.0.0 dengan rulesMinimumPriority=5. Laporan coverage JaCoCo. Gagal pada masalah kualitas kode atau coverage di bawah 80%.

shield

security-audit.yml

OWASP DepCheck dengan failBuildOnCVSS=9.0. Upload SARIF ke tab GitHub Security. Berjalan mingguan dan pada dispatch manual.

package

release.yml

Tag Docker image dengan semver. Push ke GHCR. Memicu setelah CI sukses. Menggunakan multi-stage build. Mengirim repository_dispatch ke yomu-deployment.

Quality Gate Java

checklist

Aturan PMD

  • Tidak ada variabel, metode, atau import yang tidak digunakan
  • Hindari metode pendek (panjang > 30)
  • Tidak ada catch block kosong
  • Tidak ada konflik penamaan variabel lokal
  • Semua aturan diatur ke prioritas 5 (minimum)
chart

Coverage JaCoCo

  • Minimum branch coverage: 80%
  • Minimum line coverage: 80%
  • Laporan coverage di build/reports/jacoco
  • Gagal build jika threshold tidak terpenuhi
radar

OWASP CVSS

  • Threshold severity CVSS: ≥9.0
  • Memblokir build jika ditemukan kerentanan kritis
  • Hasil SARIF tersedia di tab GitHub Security
  • Scan terjadwal mingguan

Alat Build Java

AlatVersiTujuan
GradleKotlin DSLOrkestrator build, runner test
Java21Runtime dan target compile
Spring Boot4.0.2Web framework
H2In-memoryDatabase test
JUnit 5TerbaruUnit testing
PMD7.0.0Analisis kode statis
JaCoCoTerbaruCode coverage
OWASP DepCheckTerbaruScanning vuln dependency
DockerMulti-stageOptimasi image

Kegagalan Quality Gate (Simulasi)

failure

Test Case Hilang

PMD menandai: Metode tidak digunakan, catch block kosong, konflik penamaan variabel lokal. Build gagal.

drop

Penurunan Coverage

JaCoCo melaporkan 75% branch coverage (threshold: 80%). Build gagal. Laporan coverage dihasilkan.

vuln

Dependency Rentan

OWASP mendeteksi Log4j CVE-2021-44228 (CVSS 10.0). Build diblokir. SARIF diupload ke GitHub Security tab.

Deployment

registry

Image Registry

Image: ghcr.io/advprog-2026-a14-project/yomu-backend-java:main (production) atau :staging (staging)

trigger

Trigger Deploy

Setelan CI mengirim repository_dispatch ke repo yomu-deployment untuk memicu deploy ke VPS. Event type: deploy-trigger dengan payload image_tag.

server

Target Deployment

VPS GCP 34.101.41.6, user: pongo. Deploy via docker stack deploy -c docker-compose.swarm.yml yomu.

Alur CD

  1. Release Workflow — Setelah CI lulus, release.yml membuild Docker image dan push ke GHCR
  2. Repository Dispatch — Workflow mengirim event ke yomu-deployment dengan payload:
    {
      "image_tag": "main"
    }
  3. Deploy Triggerdeploy-production.yml di yomu-deployment menerima event repository_dispatch
  4. SSH Connection — Workflow menggunakan appleboy/ssh-action untuk SSH ke VPS
  5. Stack Deploy — Menjalankan docker stack deploy dengan image tag yang sesuai
  6. Rolling Update — Docker Swarm melakukan rolling update service
  7. Smoke Test — Verifikasi endpoint /actuator/health/readiness
manual

Deploy Manual

Gunakan workflow_dispatch di yomu-deployment dengan input image_tag untuk deploy manual. Berguna untuk rollback atau deploy hotfix.

cross

Cross-Repo Trigger

Subproyek lain dapat memicu deploy infra melalui repository_dispatch. Berguna untuk orchestrasi multi-service.

Build Docker

# Multi-stage build uses eclipse-temurin:21-jre
# Stage 1: builder (eclipse-temurin:21-jdk)
# Stage 2: runner (eclipse-temurin:21-jre)

Image final hanya berisi JRE runtime (bukan JDK), mengurangi attack surface dan ukuran image.

Tag Image

EnvironmentTag PatternTrigger
ProductionmainPush ke branch main
StagingstagingPush ke branch staging
Specific<commit-sha>Workflow dispatch manual

On this page