01 - Publish #813
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: 01 - Publish | |
| env: | |
| prefix: # 'v4-', when v5 is released | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| increment: | |
| type: boolean | |
| description: 'Would you like to set the version before publishing? (Else: The current version from the code repository will be used.)' | |
| default: true | |
| tag: | |
| type: choice | |
| description: Which NPM tag should be assigned? | |
| options: | |
| - dev | |
| - next | |
| - latest | |
| version: # see https://github.com/lerna/lerna/tree/main/libs/commands/version#semver-bump | |
| type: choice | |
| description: SemVer keyword for version bump | |
| options: | |
| - prerelease | |
| - prepatch | |
| - patch | |
| - preminor | |
| - minor | |
| label: # see https://github.com/lerna/lerna/tree/main/libs/commands/version#--preid | |
| type: choice | |
| description: SemVer pre release label (optional) | |
| options: | |
| - rc | |
| - beta | |
| - alpha | |
| permissions: | |
| contents: read | |
| id-token: write | |
| jobs: | |
| publish: | |
| if: github.repository == 'public-ui/kolibri' | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/create-github-app-token@v3 | |
| id: app-token | |
| with: | |
| app-id: ${{ secrets.APP_ID }} | |
| private-key: ${{ secrets.PRIVATE_KEY }} | |
| - name: Get GitHub App User ID | |
| id: get-user-id | |
| run: echo "user-id=$(gh api "/users/${{ steps.app-token.outputs.app-slug }}[bot]" --jq .id)" >> "$GITHUB_OUTPUT" | |
| env: | |
| GH_TOKEN: ${{ steps.app-token.outputs.token }} | |
| - uses: actions/checkout@v6 | |
| with: | |
| token: ${{ steps.app-token.outputs.token }} | |
| - name: Install Node.js | |
| uses: actions/setup-node@v6 | |
| with: | |
| node-version: 24 | |
| registry-url: https://registry.npmjs.org | |
| - name: Install pnpm | |
| uses: pnpm/action-setup@v5 | |
| id: pnpm-install | |
| with: | |
| version: 10 | |
| - name: Get pnpm store directory | |
| id: pnpm-cache | |
| shell: bash | |
| run: echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT | |
| - uses: actions/cache@v5 | |
| name: Setup pnpm cache | |
| with: | |
| path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} | |
| key: ${{ runner.os }}-pnpm-store | |
| restore-keys: | | |
| ${{ runner.os }}-pnpm-store | |
| - name: Install | |
| run: pnpm i --frozen-lockfile | |
| - name: Configure Git user | |
| run: | | |
| git config --local user.email "${{ steps.get-user-id.outputs.user-id }}+${{ steps.app-token.outputs.app-slug }}[bot]@users.noreply.github.com" | |
| git config --local user.name "${{ steps.app-token.outputs.app-slug }}[bot]" | |
| - name: Bump versions without dev-tag and with git push | |
| if: github.event.inputs.increment == 'true' && github.event.inputs.tag != 'dev' | |
| run: 'HUSKY=0 npx lerna version ${{github.event.inputs.version}} --preid=${{github.event.inputs.label}} --no-private --tag-version-prefix="" -m "chore: release %v" -y --force-publish' | |
| - name: Bump versions with dev-tag and without git push | |
| if: github.event.inputs.increment == 'true' && github.event.inputs.tag == 'dev' | |
| run: 'HUSKY=0 npx lerna version prerelease --preid=$GITHUB_SHA --no-private --tag-version-prefix="" -m "chore: release %v" -y --force-publish --no-push' | |
| - name: Build | |
| run: pnpm -r build | |
| - name: Build and publish components | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/components | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish adapter angular v19 | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/adapters/angular/v19 | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish adapter angular v20 | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/adapters/angular/v20 | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish adapter angular v21 | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/adapters/angular/v21 | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish adapter react | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/adapters/react | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish adapter react-v19 | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/adapters/react-v19 | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish adapter react-standalone | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/adapters/react-standalone | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish adapter solid | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/adapters/solid | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish adapter svelte | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/adapters/svelte | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish adapter vue | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/adapters/vue | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish adapter preact | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/adapters/preact | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish adapter hydrate | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/adapters/hydrate | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish adapter react hook form | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/adapters/react-hook-form-adapter | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish tools kolibri-cli | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/tools/kolibri-cli | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish tools mcp | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/tools/mcp | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish theme default | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/themes/default | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish theme ecl | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/themes/ecl | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish theme kern | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/themes/kern | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish theme bwst | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/themes/bwst | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish themes | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/themes | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish sample react | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/samples/react | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - name: Build and publish tools visual-tests | |
| run: pnpm publish --access public --provenance --no-git-checks --tag ${{env.prefix}}${{github.event.inputs.tag}} || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/tools/visual-tests | |
| env: | |
| NODE_AUTH_TOKEN: ${{secrets.NPMJS_GRANULAR_TOKEN}} | |
| NPM_CONFIG_PROVENANCE: true | |
| - uses: actions/setup-node@v6 | |
| with: | |
| node-version: 24 | |
| registry-url: https://npm.pkg.github.com | |
| - name: Publish sample react | |
| run: npm publish --access restricted || echo "⚠️ Publish skipped – package already exists" | |
| working-directory: packages/samples/react | |
| env: | |
| NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| # Manage version tags for Netlify deployments | |
| - name: Update version tag for stable deployments | |
| if: github.event.inputs.tag == 'latest' | |
| run: | | |
| VERSION_TAG="${{env.prefix}}${{github.event.inputs.tag}}" | |
| echo "Updating version tag: $VERSION_TAG" | |
| git tag -d "$VERSION_TAG" 2>/dev/null || true | |
| git push origin ":refs/tags/$VERSION_TAG" 2>/dev/null || true | |
| git tag -a "$VERSION_TAG" -m "Update $VERSION_TAG to $(git describe --tags --abbrev=0)" | |
| git push origin "$VERSION_TAG" | |
| echo "Successfully updated tag $VERSION_TAG" |