name: Publish Registries on: workflow_dispatch: inputs: bump: description: Version bump type required: true type: choice options: - patch - minor - major publish_npm: description: Publish deskctl to npm required: true type: boolean default: true publish_crates: description: Publish deskctl to crates.io required: true type: boolean default: false permissions: contents: read jobs: publish: runs-on: ubuntu-latest permissions: contents: write steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: dtolnay/rust-toolchain@stable - uses: actions/setup-node@v4 with: node-version: 22 registry-url: https://registry.npmjs.org - name: Install system dependencies run: sudo apt-get update && sudo apt-get install -y libx11-dev libxtst-dev - name: Compute next version id: version run: | CURRENT=$(grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)"/\1/') IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT" case "${{ inputs.bump }}" in major) MAJOR=$((MAJOR + 1)); MINOR=0; PATCH=0 ;; minor) MINOR=$((MINOR + 1)); PATCH=0 ;; patch) PATCH=$((PATCH + 1)) ;; esac NEW="${MAJOR}.${MINOR}.${PATCH}" TAG="v${NEW}" echo "version=${NEW}" >> "$GITHUB_OUTPUT" echo "tag=${TAG}" >> "$GITHUB_OUTPUT" echo "Bumping ${CURRENT} -> ${NEW} (${TAG})" - name: Bump versions run: | NEW="${{ steps.version.outputs.version }}" CURRENT=$(grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)"/\1/') sed -i "0,/^version = \"${CURRENT}\"/s//version = \"${NEW}\"/" Cargo.toml node -e 'const fs=require("node:fs"); const p="npm/deskctl/package.json"; const pkg=JSON.parse(fs.readFileSync(p,"utf8")); pkg.version=process.argv[1]; fs.writeFileSync(p, JSON.stringify(pkg, null, 2)+"\n");' "$NEW" cargo generate-lockfile - name: Commit, tag, and push run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" git add Cargo.toml Cargo.lock npm/deskctl/package.json git commit -m "release: ${{ steps.version.outputs.tag }} [skip ci]" git tag "${{ steps.version.outputs.tag }}" git push origin main --tags - name: Check current published state id: published run: | VERSION="${{ steps.version.outputs.version }}" if npm view "deskctl@${VERSION}" version >/dev/null 2>&1; then echo "npm=true" >> "$GITHUB_OUTPUT" else echo "npm=false" >> "$GITHUB_OUTPUT" fi if curl -fsSL "https://crates.io/api/v1/crates/deskctl/${VERSION}" >/dev/null 2>&1; then echo "crates=true" >> "$GITHUB_OUTPUT" else echo "crates=false" >> "$GITHUB_OUTPUT" fi - name: Validate npm package run: | mkdir -p ./tmp/npm-pack node npm/deskctl/scripts/validate-package.js npm pack ./npm/deskctl --pack-destination ./tmp/npm-pack >/dev/null - name: Validate crate publish path run: cargo publish --dry-run --locked - name: Publish npm if: inputs.publish_npm && steps.published.outputs.npm != 'true' env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} run: npm publish ./npm/deskctl --access public - name: Publish crates.io if: inputs.publish_crates && steps.published.outputs.crates != 'true' env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} run: cargo publish --locked - name: Summary run: | echo "tag=${{ steps.version.outputs.tag }}" echo "bump=${{ inputs.bump }}" echo "npm_already_published=${{ steps.published.outputs.npm }}" echo "crates_already_published=${{ steps.published.outputs.crates }}"