Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
677 commits
Select commit Hold shift + click to select a range
5209577
Extract VM destroy orchestration service
May 19, 2026
ddac7ef
Extract VM termination service
May 19, 2026
d1b31af
Extract VM reboot orchestration service
May 19, 2026
a1bf446
Extract VM live migration orchestration service
May 19, 2026
1dc8da9
Extract VM NIC backend command service
May 19, 2026
c45bf51
Extract VM migrate-away planning service
May 19, 2026
29711d4
Extract offering configuration response service
May 19, 2026
5b17490
Extract autoscale API response service
May 19, 2026
538ae8e
Extract snapshot response service
May 19, 2026
a54556d
Extract API address VLAN response service
May 19, 2026
1fe2922
Extract API response owner service
May 19, 2026
ffaa910
Extract VM scale reconfiguration service
May 19, 2026
1b01359
Extract VM expunge orchestration service
May 19, 2026
a6355df
Extract VM network attachment orchestration service
May 19, 2026
194a931
Extract API load balancer firewall response service
May 19, 2026
4db67b9
Extract VM update orchestration service
May 19, 2026
7e8dc88
Extract deploy start service from UserVmManagerImpl
May 19, 2026
b52ed2a
Extract API storage response service
May 19, 2026
8195ec1
Extract identity account API response service
May 19, 2026
f481c7e
Extract host zone capacity response service
May 19, 2026
d264890
Extract VPC VPN response service
May 19, 2026
12e5e80
Extract template ISO response service
May 19, 2026
b659f77
Extract VM system response service
May 19, 2026
66f93d2
Extract project security job response service
May 19, 2026
b205c6e
Extract NFS snapshot zone copy service
May 20, 2026
7faffa4
Extract KVM non-live storage migration handler
May 20, 2026
51e35a6
Extract VM stop orchestration service
May 20, 2026
709384b
Extract network NIC auxiliary service
May 20, 2026
d3bd515
Extract VM runtime lifecycle service
May 20, 2026
c43363b
Extract NFS Swift transfer service
May 20, 2026
3ff2651
Extract VM assignment network service
May 20, 2026
623eeba
Extract VM creation resource reservation service
May 20, 2026
971460c
Extract VM creation network selection service
May 20, 2026
bebf8c6
Extract NFS data store listing service
May 20, 2026
d4d5d1b
Extract VM initial details service
May 20, 2026
b34f002
Extract S3 transfer service from secondary storage resource
May 20, 2026
61930ac
Extract restore request validation
May 20, 2026
11c5166
Extract NFS image metadata service
May 20, 2026
fd4c56d
Extract external DHCP VM IP fetch service
May 20, 2026
bbd0061
Extract NFS post-upload status service
May 20, 2026
21b90e6
Extract VM expunge orchestration service
May 20, 2026
fea866c
Extract VM import facade
May 20, 2026
0a4c0fd
Extract VM allocation validation service
May 20, 2026
349fc15
Extract VM creation post processing
May 20, 2026
ed3d371
Extract VM deploy request resolution
May 20, 2026
5e11c84
Extract post upload request validation
May 20, 2026
c0f71ee
Trim UserVm assignment wrapper docs
May 20, 2026
cdcb59f
Set web workflow token permissions
May 20, 2026
7cb8b09
Extract KVM live storage migration handler
May 20, 2026
b67095e
Merge upstream main into modernize-2026
May 20, 2026
e26d376
Add Veeam KVM backup API contracts
May 20, 2026
907c1ff
Add Veeam KVM core DTOs
May 20, 2026
aad9ec7
Add Veeam KVM image transfer persistence
May 20, 2026
7a9f498
Harden Veeam KVM contract defaults
May 20, 2026
c4acc1d
Add checkpoint delete passphrase map
May 20, 2026
8b5d8bd
Add qemu-img bitmap add support
May 20, 2026
28e14b2
Port Veeam KVM image server runtime
May 20, 2026
b8a3758
Fix image server transfer authorization blockers
May 20, 2026
cd84abf
Add KVM image server agent foundation
May 20, 2026
61263b7
Address KVM image server agent review
May 20, 2026
e31cff1
Add KVM backup checkpoint command wrappers
May 20, 2026
03a4c45
Add KVM backup export orchestration service
May 20, 2026
8115e61
Use epoch seconds for KVM checkpoint times
May 20, 2026
aed6315
Add KVM image transfer wrappers
May 20, 2026
29456d6
Expose image transfer signed ticket in API response
May 20, 2026
f679156
Harden KVM backup export transfers
May 20, 2026
16473c7
Populate Veeam KVM backup response fields
May 20, 2026
eae21aa
Document KVM image server agent defaults
May 20, 2026
7aff3a0
Add Veeam control service skeleton
May 20, 2026
d3b3500
Harden KVM encrypted NBD keyfile lifecycle
May 20, 2026
b60e1ae
Verify web Docker CI slice
May 20, 2026
063583d
Phase 5a: wire shell controls
May 20, 2026
0bb358f
Phase 5a: add UI primitives and mock data
May 20, 2026
3997969
Add Phase 5b local compose foundation
May 20, 2026
b0070ec
Add Phase 5b web BFF proxy foundation
May 20, 2026
d4618ab
feat(web): add authjs foundation
May 20, 2026
02303da
Add Phase 5b trusted BFF session token API
May 20, 2026
781a7ce
Wire Auth.js users to BFF sessions
May 21, 2026
87a72a2
Phase 5c: wire instances to BFF data
May 21, 2026
2eaceef
Phase 5c: wire dashboard to BFF metrics
May 21, 2026
5a72bdd
Phase 5c: wire volumes to BFF data
May 21, 2026
da9ffc2
Phase 5c: wire templates to BFF data
May 21, 2026
453d667
Phase 5c: wire events to BFF data
May 21, 2026
79bcafa
Phase 5c: wire accounts to BFF data
May 21, 2026
d932557
Phase 5c: wire infrastructure to BFF data
May 21, 2026
4ab0a6a
Phase 5c: wire Kubernetes to BFF data
May 21, 2026
9c7a877
Phase 5c: wire SSH keys to BFF data
May 21, 2026
9daeb0d
Phase 5c: wire domains to BFF data
May 21, 2026
752a2a8
Phase 5c: wire networks to BFF data
May 21, 2026
889b601
Phase 5c: wire billing quota summary to BFF data
May 21, 2026
6b412bc
Implement security groups console page
May 21, 2026
3360f71
Implement instance detail BFF page
May 21, 2026
4bc9d3d
Implement network detail slice
May 21, 2026
cf7b464
Implement Kubernetes cluster detail slice
May 21, 2026
4cc8cf9
Implement deploy wizard catalog shell
May 21, 2026
031f417
Add testable CloudStack BFF route core
May 21, 2026
d8b9176
Wire deploy wizard launch flow
May 21, 2026
46766d0
Add deploy wizard custom disk size
May 21, 2026
543cb53
Add guarded instance lifecycle actions
May 21, 2026
c625442
Add volume detach and delete actions
May 21, 2026
0a12c52
Add SSH key action helpers and panel
May 21, 2026
97327bb
Add template lifecycle actions
May 21, 2026
e78527d
Add security group action controls
May 21, 2026
ea86a32
Add deploy wizard advanced options
May 21, 2026
2070ecf
Add network public IP actions
May 21, 2026
dcf60a5
Keep deploy catalog optional endpoints optional
May 21, 2026
c59687e
Add tabbed instance detail view
May 21, 2026
9666217
Add Phase 5 next session plan
May 21, 2026
5a28b49
Add app loading skeleton
May 21, 2026
3eadc33
Add Playwright smoke harness
May 21, 2026
d0db632
Merge Phase 5 smoke harness
May 21, 2026
65ee130
Merge Phase 5 loading skeleton
May 21, 2026
addabea
Add inventory empty states
May 21, 2026
6c777ee
Add console endpoint helper
May 21, 2026
0676f01
Document console access implementation path
May 21, 2026
511bb01
Plan deploy wizard smoke coverage
May 21, 2026
82a0bc6
Merge console access scout
May 21, 2026
d84d7d9
Merge console endpoint helper
May 21, 2026
77c2f59
Merge inventory empty states
May 21, 2026
e159872
Merge deploy wizard smoke plan
May 21, 2026
bbafa42
Add i18n foundation
May 21, 2026
0ec0a44
Merge i18n foundation
May 21, 2026
19a1969
Add instance console launch panel
May 21, 2026
73d0785
Merge instance console launch panel
May 21, 2026
e01762a
Add action accessibility labels
May 21, 2026
8d3f2e1
Expose JSON payloads in e2e BFF fixture
May 21, 2026
7c295ac
Merge e2e fixture JSON body helper
May 21, 2026
d825962
Add action page smoke specs
May 21, 2026
bc72e54
Add deploy and network smoke specs
May 21, 2026
706c853
Add web unit test npm script
May 21, 2026
640adea
Polish remaining empty states
May 21, 2026
20faffe
Add shell navigation smoke e2e
May 21, 2026
97615e3
test: cover ssh key and template actions
May 21, 2026
bc82631
Improve deploy wizard keyboard accessibility
May 21, 2026
fedfcb6
Add local CloudStack e2e backend mock
May 21, 2026
fad36e7
Merge Phase 5f web test script
May 21, 2026
2b34ce9
Merge Phase 5f e2e backend mock
May 21, 2026
a69f6ca
Merge Phase 5f SSH and template smoke specs
May 21, 2026
f877f69
Merge Phase 5f shell navigation smoke
May 21, 2026
7df4ee7
Merge Phase 5f deploy wizard accessibility
May 21, 2026
000aa6d
Merge Phase 5f empty state polish
May 21, 2026
a83d44b
Add settings pages smoke coverage
May 21, 2026
f2f2d63
Merge Phase 5g settings smoke coverage
May 21, 2026
24c167d
Add core admin page BFF e2e coverage
May 21, 2026
50d7b12
Document e2e backend mock harness
May 21, 2026
02d102b
Merge Phase 5g e2e harness docs
May 21, 2026
da9ec5f
Add ops pages BFF e2e smoke coverage
May 21, 2026
afad9b3
Merge Phase 5g core page data smoke
May 21, 2026
9b3caf4
i18n settings page copy
May 21, 2026
e8c857e
Add detail page BFF e2e smoke tests
May 21, 2026
cd27866
Improve action feedback accessibility
May 21, 2026
287dba3
Add login and logout smoke coverage
May 21, 2026
6c4de61
Merge Phase 5g ops page data smoke
May 21, 2026
8f3c8d4
Merge Phase 5g detail page data smoke
May 21, 2026
fc7ffad
Merge Phase 5g login smoke
May 21, 2026
5a1332b
Merge Phase 5g settings i18n
May 21, 2026
605f4c1
Merge Phase 5g action accessibility feedback
May 21, 2026
950bfd2
Polish login accessibility feedback
May 21, 2026
03733d1
Merge Phase 5h login accessibility feedback
May 21, 2026
df70137
Add alerts for SSH key and template action failures
May 21, 2026
6edc3d7
test: cover Kubernetes detail BFF data
May 21, 2026
ddfea99
Harden CloudStack BFF route core
May 21, 2026
d65a90d
Merge Phase 5h Kubernetes detail data smoke
May 21, 2026
77caeea
test: cover deploy wizard validation edges
May 21, 2026
96b325f
Merge Phase 5h SSH and template alert feedback
May 21, 2026
002478d
Add resource list BFF e2e coverage
May 21, 2026
4755558
Merge Phase 5h BFF route hardening
May 21, 2026
2141141
Merge Phase 5h deploy wizard validation coverage
May 21, 2026
3cabbf7
Extract core page copy to next-intl
May 21, 2026
6a14f85
Merge Phase 5h resource list data smoke
May 21, 2026
64040ba
Merge Phase 5h core page i18n
May 21, 2026
4732a49
Add detail page not-found smoke coverage
May 21, 2026
6e67a0b
test(web): cover action failure alerts
May 21, 2026
dd0eae1
Merge Phase 5i detail not-found smoke
May 21, 2026
a2d1592
Merge Phase 5i action failure smoke
May 21, 2026
5e10703
Document e2e coverage patterns
May 21, 2026
e5f92e7
Merge Phase 5i e2e coverage docs
May 21, 2026
921569c
Extract storage page messages
May 21, 2026
5541faa
Merge Phase 5i storage page i18n
May 21, 2026
b9ebab3
Extract compute page messages
May 21, 2026
33501ee
Extract operations page messages
May 21, 2026
aeb1a76
Extract network security page messages
May 21, 2026
362df7b
Merge Phase 5i compute page i18n
May 21, 2026
4a5ee55
Merge Phase 5i operations page i18n
May 21, 2026
436457a
Merge Phase 5i network page i18n
May 21, 2026
42d213d
Document Phase 5j settings plan
May 21, 2026
1404202
Clarify Phase 5j plan checkpoint
May 21, 2026
22c3278
Make Phase 5j preflight restart-safe
May 21, 2026
78d2c3b
Document non-web cleanup and Java 21 audit
May 21, 2026
0eefe97
Remove narrow non-web dead code
May 21, 2026
0fd0724
Scout Java 21 compatibility risks
May 21, 2026
cd2dc2e
Raise backend Java baseline to 21
May 21, 2026
4bb1711
Merge Java 21 backend baseline
May 21, 2026
9c6eacf
Merge backend dead-code cleanup
May 21, 2026
bf6910c
Merge Java 21 compatibility scout
May 21, 2026
00a68f2
Stabilize Java 21 test runner setup
May 21, 2026
4a08438
test: backfill unit tests for VmTerminationService, VmRuntimeLifecycl…
May 21, 2026
a1e6af2
test: backfill unit tests for VmStopOrchestrationService
May 21, 2026
05556df
Clean up stale backend build artifacts
May 21, 2026
ae86002
Add API success response helper
May 21, 2026
8b44f26
Merge stale backend artifact cleanup
May 21, 2026
4291edf
Merge API success response helper
May 21, 2026
3fd47ba
Add query list response builder
May 21, 2026
f23777c
refactor: add usage date range binder
May 21, 2026
9ef0e49
Merge query list response builder
May 21, 2026
208047a
Merge usage date range binder
May 21, 2026
8f5b323
refactor: share Tungsten Fabric success responses
May 21, 2026
911ba58
Merge Tungsten command response helper
May 21, 2026
da107b9
Extract IPv4 range validation helper
May 21, 2026
c757fdb
Merge IPv4 range validator
May 21, 2026
884b7e0
Extract network offering IP compatibility service
May 21, 2026
ebdbd0d
Use success response helper for dedicated releases
May 21, 2026
bb5a293
Refactor network element API exception mapping
May 21, 2026
161c95c
Merge network offering IP compatibility service
May 21, 2026
6924c87
Merge dedicated release success response helper
May 21, 2026
a8a5016
test: backfill unit tests for KvmLiveStorageMigrationHandler
May 21, 2026
22245a2
test: backfill unit tests for KvmNonLiveStorageMigrationHandler
May 21, 2026
92e3a64
test: backfill unit tests for VmScaleReconfigurationService
May 21, 2026
1bc925a
test: backfill unit tests for ApiAddressVlanResponseService
May 21, 2026
5ab08a5
test: backfill unit tests for ApiHostZoneCapacityResponseService
May 21, 2026
aea2864
test: backfill unit tests for ApiLoadBalancerFirewallResponseService
May 21, 2026
5240451
test: backfill unit tests for VmAssignmentNetworkService
May 21, 2026
aefd28c
test: backfill unit tests for VmCreationNetworkSelectionService
May 21, 2026
4b2c789
test: backfill unit tests for VmExternalDhcpIpFetchService
May 21, 2026
6f5694c
test: backfill unit tests for VmLiveMigrationOrchestrationService
May 21, 2026
5a38422
test: backfill unit tests for VmUpdateOrchestrationService
May 21, 2026
74879b7
Fix Tungsten success response helper integration
May 21, 2026
2b31fca
Merge network element API executor
May 21, 2026
55336e0
refactor: reuse usage date range binder in usage daos
May 21, 2026
b805789
refactor: reuse list response builder in query services
May 21, 2026
3165392
Merge usage date range binder batch 2
May 21, 2026
a23d7ac
Merge query list response builder batch 2
May 21, 2026
3d84a91
refactor: use API executor for NetScaler LB commands
May 21, 2026
20c8659
Merge NetScaler API executor refactor
May 21, 2026
7378d5f
Document backend refactor slice status
May 21, 2026
259ad7f
Merge claude-phase4-test-backfill: backfill unit tests for 15 Phase 4…
May 22, 2026
a635dde
Phase 5b: tighten BFF auth/CSRF surface
May 22, 2026
20f0cc6
Merge claude-phase5b-auth-tightening: BFF security tightening
May 22, 2026
98f7069
chore(web): declare package module type
May 25, 2026
8e43263
Merge Phase 5j package metadata cleanup
May 25, 2026
8a526ae
Add settings landing surface
May 25, 2026
5387583
Add CloudStack security settings
May 25, 2026
3a16a00
Merge Phase 5j settings index
May 25, 2026
c94ba7d
Add CloudStack-backed profile settings
May 25, 2026
8f57ac4
Merge Phase 5j security settings
May 25, 2026
8ff1df6
Add API token settings surface
May 25, 2026
492ca50
Merge Phase 5j profile settings
May 25, 2026
2b5e496
Merge Phase 5j API token settings
May 25, 2026
f09f412
Add Phase 5j settings browser coverage
May 25, 2026
c276b49
Merge Phase 5j settings e2e coverage
May 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
12 changes: 12 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,15 @@ cloudstack/tools/docker/Dockerfile.smokedev
.idea
.git
venv

