diff --git a/.github/workflows/Electron.yml b/.github/workflows/Electron.yml new file mode 100644 index 00000000..b2b68b1b --- /dev/null +++ b/.github/workflows/Electron.yml @@ -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 '[.[] | select(.electron == ("18.3.15", "22.3.27"))]' < 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 diff --git a/scripts/electron-versions.json b/scripts/electron-versions.json new file mode 100644 index 00000000..5006bfbc --- /dev/null +++ b/scripts/electron-versions.json @@ -0,0 +1,64 @@ +[ + { "electron": "18.3.15", "node": "16.13" }, + { "electron": "19.0.17", "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.12", "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.27", "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.13", "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.10", "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.11", "node": "18.17" }, + { "electron": "28.0.0", "node": "18.18" }, + { "electron": "28.1.4", "node": "18.18" }, + { "electron": "28.2.10", "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" } +] diff --git a/scripts/node_build.sh b/scripts/node_build.sh index 706c273a..b3aab233 100755 --- a/scripts/node_build.sh +++ b/scripts/node_build.sh @@ -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" diff --git a/scripts/node_build_win.sh b/scripts/node_build_win.sh index 4d74786a..3e981cda 100644 --- a/scripts/node_build_win.sh +++ b/scripts/node_build_win.sh @@ -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