prebuilds #43
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: prebuilds | |
on: | |
workflow_dispatch: | |
inputs: | |
is_release: | |
description: "Set to true if a release version." | |
required: true | |
default: false | |
type: boolean | |
sha: | |
description: "The git SHA to use for release. Only set if needing to publish" | |
required: false | |
default: "" | |
type: string | |
version: | |
description: "The Release version. Allowed format: x.y.z" | |
required: false | |
default: "" | |
type: string | |
npm_tag: | |
description: "The tag value to use to publish to npm." | |
required: false | |
default: "" | |
type: choice | |
options: | |
- '' | |
- dev | |
- beta | |
- rc | |
cxx_change: | |
description: "The PR number or SHA if wanting to build against a PR/SHA in the C++ SDK" | |
required: false | |
type: string | |
jobs: | |
validate-input: | |
runs-on: ubuntu-22.04 | |
steps: | |
- name: If release, verify SHA is provided | |
if: inputs.is_release && inputs.sha == '' | |
run: | | |
echo "::error If releasing, must provide a SHA." | |
exit 1 | |
- name: If release version, npm tag also provided | |
if: inputs.version != '' && inputs.npm_tag == '' | |
run: | | |
echo "::error If releasing by setting a release version, must provide a npm tag." | |
exit 1 | |
lint: | |
runs-on: ubuntu-22.04 | |
needs: validate-input | |
strategy: | |
matrix: | |
node-version: ["18.x"] | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Setup Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ matrix.node-version }} | |
- name: Confirm Node version | |
run: node --version | |
- name: Install dependencies | |
run: | | |
npm ci --ignore-scripts | |
- name: Run lint | |
run: npm run lint | |
- name: Check deps & audit | |
if: inputs.is_release || inputs.version != '' | |
run: | | |
npm run check-deps | |
npm audit --omit=dev | |
sdist: | |
runs-on: ubuntu-22.04 | |
needs: lint | |
outputs: | |
sdist_name: ${{ steps.create_sdist.outputs.sdist_name }} | |
ncbcc_version: ${{ steps.create_sdist.outputs.ncbcc_version }} | |
napi_version: ${{ steps.create_sdist.outputs.napi_version }} | |
steps: | |
- name: Checkout (with SHA) | |
if: inputs.sha != '' | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ inputs.sha }} | |
submodules: recursive | |
fetch-depth: 0 | |
fetch-tags: true | |
- name: Checkout (no SHA) | |
if: inputs.sha == '' | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
fetch-depth: 0 | |
fetch-tags: true | |
- name: Checkout pull-request | |
if: github.event_name == 'workflow_dispatch' && inputs.cxx_change != '' && startsWith(inputs.cxx_change, 'PR_') | |
run: | | |
cd deps/couchbase-cxx-client | |
git fetch origin pull/$(echo "$CXX_CHG" | cut -d'_' -f 2)/head:tmp | |
git checkout tmp | |
git log --oneline -n 10 | |
env: | |
CXX_CHG: ${{ inputs.cxx_change }} | |
- name: Checkout branch | |
if: github.event_name == 'workflow_dispatch' && inputs.cxx_change != '' && startsWith(inputs.cxx_change, 'BR_') | |
run: | | |
cd deps/couchbase-cxx-client | |
git fetch origin | |
git --no-pager branch -r | |
git checkout $(echo "$CXX_CHG" | cut -d'_' -f 2) | |
git log --oneline -n 10 | |
cd ../.. | |
env: | |
CXX_CHG: ${{ inputs.cxx_change }} | |
- name: Setup Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: "18.x" | |
- name: Confirm Node.js version | |
run: node --version | |
- name: Install dependencies | |
run: | | |
npm ci --ignore-scripts | |
- name: Set CPM cache | |
run: npm run prebuild -- --configure --set-cpm-cache --use-boringssl | |
- name: Set version (from input) | |
if: inputs.version != '' | |
run: | | |
echo "NCBCC_VERSION=${{ inputs.version }}" >> $GITHUB_ENV | |
- name: Set version | |
if: inputs.version == '' && inputs.is_release | |
run: | | |
TMP_VERSION=$(node -e "console.log(JSON.parse(fs.readFileSync('package.json')).version)") | |
echo "NCBCC_VERSION=${TMP_VERSION%%-*}" >> $GITHUB_ENV | |
- name: Set version | |
if: inputs.version == '' && !inputs.is_release | |
run: | | |
TMP_VERSION=$(node -e "console.log(JSON.parse(fs.readFileSync('package.json')).version)") | |
echo "NCBCC_VERSION=$TMP_VERSION.${{ github.run_number }}" >> $GITHUB_ENV | |
- name: Create sdist with version | |
id: create_sdist | |
run: | | |
pwd | |
ls -alh | |
ls -alh ./lib | |
rm -rf ./build | |
node -e "var x = JSON.parse(fs.readFileSync('package.json')); x.version = '$NCBCC_VERSION'; fs.writeFileSync('package.json', JSON.stringify(x));" | |
node -e "var x = JSON.parse(fs.readFileSync('package-lock.json')); x.version = '$NCBCC_VERSION'; fs.writeFileSync('package-lock.json', JSON.stringify(x));" | |
NAPI_VERSION=$(node -p "JSON.parse(fs.readFileSync('package.json')).binary.napi_versions[0]") | |
echo "napi_version=$NAPI_VERSION" >> "$GITHUB_OUTPUT" | |
echo "NCBCC_VERSION=$NCBCC_VERSION" | |
echo "ncbcc_version=$NCBCC_VERSION" >> "$GITHUB_OUTPUT" | |
mkdir sdist | |
npm pack --pack-destination sdist | |
cd sdist | |
SDIST_NAME=$(find . -name '*.tgz' | cut -c 3- | rev | cut -c 5- | rev) | |
echo "SDIST_NAME=$SDIST_NAME" | |
echo "sdist_name=$SDIST_NAME" >> "$GITHUB_OUTPUT" | |
- name: Upload Node.js sdist as artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
retention-days: 1 | |
name: ncbcc-artifact-sdist | |
path: | | |
./sdist/*.tgz | |
- name: Set npm pack requirements | |
run: | | |
mkdir npmpack-reqs | |
cd npmpack-reqs | |
cp ../tsconfig.json . | |
cp -r ../lib . | |
cp ../.npmignore . | |
ls -alh | |
- name: Update npm pack requirements | |
uses: actions/upload-artifact@v4 | |
with: | |
retention-days: 1 | |
name: ncbcc-npmpack-reqs | |
path: | | |
./npmpack-reqs | |
# prebuild-setup: | |
# runs-on: ubuntu-20.04 | |
# needs: sdist | |
# steps: | |
# - uses: actions/download-artifact@v4 | |
# with: | |
# name: couchnode-columnar-${{ inputs.version }}-sdist | |
# - name: Extract sdist source | |
# run: | | |
# ls -alh | |
# tar -xvzf couchbase-columnar-$COUCHNODE_COLUMNAR_VERSION.tgz | |
# cp -r package/** . | |
# rm -rf package | |
# ls -alh | |
# env: | |
# COUCHNODE_COLUMNAR_VERSION: ${{ inputs.version }} | |
# - uses: actions/upload-artifact@v4 | |
# with: | |
# retention-days: 1 | |
# name: couchnode-columnar-${{ inputs.version }}-prebuild-setup | |
# path: ./ | |
linux-prebuilds: | |
needs: sdist | |
name: Build prebuild for linux on ${{ matrix.arch }} | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: true | |
matrix: | |
os: ['ubuntu-22.04'] | |
node-version: ["16"] | |
arch: ['x86_64', "arm64"] | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
name: ncbcc-artifact-sdist | |
- name: Extract sdist source | |
run: | | |
ls -alh | |
SDIST_NAME=${{ needs.sdist.outputs.sdist_name }} | |
tar -xvzf $SDIST_NAME.tgz | |
cp -r package/** . | |
rm -rf package | |
- name: Set up QEMU | |
if: ${{ matrix.arch == 'arm64' }} | |
uses: docker/setup-qemu-action@v3 | |
with: | |
platforms: arm64 | |
- name: ccache | |
uses: hendrikmuhs/[email protected] | |
with: | |
key: ${{ github.job }}-linux-${{ matrix.arch }}-node${{ matrix.node-version }} | |
- name: Install dependencies & setup | |
run: | | |
npm install --omit=dev --ignore-scripts | |
mkdir -p output/prebuilds | |
mkdir -p output/prebuilds_debug | |
echo "BUILD_TYPE=RelWithDebInfo" >> $GITHUB_ENV | |
- name: Run in docker | |
uses: addnab/docker-run-action@v3 | |
with: | |
image: jacasey/columnar-node${{ matrix.node-version }}-${{ matrix.arch }}:1.0.0 | |
options: >- | |
--platform linux/${{ matrix.arch == 'x86_64' && 'amd64' || 'arm64'}} | |
-v ${{ github.workspace }}:/work | |
-e CN_BUILD_CONFIG=${{ env.BUILD_TYPE }} | |
-e CCACHE_DIR=/work/.ccache | |
-e CN_CACHE_OPTION=ccache | |
-e CN_VERBOSE_MAKEFILE=ON | |
run: | | |
node --version | |
cat /etc/os-release | |
ldd --version | |
ls -alh /work | |
cd /work | |
env | |
ARCH=$(node -p "process.arch") | |
PLATFORM=$(node -p "process.platform") | |
NAPI_VERSION=${{ needs.sdist.outputs.napi_version }} | |
NCBCC_VERSION=${{ needs.sdist.outputs.ncbcc_version }} | |
echo "Building binary for platform=$PLATFORM, n-api=$NAPI_VERSION, arch=$ARCH" | |
npm run prebuild -- --use-boringssl --parallel 4 --use-cmakejs-build | |
FILENAME="couchbase-columnar-v$NCBCC_VERSION-napi-$NAPI_VERSION-linux-$ARCH-boringssl" | |
cd build/$CN_BUILD_CONFIG | |
ls -alh | |
mv couchbase_impl.node $FILENAME.node | |
tar -cvzf $FILENAME-debug.tar.gz $FILENAME.node | |
mv $FILENAME-debug.tar.gz ../../output/prebuilds_debug | |
objcopy --only-keep-debug $FILENAME.node $FILENAME.debug.node | |
objcopy --strip-debug --strip-unneeded $FILENAME.node | |
objcopy --add-gnu-debuglink=$FILENAME.debug.node $FILENAME.node | |
rm $FILENAME.debug.node | |
ls -alh | |
cd ../.. | |
mv build/$CN_BUILD_CONFIG/$FILENAME.node output/prebuilds | |
rm -rf build | |
- name: Upload prebuild | |
uses: actions/upload-artifact@v4 | |
with: | |
retention-days: 1 | |
name: linux-${{ matrix.arch }}-prebuild | |
path: | | |
./output/prebuilds/*.node | |
- name: Upload debug prebuild as artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
retention-days: 1 | |
name: ncbcc-debug-artifact-linux-${{ matrix.arch }}-prebuild | |
path: | | |
./output/prebuilds_debug/*.tar.gz | |
alpine-prebuilds: | |
needs: sdist | |
name: Build prebuild for alpine on ${{ matrix.arch }} | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: true | |
matrix: | |
os: ['ubuntu-22.04'] | |
node-version: ["18"] | |
arch: ['x86_64', "arm64"] | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
name: ncbcc-artifact-sdist | |
- name: Extract sdist source | |
run: | | |
ls -alh | |
SDIST_NAME=${{ needs.sdist.outputs.sdist_name }} | |
tar -xvzf $SDIST_NAME.tgz | |
cp -r package/** . | |
rm -rf package | |
- name: Set up QEMU | |
if: ${{ matrix.arch == 'arm64' }} | |
uses: docker/setup-qemu-action@v3 | |
with: | |
platforms: arm64 | |
- name: ccache | |
uses: hendrikmuhs/[email protected] | |
with: | |
key: ${{ github.job }}-alpine-${{ matrix.arch }}-node${{ matrix.node-version }} | |
- name: Create output directories | |
run: | | |
mkdir -p output/prebuilds | |
mkdir -p output/prebuilds_debug | |
echo "BUILD_TYPE=RelWithDebInfo" >> $GITHUB_ENV | |
- name: Run in docker | |
uses: addnab/docker-run-action@v3 | |
with: | |
image: jacasey/columnar-alpine319-node${{ matrix.node-version }}-${{ matrix.arch }}:1.0.0 | |
options: >- | |
--platform linux/${{ matrix.arch == 'x86_64' && 'amd64' || 'arm64'}} | |
-v ${{ github.workspace }}:/work | |
-e CN_BUILD_CONFIG=${{ env.BUILD_TYPE }} | |
-e CCACHE_DIR=/work/.ccache | |
-e CN_CACHE_OPTION=ccache | |
-e CN_VERBOSE_MAKEFILE=ON | |
run: | | |
node --version | |
cat /etc/os-release | |
ldd --version | |
ls -alh /work | |
cd /work | |
env | |
npm install --omit=dev --ignore-scripts | |
ARCH=$(node -p "process.arch") | |
PLATFORM=$(node -p "process.platform") | |
NAPI_VERSION=${{ needs.sdist.outputs.napi_version }} | |
NCBCC_VERSION=${{ needs.sdist.outputs.ncbcc_version }} | |
echo "Building binary for platform=$PLATFORM, n-api=$NAPI_VERSION, arch=$ARCH" | |
npm run prebuild -- --use-boringssl --parallel 4 --use-cmakejs-build | |
FILENAME="couchbase-columnar-v$NCBCC_VERSION-napi-$NAPI_VERSION-linuxmusl-$ARCH-boringssl" | |
cd build/$CN_BUILD_CONFIG | |
ls -alh | |
mv couchbase_impl.node $FILENAME.node | |
tar -cvzf $FILENAME-debug.tar.gz $FILENAME.node | |
mv $FILENAME-debug.tar.gz ../../output/prebuilds_debug | |
objcopy --only-keep-debug $FILENAME.node $FILENAME.debug.node | |
objcopy --strip-debug --strip-unneeded $FILENAME.node | |
objcopy --add-gnu-debuglink=$FILENAME.debug.node $FILENAME.node | |
rm $FILENAME.debug.node | |
ls -alh | |
cd ../.. | |
mv build/$CN_BUILD_CONFIG/$FILENAME.node output/prebuilds | |
rm -rf build | |
- name: Upload prebuild | |
uses: actions/upload-artifact@v4 | |
with: | |
retention-days: 1 | |
name: linuxmusl-${{ matrix.arch }}-prebuild | |
path: | | |
./output/prebuilds/*.node | |
- name: Upload debug prebuild as artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
retention-days: 1 | |
name: ncbcc-debug-artifact-linuxmusl-${{ matrix.arch }}-prebuild | |
path: | | |
./output/prebuilds_debug/*.tar.gz | |
macos-prebuilds: | |
needs: sdist | |
name: Build prebuild for macos on ${{ matrix.arch }} | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: true | |
matrix: | |
include: | |
- os: macos-13 | |
node-version: "18.x" | |
arch: "x86_64" | |
- os: macos-14 | |
node-version: "18.x" | |
arch: "arm64" | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
name: ncbcc-artifact-sdist | |
- name: Extract sdist source | |
run: | | |
ls -alh | |
SDIST_NAME=${{ needs.sdist.outputs.sdist_name }} | |
tar -xvzf $SDIST_NAME.tgz | |
cp -r package/** . | |
rm -rf $SDIST_NAME | |
- name: ccache | |
uses: hendrikmuhs/[email protected] | |
with: | |
key: ${{ github.job }}-macos-${{ matrix.arch }}-node${{ matrix.node-version }} | |
- name: Setup Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ matrix.node-version }} | |
- name: Confirm Node version | |
run: | | |
node --version | |
node -p "process.arch" | |
- name: Install dependencies | |
run: | | |
npm install --omit=dev --ignore-scripts | |
mkdir -p output/prebuilds | |
mkdir -p output/prebuilds_debug | |
echo "BUILD_TYPE=RelWithDebInfo" >> $GITHUB_ENV | |
- name: Downgrade CMake | |
if: ${{ matrix.arch == 'x86_64' }} | |
run: | | |
brew uninstall cmake | |
mkdir ~/Downloads/CMake | |
curl --silent --location --retry 3 "https://github.com/Kitware/CMake/releases/download/v3.28.1/cmake-3.28.1-macos-universal.dmg" --output ~/Downloads/CMake/cmake-Darwin-x86_64.dmg | |
yes | PAGER=cat hdiutil attach -quiet -mountpoint /Volumes/cmake-Darwin-x86_64 ~/Downloads/CMake/cmake-Darwin-x86_64.dmg | |
cp -R /Volumes/cmake-Darwin-x86_64/CMake.app /Applications/ | |
hdiutil detach /Volumes/cmake-Darwin-x86_64 | |
sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install=/usr/local/bin | |
- name: Build binary | |
run: | | |
env | |
npm run prebuild -- --use-boringssl --parallel 4 --use-cmakejs-build | |
env: | |
CN_BUILD_CONFIG: ${{ env.BUILD_TYPE }} | |
CCACHE_DIR: .ccache | |
CN_CACHE_OPTION: ccache | |
CN_VERBOSE_MAKEFILE: ON | |
- name: Reduce prebuild size | |
run: | | |
ARCH=$(node -p "process.arch") | |
PLATFORM=$(node -p "process.platform") | |
NAPI_VERSION=${{ needs.sdist.outputs.napi_version }} | |
NCBCC_VERSION=${{ needs.sdist.outputs.ncbcc_version }} | |
echo "Built binary for platform=$PLATFORM, n-api=$NAPI_VERSION, arch=$ARCH" | |
FILENAME="couchbase-columnar-v$NCBCC_VERSION-napi-$NAPI_VERSION-linuxmusl-$ARCH-boringssl" | |
cd build/RelWithDebInfo | |
ls -alh | |
mv couchbase_impl.node $FILENAME.node | |
tar -cvzf $FILENAME-debug.tar.gz $FILENAME.node | |
mv $FILENAME-debug.tar.gz ../../output/prebuilds_debug | |
xcrun strip -Sx $FILENAME.node | |
ls -alh | |
cd ../.. | |
mv build/$BUILD_TYPE/$FILENAME.node output/prebuilds | |
rm -rf build | |
- name: Upload prebuild | |
uses: actions/upload-artifact@v4 | |
with: | |
retention-days: 1 | |
name: macos-${{ matrix.arch }}-prebuild | |
path: | | |
./output/prebuilds/*.node | |
- name: Upload debug prebuild as artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
retention-days: 1 | |
name: ncbcc-debug-artifact-macos-${{ matrix.arch }}-prebuild | |
path: | | |
./output/prebuilds_debug/*.tar.gz | |
windows-prebuilds: | |
needs: sdist | |
name: Build prebuild for Windows on ${{ matrix.arch }} | |
runs-on: ${{ matrix.os }} | |
strategy: | |
fail-fast: true | |
matrix: | |
node-version: ["18.x"] | |
include: | |
- os: windows-2022 | |
arch: "x86_64" | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
name: ncbcc-artifact-sdist | |
- name: Extract sdist source | |
run: | | |
dir | |
set SDIST_NAME=${{ needs.sdist.outputs.sdist_name }} | |
tar -xvzf %SDIST_NAME%.tgz | |
xcopy package . /E | |
rmdir package /S /Q | |
shell: cmd | |
- name: Install NASM | |
run: | | |
choco install --no-progress nasm | |
- name: Setup Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ matrix.node-version }} | |
- name: Confirm Node version | |
run: | | |
node --version | |
node -p "process.arch" | |
- name: Install dependencies | |
shell: cmd | |
run: | | |
npm install --omit=dev --ignore-scripts | |
- name: Build binary | |
run: | | |
npm run prebuild -- --use-boringssl --parallel 4 --use-cmakejs-build | |
env: | |
CN_VERBOSE_MAKEFILE: ON | |
- name: Rename prebuilds | |
shell: cmd | |
run : | | |
dir /a | |
dir /a build\Release | |
md output | |
md output\prebuilds | |
md output\prebuilds_debug | |
dir /a output | |
set NAPI_VERSION=${{ needs.sdist.outputs.napi_version }} | |
set NCBCC_VERSION=${{ needs.sdist.outputs.ncbcc_version }} | |
set FILENAME=couchbase-columnar-v%NCBCC_VERSION%-napi-%NAPI_VERSION%-win32-x64-boringssl | |
set | |
move build\Release\couchbase_impl.pdb output\prebuilds\%FILENAME%.pdb | |
move build\Release\couchbase_impl.node output\prebuilds_debug\%FILENAME%.node | |
- name: Upload prebuild | |
uses: actions/upload-artifact@v4 | |
with: | |
retention-days: 1 | |
name: windows-${{ matrix.arch }}-prebuild | |
path: | | |
./output/prebuilds/*.node | |
- name: Upload debug prebuild as artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
retention-days: 1 | |
name: ncbcc-debug-artifact-windows-${{ matrix.arch }}-prebuild | |
path: | | |
./output/prebuilds_debug/*.pdb |