# Don't ship build outputs or local caches into the build context
**/target
**/node_modules
**/.mvn
**/*.iml
**/.DS_Store
docs
ui/dist
ui/node_modules
tools/marvin/dist
*.log
136 changes: 136 additions & 0 deletions .github/workflows/api-image.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
# Phase 5a: API / management-server container image build
#
# Triggers on any change to Java/Maven source — specifically anything that
# is NOT under ui/** (the UI image workflow handles that path).
#
# Images are tagged: ghcr.io/<owner>/cloudstack-management:<branch>-<sha7>
# ghcr.io/<owner>/cloudstack-management:latest (main only)
#
# The root Dockerfile is a multi-stage Maven → JRE build. It is used
# unmodified here; the UI assets are NOT bundled because the Phase 5a goal
# is to ship two separate images.
#
# TODO: add image vulnerability scanning (e.g. trivy-action) before GA.
# TODO: add SBOM generation (anchore/sbom-action) and Cosign signing.

name: "Phase 5a – API/management image"

on:
push:
branches:
- "modernize-2026**"
- "main"
paths-ignore:
- "ui/**"
- ".github/workflows/ui-image.yml"
- "docs/**"
- "**.md"
pull_request:
branches:
- "modernize-2026**"
- "main"
paths-ignore:
- "ui/**"
- ".github/workflows/ui-image.yml"
- "docs/**"
- "**.md"

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read
packages: write # needed to push to GHCR

