Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add electron build workflow #100

Merged
merged 10 commits into from
Jul 15, 2024
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
293 changes: 293 additions & 0 deletions .github/workflows/Electron.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,293 @@
name: Electron
on:
push:
pull_request:
workflow_dispatch:
repository_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.head_ref || '' }}-${{ github.base_ref || '' }}-${{ github.ref != 'refs/heads/main' || github.sha }}
cancel-in-progress: false

env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
AWS_ACCESS_KEY_ID: ${{secrets.S3_DUCKDB_NODE_ID}}
AWS_SECRET_ACCESS_KEY: ${{secrets.S3_DUCKDB_NODE_KEY}}
AWS_DEFAULT_REGION: us-east-1

jobs:
set-up-npm:
name: Set up NPM
runs-on: ubuntu-20.04
env:
DUCKDB_NODE_BUILD_CACHE: 0
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0

- uses: actions/setup-python@v4
with:
python-version: '3.11'

- name: Setup NPM
shell: bash
run: ./scripts/node_version.sh upload
env:
DUCKDB_NODE_BUILD_CACHE: 0 # create a standalone package
NODE_AUTH_TOKEN: ${{secrets.NODE_AUTH_TOKEN}}

# From `npm show electron time --json` and https://www.electronjs.org/docs/latest/tutorial/electron-timelines
set-up-electron-versions:
name: Set up Electron version
runs-on: ubuntu-20.04
outputs:
matrix: ${{ steps.setup.outputs.matrix }}
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0

- id: setup
run: |
echo "matrix=$(jq -c . < scripts/electron-versions.json)" >> $GITHUB_OUTPUT

- name: Check
run: |
jq . <<< '${{ steps.setup.outputs.matrix }}'

linux-electron:
name: Electron Linux
runs-on: ubuntu-20.04
needs: [set-up-npm, set-up-electron-versions]
env:
TARGET_ARCH: ${{ matrix.target_arch }}
DUCKDB_NODE_BUILD_CACHE: 0
strategy:
matrix:
version: ${{ fromJSON(needs.set-up-electron-versions.outputs.matrix) }}
target_arch: [ x64, arm64 ]

steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0

# Default Python (3.12) doesn't have support for distutils
- uses: actions/setup-python@v4
with:
python-version: '3.10'

- name: Update apt
shell: bash
run: |
sudo apt-get update -y

- name: Install requirements
shell: bash
run: |
sudo apt-get install -y git ninja-build make gcc-multilib g++-multilib wget libssl-dev

- name: Setup Ccache
uses: hendrikmuhs/ccache-action@main
with:
key: ${{ github.job }}
save: ${{ ( github.ref == 'refs/heads/main' || github.repository != 'duckdb/duckdb-node' ) && startsWith(matrix.version.node, '19') }}

- name: Setup
shell: bash
run: ./scripts/node_version.sh
env:
DUCKDB_NODE_BUILD_CACHE: 0 # create a standalone package
NODE_AUTH_TOKEN: ${{secrets.NODE_AUTH_TOKEN}}

