Update-with-start #4350
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 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: | |
# For some unknown reason, execution of TSC may sometime introduce a CRLF/LF mismatch on some | |
# pure JS files that are preserved in the repo, which would later cause a failure when trying | |
# to publish packages to Verdaccio, as Lerna requires that the Git repo be clean. | |
- name: Set git config | |
run: git config --global core.autocrlf false | |
- 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 }} | |
# On Windows, the 'runner.temp' variable uses backslashes as path separators, but | |
# that may pose problems in later steps when we try to join that with subpaths; | |
# e.g. '${{ runner.temp }}/npm-registry' would get interpolated to 'd:\a\_temp/npm-registry', | |
# which may effectively get interpreted as by bash as 'd:a_temp/npm-registry', resulting in | |
# the apparition of an unwanted 'a_temp' directory. | |
# | |
# This step ensures that the 'runner.temp' variable is normalized to use forward slashes. | |
- name: Get normalized path to temp directory | |
id: tmp-dir | |
run: echo "dir=$(pwd)" >> ${GITHUB_OUTPUT} | |
working-directory: ${{ runner.temp }} | |
- 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 ${{ steps.tmp-dir.outputs.dir }}/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 ${{ steps.tmp-dir.outputs.dir }}/certs | |
if: ${{ vars.TEMPORAL_CLIENT_NAMESPACE != '' }} | |
env: | |
TEMPORAL_CLIENT_CERT: ${{ secrets.TEMPORAL_CLIENT_CERT }} | |
TEMPORAL_CLIENT_KEY: ${{ secrets.TEMPORAL_CLIENT_KEY }} | |
- 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 ${{ steps.tmp-dir.outputs.dir }}/npm-registry --sample https://github.com/temporalio/samples-typescript/tree/main/hello-world --target-dir ${{ steps.tmp-dir.outputs.dir }}/sample-hello-world | |
node scripts/test-example.js --work-dir "${{ steps.tmp-dir.outputs.dir }}/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 ${{ steps.tmp-dir.outputs.dir }}/npm-registry --sample https://github.com/temporalio/samples-typescript/tree/main/hello-world-mtls --target-dir ${{ steps.tmp-dir.outputs.dir }}/sample-hello-world-mtls | |
node scripts/test-example.js --work-dir "${{ steps.tmp-dir.outputs.dir }}/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: ${{ steps.tmp-dir.outputs.dir }}/certs/client.pem | |
TEMPORAL_CLIENT_KEY_PATH: ${{ steps.tmp-dir.outputs.dir }}/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 ${{ steps.tmp-dir.outputs.dir }}/npm-registry --sample https://github.com/temporalio/samples-typescript/tree/main/fetch-esm --target-dir ${{ steps.tmp-dir.outputs.dir }}/sample-fetch-esm | |
node scripts/test-example.js --work-dir "${{ steps.tmp-dir.outputs.dir }}/sample-fetch-esm" | |
# End samples | |
- name: Destroy certs dir | |
if: always() | |
run: rm -rf ${{ steps.tmp-dir.outputs.dir }}/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: ${{ steps.tmp-dir.outputs.dir }}/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 }} |