env:
REGISTRY: ghcr.io
# TODO: set IMAGE_NAME to your fork org, e.g. ghcr.io/myorg/cloudstack-management
IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/cloudstack-management

jobs:
build-api-image:
name: "Build API/management Docker image"
# The Maven build is CPU/RAM heavy; ubuntu-22.04 has 7 GB RAM + 2 vCPU.
# If the build frequently OOMs consider switching to a larger runner.
runs-on: ubuntu-22.04

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Compute image tags
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.IMAGE_NAME }}
tags: |
type=sha,prefix=${{ github.ref_name }}-,format=short
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}

# -----------------------------------------------------------------------
# Maven layer cache: re-uses ~/.m2 from a previous run so the Buildx
# cache-to/from covers the Docker layer that downloads Maven deps.
# -----------------------------------------------------------------------

# -----------------------------------------------------------------------
# Pre-merge: image is BUILT (cache populated) but NOT pushed.
# Post-merge: the push step is also enabled.
# -----------------------------------------------------------------------

# Pre-merge block — always runs (build + cache, no push)
- name: Build API image (PR — no push)
if: github.event_name == 'pull_request'
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
# Exclude the ui/ source tree from the Docker build context to keep
# the context transfer fast. The API image does not need UI assets.
# TODO: add a .dockerignore entry for ui/ to enforce this at repo level.
push: false
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
# GHA cache keyed on branch so PRs benefit from branch history.
cache-from: |
type=gha,scope=api-image-${{ github.ref_name }}
type=gha,scope=api-image-main
cache-to: type=gha,mode=max,scope=api-image-${{ github.ref_name }}
# Pass build args that the Dockerfile already supports for tuning.
build-args: |
MAVEN_OPTS=-Xmx1g -XX:+TieredCompilation -XX:TieredStopAtLevel=1

