Skip to content

Publish to NPM

Publish to NPM #85

Workflow file for this run

name: Publish to NPM
on:
workflow_dispatch:
inputs:
dry_run:
description: "Just build, don't publish"
default: false
required: false
type: boolean
npm_tag:
description: 'NPM tag'
required: true
default: 'latest'
env:
CARGO_TERM_COLOR: always
jobs:
build:
name: Build
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [windows-latest, macos-11]
include:
- os: macos-11
arm64-rust-target: aarch64-apple-darwin
- os: windows-latest
arm64-rust-target: aarch64-pc-windows-msvc
# This can be removed when we update to a Node version that officially supports win-arm64.
custom-arm64-dist-url: https://unofficial-builds.nodejs.org/download/release
# Ubuntu binaries are built using Docker, below
timeout-minutes: 45
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Checking run eligibility
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
with:
script: |
const dryRun = ${{ inputs.dry_run }};
const refType = '${{ github.ref_type }}';
const refName = '${{ github.ref_name }}';
console.log(dryRun
? `Running in 'dry run' mode on '${refName}' ${refType}`
: `Running on '${refName}' ${refType}`);
if (refType !== 'tag' && !dryRun) {
core.setFailed("the action should either be launched on a tag or with a 'dry run' switch");
}
- run: rustup toolchain install $(cat rust-toolchain) --profile minimal --target ${{ matrix.arm64-rust-target }}
# install nasm compiler for boring
- name: (Windows) Install nasm
if: startsWith(matrix.os, 'windows')
run: choco install nasm
shell: cmd
- run: choco install protoc
if: startsWith(matrix.os, 'windows')
- run: brew install protobuf
if: startsWith(matrix.os, 'macos')
- name: Get Node version from .nvmrc
id: get-nvm-version
shell: bash
run: echo "node-version=$(cat .nvmrc)" >> $GITHUB_OUTPUT
- uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.24
with:
node-version-file: '.nvmrc'
- run: npx yarn install --ignore-scripts --frozen-lockfile
working-directory: node
- name: Build for arm64
run: npx prebuildify --napi -t ${{ steps.get-nvm-version.outputs.node-version }} --arch arm64
working-directory: node
env:
npm_config_dist_url: ${{ matrix.custom-arm64-dist-url }}
- name: Build for the host (should be x64)
run: npx prebuildify --napi -t ${{ steps.get-nvm-version.outputs.node-version }}
working-directory: node
- name: Upload library
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
with:
name: libsignal_client (${{matrix.os}})
path: node/prebuilds/*
build-docker:
name: Build (Ubuntu via Docker)
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- run: node/docker-prebuildify.sh
- name: Upload library
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
with:
name: libsignal_client (ubuntu-docker)
path: node/prebuilds/*
verify-rust:
name: Verify Node bindings
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- run: rustup toolchain install $(cat rust-toolchain) --profile minimal
- run: sudo apt-get update && sudo apt-get install protobuf-compiler
- name: Verify that the Node bindings are up to date
run: rust/bridge/node/bin/gen_ts_decl.py --verify
publish:
name: Publish
runs-on: ubuntu-latest
needs: [build, build-docker, verify-rust]
timeout-minutes: 45
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
with:
node-version-file: '.nvmrc'
registry-url: 'https://registry.npmjs.org/'
- name: Download built libraries
id: download
uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4
with:
path: artifacts
- name: Copy libraries
run: mkdir node/prebuilds && mv ${{ steps.download.outputs.download-path }}/*/* node/prebuilds && find node/prebuilds
- run: yarn install --frozen-lockfile
working-directory: node
- run: yarn tsc
working-directory: node
- run: yarn lint
working-directory: node
- run: yarn format -c
working-directory: node
- run: yarn test
working-directory: node
env:
PREBUILDS_ONLY: 1
- if: ${{ !inputs.dry_run }}
run: npm publish --tag ${{ github.event.inputs.npm_tag }} --access public
working-directory: node
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}