- name: Validate Docs
run: npx jsdoc-to-markdown --files lib/*.js >> $GITHUB_STEP_SUMMARY
env:
npm_config_yes: true

- name: Electron ${{ matrix.version.electron }}
shell: bash
run: ./scripts/node_build.sh ${{ matrix.version.node }}
env:
ELECTRON_VERSION: ${{ matrix.version.electron }}

osx-electron-arm64:
name: Electron OSX
runs-on: macos-14
needs: set-up-npm
strategy:
matrix:
version: ${{ fromJSON(needs.set-up-electron-versions.outputs.matrix) }}
target_arch: [ arm64 ]

env:
TARGET_ARCH: ${{ matrix.target_arch }}
DUCKDB_NODE_BUILD_CACHE: 0
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0

# Default Python (3.12) doesn't have support for distutils
- uses: actions/setup-python@v4
with:
python-version: '3.11'

- name: Setup Ccache
uses: hendrikmuhs/ccache-action@main
with:
key: ${{ github.job }}-${{ matrix.target_arch }}
save: ${{ ( github.ref == 'refs/heads/main' || github.repository != 'duckdb/duckdb-node' ) && startsWith(matrix.version.node, '19') }}

- name: Downgrade curl # fixes a bug with the brew curl that lead to failed downloads
shell: bash
run: |
brew uninstall --ignore-dependencies curl
which curl

- name: Setup
shell: bash
run: ./scripts/node_version.sh
env:
NODE_AUTH_TOKEN: ${{secrets.NODE_AUTH_TOKEN}}

- name: Electron ${{ matrix.version.electron }}
shell: bash
run: ./scripts/node_build.sh 18
env:
ELECTRON_VERSION: ${{ matrix.version.electron }}

osx-electron-x64:
name: Electron OSX
runs-on: macos-13
needs: set-up-npm
strategy:
matrix:
version: ${{ fromJSON(needs.set-up-electron-versions.outputs.matrix) }}
target_arch: [ x64 ]

env:
TARGET_ARCH: ${{ matrix.target_arch }}
DUCKDB_NODE_BUILD_CACHE: 0
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0

# Default Python (3.12) doesn't have support for distutils
- uses: actions/setup-python@v4
with:
python-version: '3.11'

- name: Setup Ccache
uses: hendrikmuhs/ccache-action@main
with:
key: ${{ github.job }}-${{ matrix.target_arch }}
save: ${{ ( github.ref == 'refs/heads/main' || github.repository != 'duckdb/duckdb-node' ) && startsWith(matrix.version.node, '19') }}

- name: Downgrade curl # fixes a bug with the brew curl that lead to failed downloads
shell: bash
run: |
brew uninstall --ignore-dependencies curl
which curl

- name: Setup
shell: bash
run: ./scripts/node_version.sh
env:
NODE_AUTH_TOKEN: ${{secrets.NODE_AUTH_TOKEN}}

- name: Electron ${{ matrix.version.electron }}
shell: bash
run: ./scripts/node_build.sh 18
env:
ELECTRON_VERSION: ${{ matrix.version.electron }}

win-electron:
name: node.js Windows
runs-on: windows-latest
needs: set-up-npm
continue-on-error: ${{ !startsWith(matrix.version.node, '18') && !startsWith(matrix.version.node, '20') && !startsWith(matrix.version.node, '21') }}
env:
npm_config_msvs_version: 2019

strategy:
matrix:
target_arch: [ arm64 ]
version: ${{ fromJSON(needs.set-up-electron-versions.outputs.matrix) }}

steps:
# Default Python (3.12) doesn't have support for distutils
- uses: actions/setup-python@v4
with:
python-version: '3.11'

- uses: actions/checkout@v3
with:
fetch-depth: 0

- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: 18

- name: Versions
shell: bash
run: |
systeminfo
node -v
npm -v

- name: Windows Build Tools
shell: bash
run: |
choco install visualstudio2019-workload-vctools -y

- name: Node Version
shell: bash
run: ./scripts/node_version.sh
env:
NODE_AUTH_TOKEN: ${{secrets.NODE_AUTH_TOKEN}}

- name: Setup Ccache
uses: hendrikmuhs/ccache-action@main
with:
key: ${{ github.job }}-${{ matrix.version.node }}
save: ${{ github.ref == 'refs/heads/main' || github.repository != 'duckdb/duckdb-node' }}
variant: sccache

- name: Electron
shell: bash
run: ./scripts/node_build_win.sh
env:
ELECTRON_VERSION: ${{ matrix.version.electron }}

test_matrix:
needs:
- linux-electron
- osx-electron-arm64
- osx-electron-x64
- win-electron
strategy:
matrix:
os: [windows-latest, ubuntu-latest, ubuntu-22.04, ubuntu-20.04, windows-2019, macos-12, macos-13, macos-14]
version: [20]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.version }}

- uses: actions/checkout@v3
with:
sparse-checkout: examples

- name: Install duckdb
run: |
npm install duckdb@next

- name: Run minor test
shell: bash
run: |
node examples/example.js
64 changes: 64 additions & 0 deletions scripts/electron-versions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
[
{ "electron": "18.3.9", "node": "16.13" },
{ "electron": "19.0.9", "node": "16.14" },
{ "electron": "19.1.9", "node": "16.14" },
{ "electron": "20.0.3", "node": "16.15" },
{ "electron": "20.1.4", "node": "16.15" },
{ "electron": "20.2.0", "node": "16.15" },
{ "electron": "20.3.9", "node": "16.15" },
{ "electron": "21.0.1", "node": "16.16" },
{ "electron": "21.1.1", "node": "16.16" },
{ "electron": "21.2.3", "node": "16.16" },
{ "electron": "21.3.5", "node": "16.16" },
{ "electron": "21.4.4", "node": "16.16" },
{ "electron": "22.0.3", "node": "16.17" },
{ "electron": "22.1.0", "node": "16.17" },
{ "electron": "22.2.1", "node": "16.17" },
{ "electron": "22.3.9", "node": "16.17" },
{ "electron": "23.0.0", "node": "18.12" },
{ "electron": "23.1.4", "node": "18.12" },
{ "electron": "23.2.4", "node": "18.12" },
{ "electron": "23.3.9", "node": "18.12" },
{ "electron": "24.0.0", "node": "18.14" },
{ "electron": "24.1.3", "node": "18.14" },
{ "electron": "24.2.0", "node": "18.14" },
{ "electron": "24.3.1", "node": "18.14" },
{ "electron": "24.4.1", "node": "18.14" },
{ "electron": "24.5.1", "node": "18.14" },
{ "electron": "24.6.5", "node": "18.14" },
{ "electron": "24.7.1", "node": "18.14" },
{ "electron": "24.8.8", "node": "18.14" },
{ "electron": "25.0.1", "node": "18.15" },
{ "electron": "25.1.1", "node": "18.15" },
{ "electron": "25.2.0", "node": "18.15" },
{ "electron": "25.3.2", "node": "18.15" },
{ "electron": "25.4.0", "node": "18.15" },
{ "electron": "25.5.0", "node": "18.15" },
{ "electron": "25.6.0", "node": "18.15" },
{ "electron": "25.7.0", "node": "18.15" },
{ "electron": "25.8.4", "node": "18.15" },
{ "electron": "25.9.8", "node": "18.15" },
{ "electron": "26.0.0", "node": "18.16" },
{ "electron": "26.1.0", "node": "18.16" },
{ "electron": "26.2.4", "node": "18.16" },
{ "electron": "26.3.0", "node": "18.16" },
{ "electron": "26.4.3", "node": "18.16" },
{ "electron": "26.5.0", "node": "18.16" },
{ "electron": "26.6.9", "node": "18.16" },
{ "electron": "27.0.4", "node": "18.17" },
{ "electron": "27.1.3", "node": "18.17" },
{ "electron": "27.2.4", "node": "18.17" },
{ "electron": "27.3.9", "node": "18.17" },
{ "electron": "28.0.0", "node": "18.18" },
{ "electron": "28.1.4", "node": "18.18" },
{ "electron": "28.2.9", "node": "18.18" },
{ "electron": "28.3.3", "node": "18.18" },
{ "electron": "29.0.1", "node": "20.9" },
{ "electron": "29.1.6", "node": "20.9" },
{ "electron": "29.2.0", "node": "20.9" },
{ "electron": "29.3.3", "node": "20.9" },
{ "electron": "29.4.3", "node": "20.9" },
{ "electron": "30.0.9", "node": "20.11" },
{ "electron": "30.1.2", "node": "20.11" },
{ "electron": "31.0.2", "node": "20.14" }
]
12 changes: 12 additions & 0 deletions scripts/node_build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,18 @@ if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ] && [[ "$TARGET_ARCH" == "arm6
export CXX=aarch64-linux-gnu-g++
fi

if [ -n "$ELECTRON_VERSION" ] ; then
# Electron's version.
export npm_config_target="$ELECTRON_VERSION"
# The architecture of your machine
export npm_config_arch="$TARGET_ARCH"
export npm_config_target_arch="$TARGET_ARCH"
# Download headers for Electron.
export npm_config_disturl=https://electronjs.org/headers
# Tell node-pre-gyp that we are building for Electron.
export npm_config_runtime=electron
fi

npm install --build-from-source --target_arch="$TARGET_ARCH"

./node_modules/.bin/node-pre-gyp reveal --target_arch="$TARGET_ARCH"
Expand Down
12 changes: 12 additions & 0 deletions scripts/node_build_win.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,18 @@ which node

make clean

if [ -n "$ELECTRON_VERSION" ] ; then
# Electron's version.
export npm_config_target="$ELECTRON_VERSION"
# The architecture of your machine
export npm_config_arch="$TARGET_ARCH"
export npm_config_target_arch="$TARGET_ARCH"
# Download headers for Electron.
export npm_config_disturl=https://electronjs.org/headers
# Tell node-pre-gyp that we are building for Electron.
export npm_config_runtime=electron
fi

npm install --build-from-source
# no tests on releases
if [[ ! "$GITHUB_REF" =~ ^(refs/tags/v.+)$ ]] ; then
Expand Down
Loading