diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml new file mode 100644 index 0000000000..eed6c682e6 --- /dev/null +++ b/.github/workflows/coverage.yaml @@ -0,0 +1,101 @@ +name: Test coverage and TiCS Report +on: + push: + branches: + - ci-tics-main + schedule: # uses last commit on default branch (main) + - cron: "30 0 * * 6" # At 0:30 on Saturday + # temporarily disabling client mode due to quota + # pull_request: + # types: [opened, synchronize, reopened] + +jobs: + test-coverage-tics: + name: Run tests with coverage and generate TiCS report + runs-on: ubuntu-latest + timeout-minutes: 720 + steps: + - uses: actions/checkout@v4 + + - name: Restore node_modules from cache + id: yarn-cache + uses: actions/cache@v4 + with: + path: "**/node_modules" + key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} + + - name: Setup Node.js from .nvmrc + uses: actions/setup-node@v4 + with: + node-version-file: ".nvmrc" + + - name: Install packages if cache is outdated + if: steps.yarn-cache.outputs.cache-hit != 'true' + run: CYPRESS_INSTALL_BINARY=0 yarn install + + - name: Run tests with coverage + run: yarn test-coverage + + - name: Upload coverage report + if: always() + uses: actions/upload-artifact@v4 + with: + name: coverage-report + path: coverage + retention-days: 1 + + - name: Run TICS Analyzer + uses: tiobe/tics-github-action@v3 + with: + # Use 'qserver' mode for weekly runs and on push to ci-tics-main to + # generate reference points + # Use 'client' mode for runs on PRs. Client is a quality gate comparing + # changed files to the reference points and can fail if quality degrades + # See: + # https://github.com/tiobe/tics-github-action?tab=readme-ov-file#tics-github-action + mode: ${{ github.event_name == 'pull_request' && 'client' || 'qserver' }} + project: maas-ui + viewerUrl: https://canonical.tiobe.com/tiobeweb/TICS/api/cfg?name=default + ticsAuthToken: ${{ secrets.TICSAUTHTOKEN }} + installTics: true + tmpdir: /tmp/tics + branchdir: ${{ github.workspace }} + + - name: Upload TICS Report + uses: actions/upload-artifact@v4 + with: + name: tics-report + path: /tmp/tics + retention-days: 7 + + publish-coverage-report: + name: Publish Coverage Report + # if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + needs: test-coverage-tics + continue-on-error: true + + permissions: + id-token: write + pages: write + + steps: + - uses: actions/checkout@v4 + + - name: Download coverage report + uses: actions/download-artifact@v4 + with: + name: coverage-report + path: coverage + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: coverage + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ffd25eaac2..03a07c3fb4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,16 +11,19 @@ jobs: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 + - name: Restore node_modules id: yarn-cache uses: actions/cache@v4 with: path: "**/node_modules" key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} + - name: Use Node.js from .nvmrc uses: actions/setup-node@v4 with: node-version-file: ".nvmrc" + - name: Install if: steps.yarn-cache.outputs.cache-hit != 'true' run: CYPRESS_INSTALL_BINARY=0 yarn install @@ -44,77 +47,7 @@ jobs: - name: Install if: steps.yarn-cache.outputs.cache-hit != 'true' run: CYPRESS_INSTALL_BINARY=0 yarn install - - run: yarn test:ci - - name: Upload coverage report - if: always() - uses: actions/upload-artifact@v4 - with: - name: coverage-report - path: coverage - retention-days: 1 - - publish-coverage-report: - name: Publish Coverage Report - if: github.ref == 'refs/heads/main' - runs-on: ubuntu-latest - needs: test - - permissions: - id-token: write - pages: write - steps: - - uses: actions/checkout@v4 - - - name: Download coverage report - uses: actions/download-artifact@v4 - with: - name: coverage-report - path: coverage - - - name: Setup Pages - uses: actions/configure-pages@v5 - - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - path: coverage - - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 - - tics-report: - name: TICS Report - runs-on: ubuntu-latest - needs: test - steps: - - name: Download coverage report - uses: actions/download-artifact@v4 - with: - name: coverage-report - path: .coverage - - name: Display structure of downloaded files - run: ls -R .coverage - - uses: actions/checkout@v4 - - name: Run TICS Analyzer - uses: tiobe/tics-github-action@v3 - with: - # Use 'qserver' for push to main branch, 'client' for others. See: https://github.com/tiobe/tics-github-action?tab=readme-ov-file#client-default - mode: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && 'qserver' || 'client' }} - project: maas-ui - viewerUrl: https://canonical.tiobe.com/tiobeweb/TICS/api/cfg?name=default - ticsAuthToken: ${{ secrets.TICSAUTHTOKEN }} - installTics: true - tmpdir: /tmp/tics - branchdir: ${{ github.workspace }} - - - name: Upload TICS Report - if: always() - uses: actions/upload-artifact@v4 - with: - name: tics-report - path: /tmp/tics - retention-days: 7 + - run: yarn test build: name: Build diff --git a/package.json b/package.json index 02a8058718..df199e277f 100644 --- a/package.json +++ b/package.json @@ -34,11 +34,9 @@ "sitespeed": "docker run -v \"$(pwd)/sitespeed.io:/sitespeed.io\" --add-host=host.docker.internal:host-gateway sitespeedio/sitespeed.io:25.2.1 --config /sitespeed.io/config.json /sitespeed.io/scripts/machines.js --multi --spa --browsertime.domain=host.docker.internal --browsertime.port=8400 --browsertime.iterations=1", "start": "concurrently \"yarn serve-proxy\" \"yarn serve-react\" \"yarn show-ready\"", "test-cypress": "start-server-and-test start '8401' serve-base 'tcp:8400' cypress-run", - "test-ui": "TZ=UTC vitest", "test:debug": "vitest --inspect-brk test --runInBand --no-cache --testTimeout=100000000", - "test": "yarn test-ui", - "test-coverage": "yarn test-ui -- --coverage", - "test:ci": "yarn test-coverage", + "test": "TZ=UTC yarn vitest", + "test-coverage": "yarn test --coverage", "unlink-components": "yarn unlink react && yarn unlink \"@canonical/react-components\"", "wait-on-ui": "wait-on http-get://0.0.0.0:8400/MAAS/r", "storybook": "storybook dev -p 6006", diff --git a/vitest.config.ts b/vitest.config.ts index 19164de11d..90dcfd7007 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -12,7 +12,13 @@ export default defineConfig({ exclude: [...configDefaults.exclude, "**/tests/**"], clearMocks: true, coverage: { + // use instrumented coverage via istanbul instead of v8 provider: "istanbul", + reporter: [ + ["text"], + ["html"], + ["cobertura", { file: "../.coverage/cobertura-coverage.xml" }], + ], }, }, });