Skip to content

Build - fix(build): add build step to workflows and define build script in package.json #38

Build - fix(build): add build step to workflows and define build script in package.json

Build - fix(build): add build step to workflows and define build script in package.json #38

Workflow file for this run

name: Build & Release
on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:
inputs:
version:
description: "@photostructure/sqlite release: bump version"
required: false
type: choice
options:
- patch
- minor
- major
default: "minor"
run-name: ${{ github.event_name == 'workflow_dispatch' && format('Release - {0}', github.event.inputs.version) || format('Build - {0}', github.event.head_commit.message || github.event.pull_request.title) }}
jobs:
lint:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- run: sudo apt-get update
- run: sudo apt-get install -y clang-tidy bear build-essential
- uses: actions/setup-node@v4
with:
node-version: 20
cache: "npm"
- run: npm ci --ignore-scripts
- run: npm run build:dist
- run: npm run lint
prebuild-mac-win:
strategy:
fail-fast: false
matrix:
os: [macos-14, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: "npm"
- run: npm ci --ignore-scripts
- run: npm run build:native
- uses: actions/upload-artifact@v4
with:
name: prebuilds-${{ matrix.os }}
path: prebuilds/
prebuild-linux-glibc:
strategy:
fail-fast: false
matrix:
arch: [x64, arm64]
runs-on: ubuntu-24.04 # Use newer runner for Docker support
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-qemu
with:
arch: ${{ matrix.arch }}
- run: npm ci --ignore-scripts
- run: TARGET_ARCH=${{ matrix.arch }} npm run build:linux-glibc
- uses: actions/upload-artifact@v4
with:
name: prebuilds-linux-${{ matrix.arch }}-glibc
path: prebuilds/
prebuild-linux-musl:
strategy:
fail-fast: false
matrix:
arch: [x64, arm64]
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-qemu
with:
arch: ${{ matrix.arch }}
- run: |
CONTAINER_NAME="node-sqlite-musl-build-$$"
docker run -d --name "$CONTAINER_NAME" --platform linux/${{ matrix.arch == 'x64' && 'amd64' || 'arm64' }} node:20-alpine sleep 3600
docker cp . "$CONTAINER_NAME:/tmp/project"
docker exec "$CONTAINER_NAME" sh -c "cd /tmp/project && apk add build-base git python3 py3-setuptools --update-cache && npm ci --ignore-scripts && npm run build:native"
docker cp "$CONTAINER_NAME:/tmp/project/prebuilds" . 2>/dev/null || true
docker cp "$CONTAINER_NAME:/tmp/project/build" . 2>/dev/null || true
docker rm -f "$CONTAINER_NAME" >/dev/null
- uses: actions/upload-artifact@v4
with:
name: prebuilds-linux-${{ matrix.arch }}-musl
path: prebuilds/
test-mac-win:
needs: [prebuild-mac-win]
strategy:
fail-fast: false
matrix:
os: [macos-14, windows-latest]
node-version: [20, 22, 23, 24]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
path: ./prebuilds
merge-multiple: true
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: "npm"
- run: npm ci
- run: npm run build:dist
- run: npm test
test-ubuntu:
needs: [prebuild-linux-glibc]
strategy:
fail-fast: false
matrix:
os: [ubuntu-22.04, ubuntu-24.04]
arch: [x64, arm64]
node-version: [20, 22, 23, 24]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-qemu
with:
arch: ${{ matrix.arch }}
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- uses: actions/download-artifact@v4
with:
path: ./prebuilds
merge-multiple: true
- run: npm ci
- run: npm run build:dist
- run: npm test
test-alpine:
needs: [prebuild-linux-musl]
strategy:
fail-fast: false
matrix:
arch: [x64, arm64]
node-version: [20, 22, 23, 24]
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-qemu
with:
arch: ${{ matrix.arch }}
- uses: actions/download-artifact@v4
with:
path: ./prebuilds
merge-multiple: true
- run: |
docker run --rm -v $(pwd):/tmp/project --entrypoint /bin/sh --platform linux/${{ matrix.arch == 'x64' && 'amd64' || 'arm64' }} node:${{ matrix.node-version }}-alpine -c "\
apk add build-base git python3 py3-setuptools --update-cache && \
cd /tmp/project && \
npm ci && \
npm run build:dist && \
npm test"
# Node.js compatibility tests require --experimental-sqlite flag and Node 22+
# We test only on Node 24 as the experimental SQLite API may change between versions
test-api-compatibility:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
node-version: [24]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: "npm"
- run: npm ci
- run: npm run build:dist
- name: Check API compatibility types (TypeScript compile-time validation)
run: npm run lint:api-compat
- name: Run API type compatibility tests (ensures our TypeScript types match node:sqlite)
run: npm run test:api-compat
- name: Run behavioral compatibility tests (validates runtime behavior matches node:sqlite)
run: npm run test:node-compat
publish:
if: ${{ github.event_name == 'workflow_dispatch' }}
runs-on: ubuntu-24.04
needs: [test-mac-win, test-ubuntu, test-alpine, lint, test-api-compatibility]
permissions:
contents: write
packages: write
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
path: ./prebuilds
merge-multiple: true
- uses: actions/setup-node@v4
with:
node-version: lts/*
cache: "npm"
- run: ls -laR ./prebuilds
- run: npm ci
- run: npm run build
# readme: https://github.com/actions/checkout?tab=readme-ov-file#push-a-commit-using-the-built-in-token
# https://chatgpt.com/share/6761e017-9950-800e-ba1e-94d575010f2d
- name: Set up GPG
uses: crazy-max/ghaction-import-gpg@e89d40939c28e39f97cf32126055eeae86ba74ec
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
fingerprint: ${{ secrets.GPG_FINGERPRINT }}
git_config_global: true
git_user_signingkey: true
git_commit_gpgsign: true
git_tag_gpgsign: true
- name: Configure git for publishing
run: |
git config user.name "${{ secrets.GIT_USER_NAME }}"
git config user.email "${{ secrets.GIT_USER_EMAIL }}"
- name: Configure npm for publishing
run: npm config set //registry.npmjs.org/:_authToken ${{ secrets.NPM_TOKEN }}
- name: Publish to npm
run: npm run release -- --ci ${{ github.event.inputs.version }}
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Cleanup GPG keys
if: always()
run: |
gpg --batch --yes --delete-secret-keys ${{ secrets.GPG_FINGERPRINT }}
gpg --batch --yes --delete-keys ${{ secrets.GPG_FINGERPRINT }}
rm -rf ~/.gnupg/
- name: Remove npm token
if: always()
run: npm config delete //registry.npmjs.org/:_authToken