Basic langsmith-nodejs Rust bindings #24
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: Run langsmith_nodejs CI | |
# Our Node.js bindings also depend on the Rust workspace config, | |
# and on the `langsmith-tracing-client` crate itself. | |
on: | |
push: | |
branches: | |
- main | |
paths: | |
- "rust/Cargo.toml" | |
- "rust/Cargo.lock" | |
- "rust/crates/langsmith-tracing-client/**" | |
- "rust/crates/langsmith-nodejs/**" | |
- ".github/workflows/test_langsmith_nodejs.yml" | |
pull_request: | |
paths: | |
- "rust/Cargo.toml" | |
- "rust/Cargo.lock" | |
- "rust/crates/langsmith-tracing-client/**" | |
- "rust/crates/langsmith-nodejs/**" | |
- ".github/workflows/test_langsmith_nodejs.yml" | |
workflow_dispatch: | |
permissions: | |
contents: read | |
env: | |
RUST_VERSION: '1.82' | |
NODEJS_VERSION: 22 | |
RUST_WORKSPACE_PATH: 'rust' # The location of the Rust workspace relative to the repo root. | |
BINDINGS_RELATIVE_PATH: 'crates/langsmith-nodejs' # Bindings path relative to the Rust workspace. | |
MACOSX_DEPLOYMENT_TARGET: '13' # This governs what SDK we use & the oldest supported macOS. | |
jobs: | |
build: | |
strategy: | |
fail-fast: false | |
matrix: | |
settings: | |
- host: macos-15 | |
target: aarch64-apple-darwin | |
build: | | |
cd "$RUST_WORKSPACE_PATH/$BINDINGS_RELATIVE_PATH" | |
rustup default "$RUST_VERSION" | |
yarn build | |
strip -x *.node | |
- host: windows-latest | |
target: x86_64-pc-windows-msvc | |
build: | | |
cd "$RUST_WORKSPACE_PATH/$BINDINGS_RELATIVE_PATH" | |
rustup default "$RUST_VERSION" | |
yarn build | |
- host: ubuntu-latest | |
target: x86_64-unknown-linux-gnu | |
docker: | | |
docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD" "$DOCKER_REGISTRY_URL" | |
docker pull "$DOCKER_REGISTRY_URL/napi-rs/napi-rs/nodejs-rust:lts-debian" | |
docker tag "$DOCKER_REGISTRY_URL/napi-rs/napi-rs/nodejs-rust:lts-debian" builder | |
build: | | |
docker run \ | |
--rm \ | |
-v ~/.cargo/git:/root/.cargo/git \ | |
-v ~/.cargo/registry:/root/.cargo/registry \ | |
-v "$(pwd):/build" \ | |
-w /build \ | |
builder \ | |
/bin/bash -c \ | |
"set -euo pipefail && \ | |
cd "$RUST_WORKSPACE_PATH/$BINDINGS_RELATIVE_PATH" && \ | |
rustup default "$RUST_VERSION" && \ | |
yarn build && \ | |
strip langsmith-nodejs.linux-x64-gnu.node" | |
- host: ubuntu-latest | |
target: x86_64-unknown-linux-musl | |
docker: | | |
docker login -u "$DOCKER_USERNAME" -p "$DOCKER_PASSWORD" "$DOCKER_REGISTRY_URL" | |
docker pull "$DOCKER_REGISTRY_URL/napi-rs/napi-rs/nodejs-rust:lts-alpine" | |
docker tag "$DOCKER_REGISTRY_URL/napi-rs/napi-rs/nodejs-rust:lts-alpine" builder | |
build: | | |
docker run \ | |
--rm \ | |
-v ~/.cargo/git:/root/.cargo/git \ | |
-v ~/.cargo/registry:/root/.cargo/registry \ | |
-v "$(pwd):/build" \ | |
-w /build \ | |
builder \ | |
/bin/bash -c \ | |
"set -euo pipefail && \ | |
cd "$RUST_WORKSPACE_PATH/$BINDINGS_RELATIVE_PATH" && \ | |
rustup default "$RUST_VERSION" && \ | |
yarn build && \ | |
strip langsmith-nodejs.linux-x64-musl.node" | |
name: build ${{ matrix.settings.target }} | |
runs-on: ${{ matrix.settings.host }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- name: Install Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ env.NODEJS_VERSION }} | |
check-latest: true | |
- name: Install rust | |
uses: actions-rust-lang/setup-rust-toolchain@v1 | |
with: | |
toolchain: "${{ env.RUST_VERSION }}" | |
cache-workspaces: "${{ env.RUST_WORKSPACE_PATH }} -> target" | |
rustflags: "" | |
target: "${{ matrix.settings.target }}" | |
- name: Cache NPM dependencies | |
uses: actions/cache@v4 | |
with: | |
path: "${{ env.RUST_WORKSPACE_PATH }}/${{ env.BINDINGS_RELATIVE_PATH }}/node_modules" | |
key: langsmith-nodejs-build-npm-cache-${{ matrix.settings.target }}-node@${{ env.NODEJS_VERSION }}-${{ hashFiles('yarn.lock') }} | |
- name: Pull latest image | |
env: | |
DOCKER_REGISTRY_URL: ghcr.io | |
DOCKER_USERNAME: ${{ github.actor }} | |
DOCKER_PASSWORD: ${{ secrets.GITHUB_TOKEN }} | |
run: ${{ matrix.settings.docker }} | |
- name: Install dependencies | |
working-directory: "${{ env.RUST_WORKSPACE_PATH }}/${{ env.BINDINGS_RELATIVE_PATH }}" | |
shell: bash | |
run: | | |
yarn install \ | |
--ignore-scripts \ | |
--frozen-lockfile \ | |
--registry https://registry.npmjs.org \ | |
--network-timeout 300000 | |
- name: Build | |
shell: bash | |
run: | | |
set -euxo pipefail | |
${{ matrix.settings.build }} | |
- name: Upload artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: "bindings-${{ matrix.settings.target }}" | |
path: "${{ env.RUST_WORKSPACE_PATH }}/${{ env.BINDINGS_RELATIVE_PATH }}/langsmith-nodejs.*.node" | |
test-macos-windows-bindings: | |
name: "test node@${{ matrix.node }} on ${{ matrix.settings.target }}" | |
needs: | |
- build | |
strategy: | |
fail-fast: false | |
matrix: | |
settings: | |
- host: windows-latest | |
target: x86_64-pc-windows-msvc | |
- host: macos-15 | |
target: aarch64-apple-darwin | |
node: | |
- '18' | |
- '20' | |
- '22' | |
runs-on: ${{ matrix.settings.host }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- name: Install Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ env.NODEJS_VERSION }} | |
check-latest: true | |
- name: Cache NPM dependencies | |
uses: actions/cache@v4 | |
with: | |
path: "${{ env.RUST_WORKSPACE_PATH }}/${{ env.BINDINGS_RELATIVE_PATH }}/node_modules" | |
key: langsmith-nodejs-test-npm-cache-${{ matrix.settings.target }}-${{ matrix.node }}-${{ hashFiles('yarn.lock') }} | |
- name: Install dependencies | |
working-directory: "${{ env.RUST_WORKSPACE_PATH }}/${{ env.BINDINGS_RELATIVE_PATH }}" | |
shell: bash | |
run: | | |
set -euo pipefail | |
yarn install \ | |
--ignore-scripts \ | |
--frozen-lockfile \ | |
--registry https://registry.npmjs.org \ | |
--network-timeout 300000 | |
- name: Download artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: bindings-${{ matrix.settings.target }} | |
path: "${{ env.RUST_WORKSPACE_PATH }}/${{ env.BINDINGS_RELATIVE_PATH }}" | |
- name: Test bindings | |
working-directory: "${{ env.RUST_WORKSPACE_PATH }}/${{ env.BINDINGS_RELATIVE_PATH }}" | |
shell: bash | |
run: | | |
set -euo pipefail | |
# List downloaded bindings | |
ls . | |
# Run tests. | |
yarn test | |
test-linux-bindings: | |
name: test node@${{ matrix.node }} on ${{ matrix.settings.target }} | |
needs: | |
- build | |
strategy: | |
fail-fast: false | |
matrix: | |
settings: | |
- host: ubuntu-latest | |
target: x86_64-unknown-linux-gnu | |
docker-suffix: slim | |
- host: ubuntu-latest | |
target: x86_64-unknown-linux-musl | |
docker-suffix: alpine | |
node: | |
- '18' | |
- '20' | |
- '22' | |
runs-on: "${{ matrix.settings.host }}" | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- name: Install Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ env.NODEJS_VERSION }} | |
check-latest: true | |
- name: Cache NPM dependencies | |
uses: actions/cache@v4 | |
with: | |
path: "${{ env.RUST_WORKSPACE_PATH }}/${{ env.BINDINGS_RELATIVE_PATH }}/node_modules" | |
key: langsmith-nodejs-test-npm-cache-${{ matrix.settings.target }}-${{ matrix.node }}-${{ hashFiles('yarn.lock') }} | |
- name: Install dependencies | |
working-directory: "${{ env.RUST_WORKSPACE_PATH }}/${{ env.BINDINGS_RELATIVE_PATH }}" | |
shell: bash | |
run: | | |
set -euo pipefail | |
yarn install \ | |
--ignore-scripts \ | |
--frozen-lockfile \ | |
--registry https://registry.npmjs.org \ | |
--network-timeout 300000 | |
- name: Download artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: bindings-${{ matrix.settings.target }} | |
path: "${{ env.RUST_WORKSPACE_PATH }}/${{ env.BINDINGS_RELATIVE_PATH }}" | |
- name: Test bindings | |
working-directory: "${{ env.RUST_WORKSPACE_PATH }}" | |
shell: bash | |
run: | | |
set -euo pipefail | |
# List downloaded bindings | |
ls "$BINDINGS_RELATIVE_PATH/" | |
# Run tests. | |
docker run \ | |
--rm \ | |
-v "$(pwd):/rust" \ | |
-w "/rust/$BINDINGS_RELATIVE_PATH" \ | |
node:${{ matrix.node }}-${{ matrix.settings.docker-suffix }} \ | |
yarn test |