chore: Fix CI after GHA's drop of node16 actions #4324
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: Setup tmate session | |
uses: mxschmitt/action-tmate@v3 | |
with: | |
limit-access-to-actor: true | |
- 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 | |
with: | |
target: ${{ matrix.target }} | |
- 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 | |
# Run integration tests. | |
# Uses the native binaries built in compile-native-binaries, but build `@temporalio/*` packages locally. | |
integration-tests: | |
timeout-minutes: 15 | |
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] | |
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 }}) | |
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: | |
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: Publish to Verdaccio | |
run: node scripts/publish-to-verdaccio.js --registry-dir $TMPDIR/npm-registry | |
- name: Install Temporal CLI | |
uses: temporalio/setup-temporal@v0 | |
- name: Run Temporal CLI | |
working-directory: ${{ runner.temp }} | |
run: | | |
temporal server start-dev \ | |
--db-filename temporal.sqlite \ | |
--sqlite-pragma journal_mode=WAL \ | |
--sqlite-pragma synchronous=OFF \ | |
--headless &> ./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 "$TMPDIR/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 | |
run: | | |
node scripts/init-from-verdaccio.js --registry-dir $TMPDIR/npm-registry --sample https://github.com/temporalio/samples-typescript/tree/main/hello-world --target-dir $TMPDIR/sample-hello-world | |
node scripts/test-example.js --work-dir "$TMPDIR/sample-hello-world" | |
# Sample 2: hello-world-mtls to cloud server | |
- name: Instantiate sample project using verdaccio artifacts - Hello World MTLS | |
if: ${{ vars.TEMPORAL_CLIENT_NAMESPACE != '' }} | |
run: | | |
node scripts/init-from-verdaccio.js --registry-dir $TMPDIR/npm-registry --sample https://github.com/temporalio/samples-typescript/tree/main/hello-world-mtls --target-dir $TMPDIR/sample-hello-world-mtls | |
node scripts/test-example.js --work-dir "$TMPDIR/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: $TMPDIR/certs/client.pem | |
TEMPORAL_CLIENT_KEY_PATH: $TMPDIR/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 | |
run: | | |
node scripts/init-from-verdaccio.js --registry-dir $TMPDIR/npm-registry --sample https://github.com/temporalio/samples-typescript/tree/main/fetch-esm --target-dir $TMPDIR/sample-fetch-esm | |
node scripts/test-example.js --work-dir "$TMPDIR/sample-fetch-esm" | |
# End samples | |
- name: Destroy certs dir | |
if: always() | |
run: rm -rf $TMPDIR/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.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.reuse-v8-context && 'reuse' || 'noreuse' }}-devserver-logs | |
path: ${{ runner.temp }}/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 }} |