# Post-merge block — runs on push to tracked branches, also logs in
- name: Log in to GHCR
if: github.event_name == 'push'
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
# TODO: configure GHCR_TOKEN secret in repo settings
password: ${{ secrets.GHCR_TOKEN }}

- name: Build and push API image (post-merge)
if: github.event_name == 'push'
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: |
type=gha,scope=api-image-${{ github.ref_name }}
type=gha,scope=api-image-main
cache-to: type=gha,mode=max,scope=api-image-${{ github.ref_name }}
build-args: |
MAVEN_OPTS=-Xmx1g -XX:+TieredCompilation -XX:TieredStopAtLevel=1

- name: Image digest
if: github.event_name == 'push'
run: echo "Pushed API image digest ${{ steps.meta.outputs.version }}"
2 changes: 2 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ permissions:

jobs:
build:
# Upstream-only: requires shapeblue/cloudstack-nonoss (proprietary). Forks use fork-ci.yml.
if: github.repository == 'apache/cloudstack'
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
Expand Down
153 changes: 153 additions & 0 deletions .github/workflows/fork-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
# Fork CI: build + unit test on every push and PR.
# Runs without -Dnoredist to avoid the proprietary cloudstack-nonoss dependency.

name: Fork CI

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

permissions:
contents: read
checks: write
pull-requests: write

