Skip to content

Version Packages (#121) #155

Version Packages (#121)

Version Packages (#121) #155

Workflow file for this run

name: Release
on:
push:
branches:
- main
concurrency: ${{ github.workflow }}-${{ github.ref }}
permissions:
contents: write
pull-requests: write
jobs:
changesets:
name: Changesets
runs-on: ubuntu-latest
outputs:
hasChangesets: ${{ steps.changesets-action.outputs.hasChangesets }}
steps:
- uses: actions/checkout@v5
- uses: oven-sh/setup-bun@v2
- run: bun install
- name: Create Release Pull Request
id: changesets-action
uses: changesets/action@v1
with:
version: bun run version
title: "Release"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
version:
name: Check versions
runs-on: ubuntu-latest
needs: changesets
if: needs.changesets.outputs.hasChangesets == 'false'
outputs:
cli-version: ${{ steps.check-cli.outputs.version }}
database-shell-version: ${{ steps.check-database-shell.outputs.version }}
openapi-client-version: ${{ steps.check-openapi-client.outputs.version }}
sandbox-version: ${{ steps.check-sandbox.outputs.version }}
scriptable-dns-types-version: ${{ steps.check-scriptable-dns-types.outputs.version }}
steps:
- uses: actions/checkout@v5
- name: Check openapi-client version
id: check-openapi-client
run: |
VERSION=$(node -p "require('./packages/openapi-client/package.json').version")
PUBLISHED=$(npm view @bunny.net/openapi-client version 2>/dev/null || echo "0.0.0")
if [ "$VERSION" != "$PUBLISHED" ]; then
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "New version detected: $VERSION (published: $PUBLISHED)"
else
echo "No version change: $VERSION"
fi
- name: Check sandbox version
id: check-sandbox
run: |
VERSION=$(node -p "require('./packages/sandbox/package.json').version")
PUBLISHED=$(npm view @bunny.net/sandbox version 2>/dev/null || echo "0.0.0")
if [ "$VERSION" != "$PUBLISHED" ]; then
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "New version detected: $VERSION (published: $PUBLISHED)"
else
echo "No version change: $VERSION"
fi
- name: Check scriptable-dns-types version
id: check-scriptable-dns-types
run: |
VERSION=$(node -p "require('./packages/scriptable-dns-types/package.json').version")
PUBLISHED=$(npm view @bunny.net/scriptable-dns-types version 2>/dev/null || echo "0.0.0")
if [ "$VERSION" != "$PUBLISHED" ]; then
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "New version detected: $VERSION (published: $PUBLISHED)"
else
echo "No version change: $VERSION"
fi
- name: Check CLI version
id: check-cli
run: |
VERSION=$(node -p "require('./packages/cli/package.json').version")
PUBLISHED=$(npm view @bunny.net/cli version 2>/dev/null || echo "0.0.0")
if [ "$VERSION" != "$PUBLISHED" ]; then
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "New version detected: $VERSION (published: $PUBLISHED)"
else
echo "No version change: $VERSION"
fi
- name: Check database-shell version
id: check-database-shell
run: |
VERSION=$(node -p "require('./packages/database-shell/package.json').version")
PUBLISHED=$(npm view @bunny.net/database-shell version 2>/dev/null || echo "0.0.0")
if [ "$VERSION" != "$PUBLISHED" ]; then
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "New version detected: $VERSION (published: $PUBLISHED)"
else
echo "No version change: $VERSION"
fi
build-cli-binaries:
name: Build ${{ matrix.npm-pkg }}
needs: version
if: needs.version.outputs.cli-version
strategy:
matrix:
include:
- target: bun-linux-x64
os: ubuntu-latest
npm-pkg: cli-linux-x64
binary: bunny
- target: bun-linux-arm64
os: ubuntu-latest
npm-pkg: cli-linux-arm64
binary: bunny
- target: bun-darwin-x64
os: macos-latest
npm-pkg: cli-darwin-x64
binary: bunny
- target: bun-darwin-arm64
os: macos-latest
npm-pkg: cli-darwin-arm64
binary: bunny
- target: bun-windows-x64
os: ubuntu-latest
npm-pkg: cli-windows-x64
binary: bunny.exe
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v5
- uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.11"
- run: bun install
- name: Build database studio
run: bun run --filter @bunny.net/database-studio build:client
- name: Build binary
run: bun build packages/cli/src/index.ts --compile --minify --sourcemap --target=${{ matrix.target }} --outfile ${{ matrix.binary }}
- name: Prepare npm package
run: cp ${{ matrix.binary }} packages/${{ matrix.npm-pkg }}/
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.npm-pkg }}
path: packages/${{ matrix.npm-pkg }}/
if-no-files-found: error
build-cli-baseline:
name: Build ${{ matrix.binary }}
needs: version
if: needs.version.outputs.cli-version
strategy:
matrix:
include:
- target: bun-linux-x64-baseline
os: ubuntu-latest
binary: bunny-linux-x64-baseline
- target: bun-darwin-x64-baseline
os: macos-latest
binary: bunny-darwin-x64-baseline
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v5
- uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.11"
- run: bun install
- name: Build database studio
run: bun run --filter @bunny.net/database-studio build:client
# Baseline targets avoid AVX2, so the binary runs on pre-Haswell x64 CPUs that crash the default build with SIGILL.
- name: Build binary
run: bun build packages/cli/src/index.ts --compile --minify --sourcemap --target=${{ matrix.target }} --outfile ${{ matrix.binary }}
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.binary }}
path: ${{ matrix.binary }}
if-no-files-found: error
build-database-shell-binaries:
name: Build ${{ matrix.npm-pkg }}
needs: version
if: needs.version.outputs.database-shell-version
strategy:
matrix:
include:
- target: bun-linux-x64
os: ubuntu-latest
npm-pkg: database-shell-linux-x64
binary: bsql
- target: bun-linux-arm64
os: ubuntu-latest
npm-pkg: database-shell-linux-arm64
binary: bsql
- target: bun-darwin-x64
os: macos-latest
npm-pkg: database-shell-darwin-x64
binary: bsql
- target: bun-darwin-arm64
os: macos-latest
npm-pkg: database-shell-darwin-arm64
binary: bsql
- target: bun-windows-x64
os: ubuntu-latest
npm-pkg: database-shell-windows-x64
binary: bsql.exe
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v5
- uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.11"
- run: bun install
- name: Build binary
run: bun build packages/database-shell/src/cli.ts --compile --minify --sourcemap --target=${{ matrix.target }} --outfile ${{ matrix.binary }}
- name: Prepare npm package
run: cp ${{ matrix.binary }} packages/${{ matrix.npm-pkg }}/
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.npm-pkg }}
path: packages/${{ matrix.npm-pkg }}/
if-no-files-found: error
build-database-shell-baseline:
name: Build ${{ matrix.binary }}
needs: version
if: needs.version.outputs.database-shell-version
strategy:
matrix:
include:
- target: bun-linux-x64-baseline
os: ubuntu-latest
binary: bsql-linux-x64-baseline
- target: bun-darwin-x64-baseline
os: macos-latest
binary: bsql-darwin-x64-baseline
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v5
- uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.11"
- run: bun install
# Baseline targets avoid AVX2, so the binary runs on pre-Haswell x64 CPUs that crash the default build with SIGILL.
- name: Build binary
run: bun build packages/database-shell/src/cli.ts --compile --minify --sourcemap --target=${{ matrix.target }} --outfile ${{ matrix.binary }}
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.binary }}
path: ${{ matrix.binary }}
if-no-files-found: error
publish-cli:
name: Publish CLI
runs-on: ubuntu-latest
needs:
- version
- build-cli-binaries
- build-cli-baseline
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: "22"
registry-url: "https://registry.npmjs.org"
- name: Download all platform artifacts
uses: actions/download-artifact@v4
with:
path: npm-artifacts
- name: Copy binaries into npm packages
run: |
for pkg in cli-linux-x64 cli-linux-arm64 cli-darwin-x64 cli-darwin-arm64 cli-windows-x64; do
cp -r npm-artifacts/$pkg/* packages/$pkg/
done
# x64 packages also ship a baseline binary the wrapper falls back to on AVX2-less CPUs.
- name: Copy baseline binaries into x64 npm packages
run: |
cp npm-artifacts/bunny-linux-x64-baseline/bunny-linux-x64-baseline packages/cli-linux-x64/bunny-baseline
cp npm-artifacts/bunny-darwin-x64-baseline/bunny-darwin-x64-baseline packages/cli-darwin-x64/bunny-baseline
- name: Set execute permissions
run: |
chmod +x packages/cli-linux-x64/bunny
chmod +x packages/cli-linux-arm64/bunny
chmod +x packages/cli-darwin-x64/bunny
chmod +x packages/cli-darwin-arm64/bunny
chmod +x packages/cli-linux-x64/bunny-baseline
chmod +x packages/cli-darwin-x64/bunny-baseline
- name: Publish platform packages
run: |
for pkg in cli-linux-x64 cli-linux-arm64 cli-darwin-x64 cli-darwin-arm64 cli-windows-x64; do
cd packages/$pkg
npm publish --access public
cd ../..
done
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Publish @bunny.net/cli
run: |
cd packages/cli
npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Rename binaries for release
run: |
mv npm-artifacts/cli-linux-x64/bunny npm-artifacts/cli-linux-x64/bunny-linux-x64
mv npm-artifacts/cli-linux-arm64/bunny npm-artifacts/cli-linux-arm64/bunny-linux-arm64
mv npm-artifacts/cli-darwin-x64/bunny npm-artifacts/cli-darwin-x64/bunny-darwin-x64
mv npm-artifacts/cli-darwin-arm64/bunny npm-artifacts/cli-darwin-arm64/bunny-darwin-arm64
mv npm-artifacts/cli-windows-x64/bunny.exe npm-artifacts/cli-windows-x64/bunny-windows-x64.exe
- name: Create GitHub release
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ needs.version.outputs.cli-version }}
name: v${{ needs.version.outputs.cli-version }}
generate_release_notes: true
files: |
npm-artifacts/cli-linux-x64/bunny-linux-x64
npm-artifacts/cli-linux-arm64/bunny-linux-arm64
npm-artifacts/cli-darwin-x64/bunny-darwin-x64
npm-artifacts/cli-darwin-arm64/bunny-darwin-arm64
npm-artifacts/cli-windows-x64/bunny-windows-x64.exe
npm-artifacts/bunny-linux-x64-baseline/bunny-linux-x64-baseline
npm-artifacts/bunny-darwin-x64-baseline/bunny-darwin-x64-baseline
fail_on_unmatched_files: true
publish-database-shell:
name: Publish database-shell
runs-on: ubuntu-latest
needs:
- version
- build-database-shell-binaries
- build-database-shell-baseline
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: "22"
registry-url: "https://registry.npmjs.org"
- name: Download all platform artifacts
uses: actions/download-artifact@v4
with:
path: npm-artifacts
- name: Copy binaries into npm packages
run: |
for pkg in database-shell-linux-x64 database-shell-linux-arm64 database-shell-darwin-x64 database-shell-darwin-arm64 database-shell-windows-x64; do
cp -r npm-artifacts/$pkg/* packages/$pkg/
done
# x64 packages also ship a baseline binary the wrapper falls back to on AVX2-less CPUs.
- name: Copy baseline binaries into x64 npm packages
run: |
cp npm-artifacts/bsql-linux-x64-baseline/bsql-linux-x64-baseline packages/database-shell-linux-x64/bsql-baseline
cp npm-artifacts/bsql-darwin-x64-baseline/bsql-darwin-x64-baseline packages/database-shell-darwin-x64/bsql-baseline
- name: Set execute permissions
run: |
chmod +x packages/database-shell-linux-x64/bsql
chmod +x packages/database-shell-linux-arm64/bsql
chmod +x packages/database-shell-darwin-x64/bsql
chmod +x packages/database-shell-darwin-arm64/bsql
chmod +x packages/database-shell-linux-x64/bsql-baseline
chmod +x packages/database-shell-darwin-x64/bsql-baseline
- name: Publish platform packages
run: |
for pkg in database-shell-linux-x64 database-shell-linux-arm64 database-shell-darwin-x64 database-shell-darwin-arm64 database-shell-windows-x64; do
cd packages/$pkg
npm publish --access public
cd ../..
done
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Publish @bunny.net/database-shell
run: |
cd packages/database-shell
npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
publish-openapi-client:
name: Publish openapi-client
runs-on: ubuntu-latest
needs: version
if: needs.version.outputs.openapi-client-version
steps:
- uses: actions/checkout@v5
- uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.11"
- run: bun install
- name: Build package
run: bun run --filter @bunny.net/openapi-client build
- uses: actions/setup-node@v5
with:
node-version: "22"
registry-url: "https://registry.npmjs.org"
- name: Publish @bunny.net/openapi-client
run: |
cd packages/openapi-client
npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
publish-sandbox:
name: Publish sandbox
runs-on: ubuntu-latest
needs: version
if: needs.version.outputs.sandbox-version
steps:
- uses: actions/checkout@v5
- uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.11"
- run: bun install
# Sandbox's build type-checks against openapi-client's package exports (dist/), so build it first.
- name: Build openapi-client
run: bun run --filter @bunny.net/openapi-client build
- name: Build package
run: bun run --filter @bunny.net/sandbox build
# bun publish (not npm) rewrites the workspace:* dependency on @bunny.net/openapi-client to a real version.
- name: Publish @bunny.net/sandbox
run: |
cd packages/sandbox
bun publish --access public
env:
NPM_CONFIG_TOKEN: ${{ secrets.NPM_TOKEN }}
publish-scriptable-dns-types:
name: Publish scriptable-dns-types
runs-on: ubuntu-latest
needs: version
if: needs.version.outputs.scriptable-dns-types-version
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: "22"
registry-url: "https://registry.npmjs.org"
- name: Publish @bunny.net/scriptable-dns-types
run: |
cd packages/scriptable-dns-types
npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}