name: Publish to npm on: release: types: [published] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: build: runs-on: ubuntu-latest permissions: contents: read steps: - uses: actions/checkout@v6 - uses: oven-sh/setup-bun@v2 with: bun-version: latest - uses: actions/setup-node@v6 with: node-version: "22" cache: npm - run: npm ci - run: npm run build - run: npm run prettier test: runs-on: ubuntu-latest permissions: contents: read steps: - uses: actions/checkout@v6 - uses: oven-sh/setup-bun@v2 with: bun-version: latest - uses: actions/setup-node@v6 with: node-version: "22" cache: npm - run: npm ci - run: npm test # All publish jobs depend directly on [build, test] (not on each other) so # they all enter "waiting for approval" together and can be approved in a # single "Review deployments" click. publish: runs-on: ubuntu-latest if: github.event_name == 'release' environment: Release needs: [build, test] permissions: contents: read id-token: write steps: - uses: actions/checkout@v6 - uses: oven-sh/setup-bun@v2 with: bun-version: latest - uses: actions/setup-node@v6 with: node-version: "22" cache: npm registry-url: "https://registry.npmjs.org" - run: npm ci - name: Determine npm tag id: npm-tag run: | VERSION=$(node -p "require('./package.json').version") # Check if this is a beta release if [[ "$VERSION" == *"-beta"* ]]; then echo "tag=--tag beta" >> $GITHUB_OUTPUT # Check if this release is from a non-main branch (patch/maintenance release) elif [[ "${{ github.event.release.target_commitish }}" != "main" ]]; then # Use "release-X.Y" as tag for old branch releases MAJOR_MINOR=$(echo "$VERSION" | cut -d. -f1,2) echo "tag=--tag release-${MAJOR_MINOR}" >> $GITHUB_OUTPUT else echo "tag=" >> $GITHUB_OUTPUT fi - run: npm publish --provenance --access public ${{ steps.npm-tag.outputs.tag }} env: NODE_AUTH_TOKEN: ${{ secrets.NPM_SECRET }} publish-examples: runs-on: ubuntu-latest if: github.event_name == 'release' environment: Release needs: [build, test] permissions: contents: read id-token: write strategy: fail-fast: false matrix: example: - basic-server-preact - basic-server-react - basic-server-solid - basic-server-svelte - basic-server-vanillajs - basic-server-vue - budget-allocator-server - cohort-heatmap-server - customer-segmentation-server - debug-server - lazy-auth-server - map-server - pdf-server - scenario-modeler-server - shadertoy-server - sheet-music-server - system-monitor-server - threejs-server - transcript-server - video-resource-server - wiki-explorer-server steps: - uses: actions/checkout@v6 - uses: oven-sh/setup-bun@v2 with: bun-version: latest - uses: actions/setup-node@v6 with: node-version: "22" cache: npm registry-url: "https://registry.npmjs.org" - run: npm ci - name: Build example run: npm run build --workspace examples/${{ matrix.example }} - name: Determine npm tag id: npm-tag run: | VERSION=$(node -p "require('./package.json').version") if [[ "$VERSION" == *"-"* ]]; then echo "tag=--tag beta" >> $GITHUB_OUTPUT else echo "tag=" >> $GITHUB_OUTPUT fi - name: Publish example run: npm publish --workspace examples/${{ matrix.example }} --provenance --access public ${{ steps.npm-tag.outputs.tag }} env: NODE_AUTH_TOKEN: ${{ secrets.NPM_SECRET }} publish-mcpb: runs-on: ubuntu-latest if: github.event_name == 'release' environment: Release needs: [build, test] permissions: contents: write steps: - uses: actions/checkout@v6 - uses: oven-sh/setup-bun@v2 with: bun-version: latest - uses: actions/setup-node@v6 with: node-version: "22" cache: npm - run: npm ci - name: Build pdf-server + MCPB bundle run: npm run build:mcpb --workspace examples/pdf-server - name: Upload MCPB to release run: gh release upload "${{ github.event.release.tag_name }}" examples/pdf-server/*.mcpb --clobber env: GH_TOKEN: ${{ github.token }}