jobs:
build-and-test:
name: Build & Test (Java ${{ matrix.java }})
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
java: [ '17' ]
steps:
- uses: actions/checkout@v4

- name: Set up JDK ${{ matrix.java }}
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: ${{ matrix.java }}
cache: 'maven'

- name: Show environment
run: |
java -version
mvn -v
free -m
nproc

- name: Build (skip tests)
run: mvn -B -ntp install -DskipTests -T1C

- name: Run unit tests with coverage
run: mvn -B -ntp test -fae -T1C -P quality

- name: Generate aggregate JaCoCo report
if: matrix.java == '17'
run: |
find . -path '*/target/jacoco.exec' -type f | head -5
mvn -B -ntp -pl :cloud-utils jacoco:report || true

- name: Upload JaCoCo coverage reports
if: always() && matrix.java == '17'
uses: actions/upload-artifact@v4
with:
name: jacoco-reports
path: '**/target/site/jacoco/**'
retention-days: 14
if-no-files-found: ignore

- name: Upload surefire reports
if: always()
uses: actions/upload-artifact@v4
with:
name: surefire-reports-jdk${{ matrix.java }}
path: '**/target/surefire-reports/**'
retention-days: 14

- name: Publish test results
if: always()
uses: mikepenz/action-junit-report@v4
with:
report_paths: '**/target/surefire-reports/TEST-*.xml'
fail_on_failure: false
require_tests: false
check_name: Unit Tests (Java ${{ matrix.java }})

