name: Test and SonarQube on: push: branches: [main] workflow_dispatch: permissions: contents: read jobs: quality: runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v4 with: # Full history so SonarQube can read blame data for new-code detection. fetch-depth: 0 - name: Set up Node uses: actions/setup-node@v4 with: node-version: lts/* cache: npm - name: Install dependencies run: npm ci - name: Type check run: npm run type-check - name: Lint run: npm run lint - name: Unit tests run: npm run test:unit # continue-on-error bleibt auch mit gesetztem SONAR_TOKEN sinnvoll: der selbst # gehostete SonarQube-Server kann mal nicht erreichbar sein, ohne dass das den Rest # des Workflows mitreissen soll. Ein "if:" auf "secrets.SONAR_TOKEN != ''" waere die # naheliegende Alternative fuer den Fall eines fehlenden Secrets, macht den Workflow # bei diesem Runner aber ungueltig (0s-Fehlschlag ohne jeden Job-Log) -- deshalb # bewusst nur continue-on-error statt eines bedingten Schritts. # # sonar.javascript.node.maxspace=4096: der Standard-Node-Heap der Analyse-Bridge # (rund 2,2 GB) reicht auf dem GitHub-Hosted-Runner fuer dieses Repo nicht -- # WeeklyView.tsx allein ist riesig. Ohne das stirbt die Bridge mit "Node.js process # running out of memory", der Scan schlaegt fehl (aufgefangen von continue-on-error, # aber dann laeuft gar keine Analyse). Live beobachtet beim ersten echten Testlauf # mit gueltigem Token am 12.09.2026 -- exakt dieselbe Ursachenklasse wie der # OOM-Absturz von "next build" auf dem Produktionscontainer (siehe CHANGELOG v1.119.4). - name: SonarQube scan continue-on-error: true uses: SonarSource/sonarqube-scan-action@v8.1.0 env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} SONAR_HOST_URL: ${{ vars.SONAR_HOST_URL }} with: args: >- -Dsonar.projectKey=mARTin-B78_My-Weekly-ToDo-List_e038f066-0063-4a1e-9c33-03fdd5ab3c3a -Dsonar.sources=src,scripts -Dsonar.exclusions=**/node_modules/**,**/.next/**,**/*.spec.ts -Dsonar.javascript.node.maxspace=4096 -Dsonar.qualitygate.wait=true -Dsonar.qualitygate.timeout=300