name: CI on: push: branches: [main] tags: ['v*'] pull_request: branches: [main] workflow_dispatch: jobs: verify: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: { node-version: '25' } - name: Enable Corepack run: | corepack enable corepack prepare yarn@4.11.0 --activate - uses: actions/cache@v4 with: path: .yarn/cache key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: ${{ runner.os }}-yarn- - run: yarn install --immutable - name: Lint + format check run: yarn lint - name: Type check run: yarn check - name: Unit tests + coverage run: yarn test:coverage - name: Build run: yarn build - name: Size budgets run: yarn size e2e: needs: verify runs-on: ubuntu-latest container: image: mcr.microsoft.com/playwright:v1.61.1-jammy steps: - uses: actions/checkout@v4 - name: Enable Corepack run: | corepack enable corepack prepare yarn@4.11.0 --activate - uses: actions/cache@v4 with: path: .yarn/cache key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: ${{ runner.os }}-yarn- - run: yarn install --immutable - name: Build run: yarn build - name: E2E (chromium + firefox) timeout-minutes: 15 run: yarn test:e2e publish: needs: [verify, e2e] runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/v') steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: { node-version: '25' } - name: Check token is present env: NODE_AUTH_TOKEN: ${{ secrets.CAROUSEL_PACKAGE }} run: | if [ -z "$NODE_AUTH_TOKEN" ]; then echo "NODE_AUTH_TOKEN is EMPTY — secret not injected" exit 1 fi echo "NODE_AUTH_TOKEN length: ${#NODE_AUTH_TOKEN}" - name: Enable Corepack run: | corepack enable corepack prepare yarn@4.11.0 --activate - run: yarn install --immutable - name: Assert tag matches package.json version run: | TAG="${GITHUB_REF_NAME#v}" PKG="$(node -p "require('./package.json').version")" test "$TAG" = "$PKG" || { echo "tag v$TAG != package.json $PKG"; exit 1; } - name: Build run: yarn build - name: Publish to Gitea registry env: NODE_AUTH_TOKEN: ${{ secrets.CAROUSEL_PACKAGE }} run: yarn npm publish