name: Mutation sweep on: schedule: - cron: "47 4 * * *" workflow_dispatch: permissions: contents: read concurrency: group: mutation-${{ github.ref }} cancel-in-progress: false env: HUSKY: "0" jobs: mutation: name: Mutation sweep (${{ matrix.suite }}) runs-on: ubuntu-latest timeout-minutes: 60 strategy: fail-fast: false max-parallel: 2 matrix: include: - suite: reverse-tools config: stryker.config.mjs - suite: reverse-tools-semantics config: stryker.semantics.config.mjs steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version-file: .nvmrc - name: Cache npm package downloads uses: ./.github/actions/npm-cache - run: npm ci - run: npm run test:prepare - name: Run the complete configuration env: MUTATION_CONFIG: ${{ matrix.config }} run: | node scripts/prepare-reverse-tools-mutation.mjs npx --no-install stryker run "${MUTATION_CONFIG}" - name: Require both reports from the completed sweep env: REPORT_BASE: reports/mutation/${{ matrix.suite }} run: | test -s "${REPORT_BASE}.json" test -s "${REPORT_BASE}.html" - name: Retain available mutation diagnostics if: ${{ !cancelled() }} uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: mutation-${{ matrix.suite }}-${{ github.run_attempt }} path: | reports/mutation/${{ matrix.suite }}.json reports/mutation/${{ matrix.suite }}.html if-no-files-found: warn retention-days: 7