chore: Fix CI after GHA's drop of node16 actions #4309
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: Continuous Integration | |
on: | |
pull_request: | |
push: | |
branches: | |
- main | |
- releases/* | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
# Is it the official main branch, or an official release branches? | |
# | |
# Variable IS_TEMPORALIO_SDK_TYPESCRIPT_REPO is configured to true on the official repo. | |
# It can be used to determine if the present execution has access to secrets or not. | |
# | |
# AFAIK there's no way to break that line w/o introducing a trailing LF that breaks usage. Sorry. | |
IS_MAIN_OR_RELEASE: ${{ vars.IS_TEMPORALIO_SDK_TYPESCRIPT_REPO == 'true' && github.event_name != 'pull_request' && ( github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/heads/releases')) }} | |
# Use these variables to force specific version of CLI/Time Skipping Server for SDK tests | |
# TESTS_CLI_VERSION: 'v0.13.2' | |
# TESTS_TIME_SKIPPING_SERVER_VERSION: 'v1.24.1' | |
jobs: | |
# Compile native bridge code for each target platform. | |
# Uploads the native library for each target as a build artifact. | |
compile-native-binaries-debug: | |
timeout-minutes: 20 | |
strategy: | |
fail-fast: true | |
matrix: | |
include: | |
- platform: linux-x64 | |
runner: ubuntu-latest | |
target: x86_64-unknown-linux-gnu | |
out-file: libtemporal_sdk_typescript_bridge.so | |
- platform: linux-arm | |
runner: ubuntu-24.04-arm64-2-core | |
target: aarch64-unknown-linux-gnu | |
out-file: libtemporal_sdk_typescript_bridge.so | |
- platform: macos-x64 | |
runner: macos-13 | |
target: x86_64-apple-darwin | |
out-file: libtemporal_sdk_typescript_bridge.dylib | |
- platform: macos-arm | |
runner: macos-14 | |
target: aarch64-apple-darwin | |
out-file: libtemporal_sdk_typescript_bridge.dylib | |
- platform: windows-x64 | |
runner: windows-latest | |
target: x86_64-pc-windows-msvc | |
out-file: temporal_sdk_typescript_bridge.dll | |
name: Compile Native Binaries (${{ matrix.platform }}) | |
runs-on: ${{ matrix.runner }} | |
defaults: | |
run: | |
shell: bash | |
steps: | |
- name: 'Checkout code' | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: 'Cache index.node' | |
id: cached-artifact | |
uses: actions/cache@v4 | |
with: | |
path: ./packages/core-bridge/releases | |
key: corebridge-artifactcache-debug-${{ matrix.platform }}-${{ hashFiles('./packages/core-bridge/**/Cargo.lock', './packages/core-bridge/**/*.rs') }} | |
- name: Install Rust | |
if: steps.cached-artifact.outputs.cache-hit != 'true' | |
uses: dtolnay/rust-toolchain@stable | |
- name: Install protoc | |
if: steps.cached-artifact.outputs.cache-hit != 'true' | |
uses: arduino/setup-protoc@v3 | |
with: | |
# TODO: Upgrade proto once https://github.com/arduino/setup-protoc/issues/99 is fixed | |
version: '23.x' | |
repo-token: ${{ secrets.GITHUB_TOKEN }} | |
- name: Rust Cargo and Build cache | |
if: steps.cached-artifact.outputs.cache-hit != 'true' | |
uses: Swatinem/rust-cache@v2 | |
with: | |
workspaces: packages/core-bridge -> target | |
prefix-key: corebridge-buildcache-debug | |
shared-key: ${{ matrix.platform }} | |
env-vars: '' | |
save-if: ${{ env.IS_MAIN_OR_RELEASE == 'true' }} | |
- name: Compile rust code | |
if: steps.cached-artifact.outputs.cache-hit != 'true' | |
working-directory: ./packages/core-bridge | |
run: | | |
set -x | |
cargo build --target ${{ matrix.target }} | |
mkdir -p ./releases/${{ matrix.target }} | |
cp target/${{ matrix.target }}/debug/${{ matrix.out-file }} ./releases/${{ matrix.target }}/index.node | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: corebridge-native-debug-${{ matrix.platform }} | |
# Actual file will be named ${{ matrix.target }}/index.node | |
path: ./packages/core-bridge/releases/*/index.node | |
# Gather native binaries for all platforms and build TypeScript @temporalio/* packages. | |
# Upload the built packages as a Verdaccio repository. | |
build-packages: | |
timeout-minutes: 10 | |
needs: | |
- compile-native-binaries-debug | |
name: Build Packages | |
strategy: | |
# Using a matrix here ensure that Rust-related actions below can be easily be copied from the | |
# compile-binaries job and that the Rust build cache will be usable | |
matrix: | |
include: | |
- platform: linux-x64 | |
runner: ubuntu-latest | |
target: x86_64-unknown-linux-gnu | |
runs-on: ${{ matrix.runner }} | |
defaults: | |
run: | |
shell: bash | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Download core-bridge native libraries | |
uses: actions/download-artifact@v4 | |
with: | |
path: ./packages/core-bridge/releases/tmp | |
- name: Put native files into place | |
working-directory: ./packages/core-bridge/releases | |
run: | | |
mv tmp/corebridge-native-debug-*/* ./ | |
rm -rf tmp | |
- name: Install Node | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
- name: Get NPM cache directory | |
id: npm-cache-dir | |
run: echo "dir=$(npm config get cache)" >> ${GITHUB_OUTPUT} | |
- name: Restore NPM cache | |
uses: actions/cache/restore@v4 | |
with: | |
path: ${{ steps.npm-cache-dir.outputs.dir }} | |
key: npm-main-${{ matrix.platform }}-${{ hashFiles('./package-lock.json') }} | |
restore-keys: | | |
npm-main-${{ matrix.platform }}- | |
- name: Download dependencies | |
# Make up to 3 attempts to install NPM dependencies, to work around transient NPM errors :( | |
run: | | |
npm ci --ignore-scripts --verbose || npm ci --ignore-scripts --verbose || npm ci --ignore-scripts --verbose | |
- name: Compile code | |
run: npm run build -- --ignore @temporalio/core-bridge | |
- name: Publish to Verdaccio | |
run: node scripts/publish-to-verdaccio.js --registry-dir ./tmp/registry | |
- name: Save Verdaccio repo artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: verdaccio-repo | |
path: ./tmp/registry/storage | |
- name: Save NPM cache | |
uses: actions/cache/save@v4 | |
# Only saves NPM cache from the main branch, to reduce pressure on the cache (limited to 10GB). | |
if: ${{ env.IS_MAIN_OR_RELEASE == 'true' }} | |
with: | |
path: ${{ steps.npm-cache-dir.outputs.dir }} | |
key: npm-main-${{ matrix.platform }}-${{ hashFiles('./package-lock.json') }} | |
# Run integration tests. | |
# Uses the native binaries built in compile-native-binaries, but build `@temporalio/*` packages locally. | |
# FIXME: Move ReuseV8Context vs non-ReuseV8Context out of the matrix, to the test script | |
integration-tests: | |
timeout-minutes: 10 | |
needs: | |
- compile-native-binaries-debug | |
strategy: | |
fail-fast: false | |
matrix: | |
node: [16, 22] # Min and max supported Node versions | |
platform: [linux-x64, linux-arm, macos-x64, macos-arm, windows-x64] | |
server: [cli] # FIXME: Add 'cloud' | |
include: | |
- platform: linux-x64 | |
runner: ubuntu-latest | |
# For efficiency, we only run non-reuse-v8-context tests on this platform | |
reuse-v8-context: false | |
- platform: linux-arm | |
runner: ubuntu-24.04-arm64-2-core | |
reuse-v8-context: true | |
- platform: macos-x64 | |
runner: macos-13 | |
reuse-v8-context: true | |
- platform: macos-arm | |
runner: macos-14 | |
reuse-v8-context: true | |
- platform: windows-x64 | |
runner: windows-latest | |
reuse-v8-context: true | |
runs-on: ${{ matrix.runner }} | |
name: Run Integration Tests (${{ matrix.platform }}, Node ${{ matrix.node }}, Reuse V8 Context ${{ matrix.reuse-v8-context }}) | |
steps: | |
- name: 'Checkout code' | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Download core-bridge native libraries | |
uses: actions/download-artifact@v4 | |
with: | |
name: corebridge-native-debug-${{ matrix.platform }} | |
path: ./packages/core-bridge/releases | |
- name: Install Node | |
uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ matrix.node }} | |
- name: Get NPM cache directory | |
id: npm-cache-dir | |
run: echo "dir=$(npm config get cache)" >> ${GITHUB_OUTPUT} | |
- name: Restore NPM cache | |
uses: actions/cache/restore@v4 | |
with: | |
path: ${{ steps.npm-cache-dir.outputs.dir }} | |
key: npm-main-${{ matrix.platform }}-${{ hashFiles('./package-lock.json') }} | |
restore-keys: | | |
npm-main-${{ matrix.platform }}- | |
- name: Download dependencies | |
# Make up to 3 attempts to install NPM dependencies, to work around transient NPM errors :( | |
run: | | |
npm ci --ignore-scripts --verbose || npm ci --ignore-scripts --verbose || npm ci --ignore-scripts --verbose | |
- name: Compile code | |
run: npm run build -- --ignore @temporalio/core-bridge | |
- name: Install Temporal CLI | |
if: matrix.server == 'cli' | |
uses: temporalio/setup-temporal@v0 | |
- name: Run Temporal CLI | |
if: matrix.server == 'cli' | |
run: | | |
temporal server start-dev \ | |
--db-filename temporal.sqlite \ | |
--sqlite-pragma journal_mode=WAL \ | |
--sqlite-pragma synchronous=OFF \ | |
--headless &> /tmp/devserver.log & | |
# We write the certs to disk because it serves the sample. Written into /tmp/temporal-certs | |
- name: Create certs dir | |
run: node scripts/create-certs-dir.js "${{ runner.temp }}/certs" | |
if: ${{ vars.TEMPORAL_CLIENT_NAMESPACE != '' }} | |
- name: Run Tests | |
run: npm test | |
env: | |
RUN_INTEGRATION_TESTS: true | |
REUSE_V8_CONTEXT: ${{ matrix.reuse-v8-context }} | |
# Cloud Tests will be skipped if TEMPORAL_CLIENT_CLOUD_API_KEY is left empty | |
TEMPORAL_CLOUD_SAAS_ADDRESS: ${{ vars.TEMPORAL_CLOUD_SAAS_ADDRESS || 'saas-api.tmprl.cloud:443' }} | |
TEMPORAL_CLIENT_CLOUD_API_KEY: ${{ secrets.TEMPORAL_CLIENT_CLOUD_API_KEY }} | |
TEMPORAL_CLIENT_CLOUD_API_VERSION: 2024-05-13-00 | |
TEMPORAL_CLIENT_CLOUD_NAMESPACE: ${{ vars.TEMPORAL_CLIENT_NAMESPACE }} | |
# FIXME: Move samples tests to a custom activity | |
# Sample 1: hello-world to local server | |
- name: Instantiate sample project using verdaccio artifacts - Hello World | |
# Note: here, `npx create` fails on windows if shell is bash. | |
run: | | |
node scripts/init-from-verdaccio.js --registry-dir ./tmp/registry --sample https://github.com/temporalio/samples-typescript/tree/main/hello-world --target-dir ${{ runner.temp }}/sample-hello-world | |
node scripts/test-example.js --work-dir "${{ runner.temp }}/sample-hello-world" | |
# Sample 2: hello-world-mtls to cloud server | |
- name: Instantiate sample project using verdaccio artifacts - Hello World MTLS | |
# Note: here, `npx create` fails on windows if shell is bash. | |
run: | | |
node scripts/init-from-verdaccio.js --registry-dir ./tmp/registry --sample https://github.com/temporalio/samples-typescript/tree/main/hello-world-mtls --target-dir ${{ runner.temp }}/sample-hello-world-mtls | |
node scripts/test-example.js --work-dir "${{ runner.temp }}/sample-hello-world-mtls" | |
env: | |
# These env vars are used by the hello-world-mtls sample | |
TEMPORAL_ADDRESS: ${{ vars.TEMPORAL_CLIENT_NAMESPACE }}.tmprl.cloud | |
TEMPORAL_NAMESPACE: ${{ vars.TEMPORAL_CLIENT_NAMESPACE }} | |
TEMPORAL_CLIENT_CERT_PATH: ${{ runner.temp }}/certs/client.pem | |
TEMPORAL_CLIENT_KEY_PATH: ${{ runner.temp }}/certs/client.key | |
TEMPORAL_TASK_QUEUE: ${{ format('{0}-{1}-sample-hello-world-mtls', matrix.platform, matrix.node) }} | |
# Sample 3: fetch-esm to local server | |
- name: Instantiate sample project using verdaccio artifacts - Fetch ESM | |
# Note: here, `npx create` fails on windows if shell is bash. | |
run: | | |
node scripts/init-from-verdaccio.js --registry-dir ./tmp/registry --sample https://github.com/temporalio/samples-typescript/tree/main/fetch-esm --target-dir ${{ runner.temp }}/sample-fetch-esm | |
node scripts/test-example.js --work-dir "${{ runner.temp }}/sample-fetch-esm" | |
# End samples | |
- name: Destroy certs dir | |
if: always() | |
shell: bash | |
run: rm -rf ${{ runner.temp }}/certs | |
continue-on-error: true | |
- name: Upload NPM logs | |
uses: actions/upload-artifact@v4 | |
if: failure() || cancelled() | |
with: | |
name: integration-tests-${{ matrix.platform }}-node${{ matrix.node }}-${{ matrix.server }}-${{ matrix.reuse-v8-context && 'reuse' || 'noreuse' }}-logs | |
path: ${{ startsWith(matrix.platform, 'windows') && 'C:\\npm\\_logs\\' || '~/.npm/_logs/' }} | |
- name: Upload Dev Server logs | |
uses: actions/upload-artifact@v4 | |
if: failure() || cancelled() | |
with: | |
name: integration-tests-${{ matrix.platform }}-node${{ matrix.node }}-${{ matrix.server }}-${{ matrix.reuse-v8-context && 'reuse' || 'noreuse' }}-devserver-logs | |
path: /tmp/devserver.log | |
conventions: | |
name: Lint and Prune | |
uses: ./.github/workflows/conventions.yml | |
# Runs the features repo tests with this repo's current SDK code | |
# FIXME: Update this job to reuse native build artifacts from compile-native-binaries | |
features-tests: | |
name: Features Tests | |
uses: temporalio/features/.github/workflows/typescript.yaml@main | |
with: | |
typescript-repo-path: ${{github.event.pull_request.head.repo.full_name}} | |
version: ${{github.event.pull_request.head.ref}} | |
version-is-repo-ref: true | |
features-repo-ref: sdk-1403-ts-startUpdate-require-wait-stage | |
stress-tests-no-reuse-context: | |
name: Stress Tests (No Reuse V8 Context) | |
# FIXME: Update this job to reuse native build artifacts from compile-native-binaries | |
uses: ./.github/workflows/stress.yml | |
with: | |
test-type: ci-stress | |
test-timeout-minutes: 20 | |
reuse-v8-context: false | |
stress-tests-reuse-context: | |
name: Stress Tests (Reuse V8 Context) | |
# FIXME: Update this job to reuse native build artifacts from compile-native-binaries | |
uses: ./.github/workflows/stress.yml | |
with: | |
test-type: ci-stress | |
test-timeout-minutes: 20 | |
reuse-v8-context: true | |
docs: | |
name: Build Docs | |
uses: ./.github/workflows/docs.yml | |
with: | |
# Can't publish from forks, as secrets won't be available | |
publish_target: ${{ vars.IS_TEMPORALIO_SDK_TYPESCRIPT_REPO == 'true' && 'draft' || '' }} | |
secrets: | |
ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }} | |
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} |