quality:
name: Quality checks (advisory)
runs-on: ubuntu-24.04
# Quality checks are advisory — they upload reports but never fail the build.
# As code quality improves we'll progressively raise the bar.
continue-on-error: true
needs: build-and-test
steps:
- uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
cache: 'maven'

- name: Compile (cached)
run: mvn -B -ntp install -DskipTests -T1C

- name: SpotBugs analysis
run: mvn -B -ntp spotbugs:spotbugs -DskipTests -fae || true

- name: PMD analysis
run: mvn -B -ntp pmd:pmd -DskipTests -fae || true

- name: Upload SpotBugs reports
if: always()
uses: actions/upload-artifact@v4
with:
name: spotbugs-reports
path: '**/target/spotbugsXml.xml'
retention-days: 14
if-no-files-found: ignore

- name: Upload PMD reports
if: always()
uses: actions/upload-artifact@v4
with:
name: pmd-reports
path: '**/target/pmd.xml'
retention-days: 14
if-no-files-found: ignore

security:
name: Dependency vulnerability scan
runs-on: ubuntu-24.04
continue-on-error: true
needs: build-and-test
steps:
- uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
cache: 'maven'

- name: OWASP Dependency-Check
run: mvn -B -ntp -P quality org.owasp:dependency-check-maven:check -DskipTests -DfailBuildOnCVSS=11 || true

- name: Upload dependency-check report
if: always()
uses: actions/upload-artifact@v4
with:
name: dependency-check-report
path: '**/target/dependency-check-report.*'
retention-days: 30
if-no-files-found: ignore
Loading
Loading