Skip to content

Commit

Permalink
feat: add npm package to homestar runtime (#434)
Browse files Browse the repository at this point in the history
- adds npm packages to homestar-runtime.
- adds CI/CD to build and publish wrapper package and os specific packages.
  • Loading branch information
hugomrdias authored and zeeshanlakhani committed Nov 29, 2023
1 parent 7c45cf5 commit 0aa6e3a
Show file tree
Hide file tree
Showing 9 changed files with 515 additions and 4 deletions.
71 changes: 69 additions & 2 deletions .github/workflows/builds.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
name: ⚃ Builds

# TODO: brew formula (Macs), cargo-wix (Windows Installs), cargo-aur (Arch)
# TODO: bring back release hook (vs on PR)

on:
workflow_dispatch:
Expand All @@ -16,7 +15,7 @@ on:

# for debugging
# pull_request:
# branches: [ '**' ]
# branches: ['**']

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
Expand All @@ -30,14 +29,19 @@ jobs:
include:
- target: aarch64-unknown-linux-gnu
- target: aarch64-unknown-linux-musl
npm: linux-arm64
- target: aarch64-apple-darwin
os: macos-latest
npm: darwin-arm64
- target: x86_64-unknown-linux-gnu
- target: x86_64-unknown-linux-musl
npm: linux-x64
- target: x86_64-apple-darwin
os: macos-latest
npm: darwin-x64
- target: x86_64-pc-windows-msvc
os: windows-latest
npm: windows-x64
- target: x86_64-unknown-freebsd

permissions:
Expand Down Expand Up @@ -95,6 +99,69 @@ jobs:
include: LICENSE,README.md
token: ${{ secrets.GITHUB_TOKEN }}

npm-publish:
needs: binary-builds
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- target: aarch64-unknown-linux-musl
os: linux
arch: arm64
- target: x86_64-unknown-linux-musl
os: linux
arch: x64
- target: aarch64-apple-darwin
os: darwin
arch: arm64
- target: x86_64-apple-darwin
os: darwin
arch: x64
- target: x86_64-pc-windows-msvc
os: windows
arch: x64
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: lts/*
registry-url: 'https://registry.npmjs.org'
- name: Install cargo get
run: cargo install cargo-get
- name: Prepare os/arch packages
shell: bash
env:
node_os: ${{ matrix.os }}
node_arch: ${{ matrix.arch }}
node_pkg: homestar-${{ matrix.os }}-${{ matrix.arch }}
run: |
export node_version=$(cargo get workspace.package.version)
echo "node_pkg=${node_pkg}" >> "$GITHUB_ENV"
cd homestar-runtime/npm
mkdir -p "${node_pkg}/bin"
envsubst < package.json.tmpl > "${node_pkg}/package.json"
- name: Download build artifacts
uses: actions/download-artifact@v3
with:
name: ${{ matrix.target }}
path: 'homestar-runtime/npm/${{ env.node_pkg }}/bin'
- name: Publish production
if: github.event_name == 'release' && github.event.action == 'published'
run: |
cd "homestar-runtime/npm/${{ env.node_pkg }}"
npm publish --access=public
env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
- name: Publish RC
if: github.event_name == 'workflow_dispatch'
run: |
cd "homestar-runtime/npm/${{ env.node_pkg }}"
npm version $(cargo get package.version)-rc.$(date +%s) --git-tag-version false
npm publish --access public --tag rc
env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}

build-packages:
runs-on: ubuntu-latest
strategy:
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,6 @@ examples/**/tmp/*

# nix build results
/result

# npm packages
homestar-runtime/npm/binaries
4 changes: 2 additions & 2 deletions Cross.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ passthrough = [
[target.x86_64-unknown-linux-musl]
image = "burntsushi/cross:x86_64-unknown-linux-musl"

[target.aarch64-unknown-linux-musl]
image = "burntsushi/cross:aarch64-unknown-linux-musl"
[target.aarch64-unknown-linux-gnu]
image = "burntsushi/cross:aarch64-unknown-linux-gnu"

[target.x86_64-apple-darwin]
image = "freeznet/x86_64-apple-darwin-cross:11.3"
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ different platforms.

- [homebrew][homebrew]: `brew install fission-codes/fission/homestar`
This includes `ipfs` in the install by default.
- [npm](https://www.npmjs.com/package/homestar-runtime): `npm install homestar-runtime -g` Wraps the `homestar-runtime` binary in a node script.

## Running Examples

Expand Down
42 changes: 42 additions & 0 deletions homestar-runtime/npm/base/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#!/usr/bin/env node

import { execa } from 'execa'
import { createRequire } from 'module'
const require = createRequire(import.meta.url)

/**
* Returns the executable path which is located inside `node_modules`
* The naming convention is app-${os}-${arch}
* If the platform is `win32` or `cygwin`, executable will include a `.exe` extension.
* @see https://nodejs.org/api/os.html#osarch
* @see https://nodejs.org/api/os.html#osplatform
* @example "x/xx/node_modules/app-darwin-arm64"
*/
function getExePath() {
const arch = process.arch
let os = process.platform
let extension = ''
if (['win32', 'cygwin'].includes(process.platform)) {
os = 'windows'
extension = '.exe'
}

try {
// Since the binary will be located inside `node_modules`, we can simply call `require.resolve`
return require.resolve(`homestar-${os}-${arch}/bin/homestar${extension}`)
} catch (e) {
throw new Error(
`Couldn't find application binary inside node_modules for ${os}-${arch}`
)
}
}

/**
* Runs the application with args using nodejs spawn
*/
function run() {
const args = process.argv.slice(2)
execa(getExePath(), args, { stdio: 'inherit' })
}

run()
Loading

0 comments on commit 0aa6e3a

Please sign in to comment.