name: Container Security Scan on: push: branches: [main, master] pull_request: branches: [main, master] jobs: trivy-scan: name: Trivy Container Scan runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 # Build and scan each container image sequentially to avoid OOM. # Scans are BLOCKING (exit-code: 1) — HIGH/CRITICAL CVEs fail the pipeline. # Add base-image CVEs to .trivyignore with justification if needed. - name: Build API image run: docker build -f infrastructure/docker/Dockerfile.api -t mikrotik-api:scan . - name: Scan API image uses: aquasecurity/trivy-action@0.33.1 with: image-ref: "mikrotik-api:scan" format: "table" exit-code: "1" severity: "HIGH,CRITICAL" trivyignores: ".trivyignore" - name: Build Poller image run: docker build -f poller/Dockerfile -t mikrotik-poller:scan ./poller - name: Scan Poller image uses: aquasecurity/trivy-action@0.33.1 with: image-ref: "mikrotik-poller:scan" format: "table" exit-code: "1" severity: "HIGH,CRITICAL" trivyignores: ".trivyignore" - name: Build Frontend image run: docker build -f infrastructure/docker/Dockerfile.frontend -t mikrotik-frontend:scan . - name: Scan Frontend image uses: aquasecurity/trivy-action@0.33.1 with: image-ref: "mikrotik-frontend:scan" format: "table" exit-code: "1" severity: "HIGH,CRITICAL" trivyignores: ".trivyignore"