name: Java - Architecture Validation
on: workflow_call: inputs: runner: description: 'Runner type' required: false type: string default: 'ubuntu-latest' java_version: description: 'Java version' required: false type: string default: '21' java_distribution: description: 'Java distribution' required: false type: string default: 'temurin' upload_diagrams: description: 'Upload architecture diagrams as artifact' required: false type: boolean default: false artifact_retention_days: description: 'Days to retain architecture artifacts' required: false type: number default: 30
outputs: arch_test_result: description: 'Architecture test result (success/failure)' value: ${{ jobs.architecture.outputs.arch_test_result }} diagrams_artifact_name: description: 'Name of uploaded diagrams artifact' value: ${{ jobs.architecture.outputs.diagrams_artifact }}
jobs: architecture: name: Architecture Validation runs-on: ${{ inputs.runner }} timeout-minutes: 15
outputs: arch_test_result: ${{ steps.arch-test.outcome }} diagrams_artifact: ${{ steps.diagrams-info.outputs.name }}
steps: - name: Checkout uses: actions/checkout@v5 with: fetch-depth: 0
- name: Setup JDK ${{ inputs.java_version }} uses: actions/setup-java@v5 with: distribution: ${{ inputs.java_distribution }} java-version: ${{ inputs.java_version }}
- name: Setup Gradle uses: gradle/actions/setup-gradle@v4 with: cache-read-only: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/master' }}
# ============================================ # ARCHUNIT ARCHITECTURE TESTS # ============================================ - name: Run architecture tests id: arch-test env: GH_PACKAGES_USERNAME: ${{ secrets.GH_PACKAGES_USERNAME }} GH_PACKAGES_TOKEN: ${{ secrets.GH_PACKAGES_TOKEN }} run: | echo "Running ArchUnit architecture validation..." ./gradlew test --no-daemon --build-cache --parallel
echo "" >> $GITHUB_STEP_SUMMARY echo "### Architecture Tests" >> $GITHUB_STEP_SUMMARY echo "ArchUnit validation passed." >> $GITHUB_STEP_SUMMARY
# ============================================ # STRUCTURIZR C4 DIAGRAMS # ============================================ - name: Export Structurizr C4 diagrams id: structurizr run: | if ./gradlew tasks --all --no-daemon 2>/dev/null | grep -q "structurizrExport"; then echo "Running Structurizr C4 export..." ./gradlew structurizrExport --no-daemon --build-cache
echo "" >> $GITHUB_STEP_SUMMARY echo "### Structurizr C4 Diagrams" >> $GITHUB_STEP_SUMMARY echo "C4 diagrams exported to PlantUML and Mermaid formats." >> $GITHUB_STEP_SUMMARY else echo "structurizrExport task not found, skipping." fi
# ============================================ # PLANTUML CLASS/PACKAGE DIAGRAMS # ============================================ - name: Generate class and package diagrams id: class-diagrams run: | if ./gradlew tasks --all --no-daemon 2>/dev/null | grep -q "classDiagram"; then echo "Generating PlantUML class and package diagrams..." ./gradlew classDiagram packageDiagram --no-daemon --build-cache || true
echo "" >> $GITHUB_STEP_SUMMARY echo "### Class & Package Diagrams" >> $GITHUB_STEP_SUMMARY echo "PlantUML diagrams generated." >> $GITHUB_STEP_SUMMARY else echo "classDiagram task not found, skipping." fi
# ============================================ # UPLOAD ARCHITECTURE ARTIFACTS # ============================================ - name: Get diagrams artifact info id: diagrams-info if: inputs.upload_diagrams run: | echo "name=architecture-diagrams-${{ github.run_id }}" >> $GITHUB_OUTPUT
- name: Upload architecture diagrams if: inputs.upload_diagrams && always() uses: actions/upload-artifact@v5 with: name: ${{ steps.diagrams-info.outputs.name }} path: architecture/ if-no-files-found: warn retention-days: ${{ inputs.artifact_retention_days }} Java (Spring Boot)· Reusable workflow ·on: workflow_call
Java Architecture
Java - Architecture Validation
.github/workflows/java-architecture.yml