test-template.ymlā¢50.6 kB
name: CI Template job
on:
workflow_call:
inputs:
reason:
description: |
Reason why this workflow was called. Could be "buildpulse" for
flaky tests detection or "daily-test" for scheduled full builds,
"CI" for normal pushes/PRs
type: string
required: false
default: CI
jobTimeout:
description: Timeout for the jobs. Default is 35 minutes
type: number
default: 35
required: false
jobsToRun:
description: Jobs to run. See .github/workflows/scripts/detect-jobs-to-run.js script
type: string
default: '-all-'
required: false
queryEngine:
description: List of query engines to run tests on as JSON array
type: string
default: '["library", "binary"]'
pnpmVersion:
description: pnpm package manager version
type: string
default: '10'
engineHash:
description: Customly-built engine hash to use
type: string
required: false
driverAdapterTestJobTimeout:
description: Timeout for driver adapter tests. Default is 60 minutes
type: number
default: 60
required: false
secrets:
BUILDPULSE_ACCESS_KEY_ID:
required: false
BUILDPULSE_SECRET_ACCESS_KEY:
required: false
BOT_TOKEN:
required: false
env:
HAS_BUILDPULSE_SECRETS: ${{ secrets.BUILDPULSE_ACCESS_KEY_ID != '' && secrets.BUILDPULSE_SECRET_ACCESS_KEY != '' }}
PRISMA_TELEMETRY_INFORMATION: 'prisma test.yml'
# To hide "Update available 0.0.0 -> x.x.x"
PRISMA_HIDE_UPDATE_MESSAGE: true
FUNCTIONAL_TEST_OPTIONS: --detectOpenHandles
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
# Don't cancel if called from buildpulse workflow
cancel-in-progress: ${{ inputs.reason != 'buildpulse' }}
jobs:
#
# Linting
#
lint:
name: Lint
timeout-minutes: ${{ inputs.jobTimeout }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: 20
engine-hash: ${{ inputs.engineHash }}
skip-tsc: false
# https://github.com/actions/toolkit/blob/master/docs/commands.md#problem-matchers
# Matchers are added in setup-node
# https://github.com/actions/setup-node/blob/bacd6b4b3ac3127b28a1e1920c23bf1c2cadbb85/src/main.ts#L54-L60
- name: Disable GitHub annotations from linting
run: |
echo "::remove-matcher owner=eslint-compact::"
echo "::remove-matcher owner=eslint-stylish::"
- name: Run eslint
run: pnpm run lint
working-directory: ./
- name: Run prettier-check
run: pnpm run prettier-check
working-directory: ./
- name: Run check-engines-override
run: pnpm run check-engines-override
working-directory: ./
#
# CLIENT (functional and legacy tests without types test)
#
client:
name: Client Legacy ${{ matrix.queryEngine }} ${{ matrix.previewFeatures }} [v${{ matrix.node }}] ${{ matrix.shard }}
timeout-minutes: ${{ inputs.jobTimeout }}
runs-on: ubuntu-latest
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-client-')
strategy:
fail-fast: false
matrix:
shard: ['1/5', '2/5', '3/5', '4/5', '5/5']
queryEngine: ${{ fromJson(inputs.queryEngine) }}
node: [18, 20, 22, 24]
previewFeatures: ['', 'relationJoins']
env:
NODE_OPTIONS: '--max-old-space-size=8096'
JEST_JUNIT_SUITE_NAME: 'client/functional'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
steps:
- uses: actions/checkout@v4
- name: Set CLI Engine Type
run: |
echo "PRISMA_CLI_QUERY_ENGINE_TYPE=${{ matrix.queryEngine }}" >> "$GITHUB_ENV"
- name: Set Client Engine Type
run: |
echo "PRISMA_CLIENT_ENGINE_TYPE=${{ matrix.queryEngine }}" >> "$GITHUB_ENV"
- name: Start Docker Compose Services
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 5
retry_wait_seconds: 120
command: docker compose -f docker/docker-compose.yml up --wait --detach postgres postgres_isolated mysql mysql_isolated mssql mongo cockroachdb vitess-8
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
# Fails if set to true
skip-tsc: false
# Run the functional test suite
- run: pnpm run test:functional ${{ env.FUNCTIONAL_TEST_OPTIONS }} --silent --shard ${{ matrix.shard }} --engine-type ${{ matrix.queryEngine }} --preview-features "${{ matrix.previewFeatures }}"
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-client-')
working-directory: packages/client
# And run all the other tests (except the types tests)
- run: pnpm run test-notypes ${{ env.FUNCTIONAL_TEST_OPTIONS }} --silent --shard ${{ matrix.shard }}
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-client-')
working-directory: packages/client
- name: Upload test results to BuildPulse for flaky test detection
# Only run this step for branches where we have access to secrets.
# Run this step even when the tests fail. Skip if the workflow is cancelled.
if: env.HAS_BUILDPULSE_SECRETS == 'true' && !cancelled() && inputs.reason == 'buildpulse' && github.repository == 'prisma/prisma'
uses: buildpulse/buildpulse-action@v0.11.0
with:
account: 17219288
repository: 192925833
path: packages/*/junit*.xml
key: ${{ secrets.BUILDPULSE_ACCESS_KEY_ID }}
secret: ${{ secrets.BUILDPULSE_SECRET_ACCESS_KEY }}
#
# CLIENT (functional tests with mini-proxy)
#
client-miniproxy:
name: Client Mini-Proxy [v${{ matrix.node }}] ${{ matrix.shard }}
timeout-minutes: ${{ inputs.jobTimeout }}
runs-on: ubuntu-latest
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-client-')
strategy:
fail-fast: false
matrix:
shard: ['1/6', '2/6', '3/6', '4/6', '5/6', '6/6']
node: [18, 20, 22, 24]
steps:
- uses: actions/checkout@v4
- name: Start Docker Compose Services
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 5
retry_wait_seconds: 120
command: docker compose -f docker/docker-compose.yml up --wait --detach postgres mysql mssql mongo cockroachdb vitess-8
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
# Fails if set to true
skip-tsc: false
- run: pnpm run test:functional ${{ env.FUNCTIONAL_TEST_OPTIONS }} --data-proxy --shard ${{ matrix.shard }}
working-directory: packages/client
env:
NODE_OPTIONS: '--max-old-space-size=8096'
JEST_JUNIT_SUITE_NAME: 'client/functional'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- run: pnpm run test:functional ${{ env.FUNCTIONAL_TEST_OPTIONS }} --data-proxy --client-runtime edge --shard ${{ matrix.shard }}
working-directory: packages/client
env:
NODE_OPTIONS: '--max-old-space-size=8096'
JEST_JUNIT_SUITE_NAME: 'client/functional'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- name: Upload test results to BuildPulse for flaky test detection
# Only run this step for branches where we have access to secrets.
# Run this step even when the tests fail. Skip if the workflow is cancelled.
if: env.HAS_BUILDPULSE_SECRETS == 'true' && !cancelled() && inputs.reason == 'buildpulse' && github.repository == 'prisma/prisma'
uses: buildpulse/buildpulse-action@v0.11.0
with:
account: 17219288
repository: 192925833
path: packages/*/junit*.xml
key: ${{ secrets.BUILDPULSE_ACCESS_KEY_ID }}
secret: ${{ secrets.BUILDPULSE_SECRET_ACCESS_KEY }}
#
# CLIENT (functional tests with driver adapters)
#
client-driveradapters:
name: DA ${{ matrix.flavor }} ${{ matrix.clientRuntime }} ${{ matrix.previewFeatures }} [v${{ matrix.node }}] ${{ matrix.shard }}
timeout-minutes: ${{ inputs.driverAdapterTestJobTimeout }}
runs-on: ubuntu-latest
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-client-')
strategy:
fail-fast: false
matrix:
clientRuntime: ['node', 'wasm-engine-edge']
flavor:
[
'js_pg',
'js_neon',
'js_libsql',
'js_planetscale',
'js_d1',
'js_better_sqlite3',
'js_mssql',
'js_mariadb',
'js_pg_cockroachdb',
]
shard: ['1/6', '2/6', '3/6', '4/6', '5/6', '6/6']
node: [20]
previewFeatures: ['', 'relationJoins']
steps:
- uses: actions/checkout@v4
- name: Start Docker Compose Services
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 5
retry_wait_seconds: 120
command: docker compose -f docker/docker-compose.yml up --wait --detach postgres neon_wsproxy planetscale_proxy mssql mysql cockroachdb
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
skip-tsc: false
- run: pnpm run test:functional ${{ env.FUNCTIONAL_TEST_OPTIONS }} --adapter ${{ matrix.flavor }} --shard ${{ matrix.shard }} --client-runtime ${{ matrix.clientRuntime }} --preview-features "${{ matrix.previewFeatures }}" --runInBand
working-directory: packages/client
env:
PRISMA_DISABLE_QUAINT_EXECUTORS: true, # ensures quaint runs no queries
NODE_NO_WARNINGS: 1 # hides undici websocket warnings
NODE_OPTIONS: '--max-old-space-size=8096'
JEST_JUNIT_SUITE_NAME: 'client/functional'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- name: Upload test results to BuildPulse for flaky test detection
# Only run this step for branches where we have access to secrets.
# Run this step even when the tests fail. Skip if the workflow is cancelled.
if: env.HAS_BUILDPULSE_SECRETS == 'true' && !cancelled() && inputs.reason == 'buildpulse' && github.repository == 'prisma/prisma'
uses: buildpulse/buildpulse-action@v0.11.0
with:
account: 17219288
repository: 192925833
path: packages/*/junit*.xml
key: ${{ secrets.BUILDPULSE_ACCESS_KEY_ID }}
secret: ${{ secrets.BUILDPULSE_SECRET_ACCESS_KEY }}
#
# CLIENT (functional tests with TS aka ESM client)
#
client-ts-client:
name: TS-Client ${{ matrix.provider }} [v${{ matrix.node }}] ${{ matrix.shard }}
timeout-minutes: ${{ inputs.jobTimeout }}
runs-on: ubuntu-latest
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-client-')
strategy:
fail-fast: false
matrix:
provider: ['postgresql'] # TODO: test on all providers once it becomes stable
clientRuntime: ['node'] # TODO: test on wasm
shard: ['1/6', '2/6', '3/6', '4/6', '5/6', '6/6']
node: [18] # TODO: test on all node versions once it becomes stable
steps:
- uses: actions/checkout@v4
- name: Start Docker Compose Services
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 5
retry_wait_seconds: 120
command: docker compose -f docker/docker-compose.yml up --wait --detach postgres
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
skip-tsc: false
- run: pnpm run test:functional --generator-type=prisma-client-ts --provider ${{ matrix.provider }} --shard ${{ matrix.shard }} --client-runtime ${{ matrix.clientRuntime }} --runInBand
working-directory: packages/client
env:
NODE_NO_WARNINGS: 1 # hides undici websocket warnings
NODE_OPTIONS: '--max-old-space-size=8096'
JEST_JUNIT_SUITE_NAME: 'client/functional'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- name: Upload test results to BuildPulse for flaky test detection
# Only run this step for branches where we have access to secrets.
# Run this step even when the tests fail. Skip if the workflow is cancelled.
if: env.HAS_BUILDPULSE_SECRETS == 'true' && !cancelled() && inputs.reason == 'buildpulse' && github.repository == 'prisma/prisma'
uses: buildpulse/buildpulse-action@v0.11.0
with:
account: 17219288
repository: 192925833
path: packages/*/junit*.xml
key: ${{ secrets.BUILDPULSE_ACCESS_KEY_ID }}
secret: ${{ secrets.BUILDPULSE_SECRET_ACCESS_KEY }}
#
# CLIENT (functional tests with client engine, query compiler and driver adapters)
#
client-query-compiler:
name: QC ${{ matrix.flavor }} [v${{ matrix.node }}] ${{ matrix.shard }}
timeout-minutes: ${{ inputs.driverAdapterTestJobTimeout }}
runs-on: ubuntu-latest
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-client-')
strategy:
fail-fast: false
matrix:
flavor:
[
'js_pg',
'js_libsql',
'js_d1',
'js_better_sqlite3',
'js_planetscale',
'js_mssql',
'js_neon',
'js_mariadb',
'js_pg_cockroachdb',
]
shard: ['1/6', '2/6', '3/6', '4/6', '5/6', '6/6']
node: [20]
steps:
- uses: actions/checkout@v4
- name: Start Docker Compose Services
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 5
retry_wait_seconds: 120
command: docker compose -f docker/docker-compose.yml up --wait --detach postgres planetscale_proxy mssql neon_wsproxy mysql cockroachdb
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
skip-tsc: false
- run: pnpm run test:functional ${{ env.FUNCTIONAL_TEST_OPTIONS }} --adapter ${{ matrix.flavor }} --shard ${{ matrix.shard }} --client-runtime client --engine-type client --runInBand
working-directory: packages/client
env:
PRISMA_DISABLE_QUAINT_EXECUTORS: true, # ensures quaint runs no queries
NODE_NO_WARNINGS: 1 # hides undici websocket warnings
NODE_OPTIONS: '--max-old-space-size=8096'
JEST_JUNIT_SUITE_NAME: 'client/functional'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- name: Upload test results to BuildPulse for flaky test detection
# Only run this step for branches where we have access to secrets.
# Run this step even when the tests fail. Skip if the workflow is cancelled.
if: env.HAS_BUILDPULSE_SECRETS == 'true' && !cancelled() && inputs.reason == 'buildpulse' && github.repository == 'prisma/prisma'
uses: buildpulse/buildpulse-action@v0.11.0
with:
account: 17219288
repository: 192925833
path: packages/*/junit*.xml
key: ${{ secrets.BUILDPULSE_ACCESS_KEY_ID }}
secret: ${{ secrets.BUILDPULSE_SECRET_ACCESS_KEY }}
#
# CLIENT (functional tests with client engine, query compiler, driver adapters and Accelerate)
#
client-query-compiler-accelerate:
name: QC+Accelerate ${{ matrix.provider }} [v${{ matrix.node }}] ${{ matrix.shard }}
timeout-minutes: ${{ inputs.driverAdapterTestJobTimeout }}
runs-on: ubuntu-latest
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-client-') ||
contains(inputs.jobsToRun, '-query-plan-executor-')
strategy:
fail-fast: false
matrix:
provider: ['postgresql', 'mysql']
shard: ['1/6', '2/6', '3/6', '4/6', '5/6', '6/6']
node: [20]
steps:
- uses: actions/checkout@v4
- name: Start Docker Compose Services
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 5
retry_wait_seconds: 120
command: docker compose -f docker/docker-compose.yml up --wait --detach postgres mssql mysql
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
skip-tsc: false
- run: pnpm run test:functional ${{ env.FUNCTIONAL_TEST_OPTIONS }} --provider ${{ matrix.provider }} --shard ${{ matrix.shard }} --client-runtime client --engine-type client --remote-executor --runInBand
working-directory: packages/client
env:
PRISMA_DISABLE_QUAINT_EXECUTORS: true, # ensures quaint runs no queries
NODE_NO_WARNINGS: 1 # hides undici websocket warnings
NODE_OPTIONS: '--max-old-space-size=8096'
JEST_JUNIT_SUITE_NAME: 'client/functional-qpe'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
PRISMA_CLIENT_ENGINE_TYPE: client
- name: Upload test results to BuildPulse for flaky test detection
# Only run this step for branches where we have access to secrets.
# Run this step even when the tests fail. Skip if the workflow is cancelled.
if: env.HAS_BUILDPULSE_SECRETS == 'true' && !cancelled() && inputs.reason == 'buildpulse' && github.repository == 'prisma/prisma'
uses: buildpulse/buildpulse-action@v0.11.0
with:
account: 17219288
repository: 192925833
path: packages/*/junit*.xml
key: ${{ secrets.BUILDPULSE_ACCESS_KEY_ID }}
secret: ${{ secrets.BUILDPULSE_SECRET_ACCESS_KEY }}
#
# CLIENT (memory tests)
#
client-memory:
name: Client (memory tests) [v${{ matrix.node }}]
timeout-minutes: ${{ inputs.jobTimeout }}
runs-on: ubuntu-latest
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-client-')
strategy:
fail-fast: false
matrix:
queryEngine: ['library'] # TODO: binary engine is leaking at the moment
node: [18, 20, 22, 24]
steps:
- uses: actions/checkout@v4
- name: Start Docker Compose Services
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 5
retry_wait_seconds: 120
command: docker compose -f docker/docker-compose.yml up --wait --detach postgres # mysql mysql_isolated mssql mongo cockroachdb
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
skip-tsc: true
- run: pnpm run test:memory
working-directory: packages/client
- uses: actions/github-script@v7
if: ${{ failure() && github.event_name == 'pull_request' }}
id: upload-report
env:
NODE_VERSION: ${{ matrix.node }}
with:
github-token: ${{ secrets.BOT_TOKEN }}
script: |
const fs = require('fs')
const nodeVersion = process.env.NODE_VERSION
const reportPath = `client-memory-test/${context.issue.number}/${context.sha}.${nodeVersion}.html`
const url = `https://prisma.github.io/ci-reports/${reportPath}`
const localReport = './packages/client/tests/memory/memory-report.html'
if (fs.existsSync(localReport)) {
await github.rest.repos.createOrUpdateFileContents({
owner: 'prisma',
repo: 'ci-reports',
branch: 'gh-pages',
path: reportPath,
message: `Add memory results for PR ${context.issue.number}`,
content: fs.readFileSync(localReport, 'base64'),
});
core.setOutput('url', url);
}
- name: Find report comment
uses: peter-evans/find-comment@v3
id: fc
if: ${{ always() && github.event_name == 'pull_request' }}
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: 'Client memory tests, node ${{ matrix.node}}, ${{ matrix.queryEngine }}:'
- name: Create or update remote comment (failure)
uses: peter-evans/create-or-update-comment@v4
if: ${{ failure() && steps.upload-report.outputs.url }}
with:
comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
body: |
Client memory tests, node ${{ matrix.node}}, ${{ matrix.queryEngine }}:
ā Failure, [see report](${{ steps.upload-report.outputs.url }}).
edit-mode: replace
- name: Create or update remote comment (success)
uses: peter-evans/create-or-update-comment@v4
if: ${{ success() && steps.fc.outputs.comment-id != '' }}
with:
comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
body: |
Client memory tests, node ${{ matrix.node}}, ${{ matrix.queryEngine }}:
ā
Success
edit-mode: replace
#
# CLIENT test:e2e
#
client-e2e:
name: Client E2E ${{ matrix.os }} [v${{ matrix.node }}]
timeout-minutes: 35
runs-on: ${{ matrix.os }}
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-client-e2e-')
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]
# The Node.js version here is only used for the GitHub Actions job
# The version used by the tests is actually defined in
# ./packages/client/tests/e2e/_utils/standard.dockerfile
node: [20]
steps:
- uses: actions/checkout@v4
# Not currently needed, but we might need it in the future
- name: Start Docker Compose Services
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 5
retry_wait_seconds: 120
command: docker compose -f docker/docker-compose.yml up --wait --detach postgres mysql mssql mongo cockroachdb vitess-8
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
# Fails if set to true
skip-tsc: false
- run: pnpm run test:e2e --verbose --maxWorkers 3
working-directory: packages/client
env:
NODE_OPTIONS: '--max-old-space-size=8096'
#
# CLIENT test:functional:code --relation-mode-tests-only for `relationMode-in-separate-gh-action` tests
#
client-relationMode:
name: Client relationMode:${{ matrix.relationMode }}
timeout-minutes: 60
runs-on: ${{ matrix.os }}
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-client-')
strategy:
fail-fast: false
matrix:
relationMode: ['', 'foreignKeys', 'prisma']
os: [ubuntu-latest]
node: [18]
env:
NODE_OPTIONS: '--max-old-space-size=8096'
JEST_JUNIT_SUITE_NAME: 'client/functional'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
steps:
- uses: actions/checkout@v4
- name: Set RELATION_MODE custom test env var
run: |
echo "RELATION_MODE=${{ matrix.relationMode }}"
if [ -n "${{ matrix.relationMode }}" ];
then echo "RELATION_MODE=${{ matrix.relationMode }}" >> "$GITHUB_ENV";
fi
- name: Start Docker Compose Services
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 5
retry_wait_seconds: 120
command: docker compose -f docker/docker-compose.yml up --wait --detach postgres mysql mssql mongo cockroachdb vitess-8
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
skip-tsc: true
# shouldn't take more than 15 minutes
- name: 1 to 1
run: pnpm run test:functional:code ${{ env.FUNCTIONAL_TEST_OPTIONS }} --silent --relation-mode-tests-only relationMode-in-separate-gh-action/tests_1-to-1.ts
working-directory: packages/client
# shouldn't take more than 15 minutes
- name: 1 to n
run: pnpm run test:functional:code ${{ env.FUNCTIONAL_TEST_OPTIONS }} --silent --relation-mode-tests-only relationMode-in-separate-gh-action/tests_1-to-n.ts
working-directory: packages/client
# shouldn't take more than 15 minutes
- name: m to n (SQL databases)
run: pnpm run test:functional:code ${{ env.FUNCTIONAL_TEST_OPTIONS }} --silent --relation-mode-tests-only relationMode-in-separate-gh-action/tests_m-to-n.ts
working-directory: packages/client
- name: m to n (MongoDB)
run: pnpm run test:functional:code ${{ env.FUNCTIONAL_TEST_OPTIONS }} --silent --relation-mode-tests-only relationMode-in-separate-gh-action/tests_m-to-n-MongoDB.ts
working-directory: packages/client
- name: Upload test results to BuildPulse for flaky test detection
# Only run this step for branches where we have access to secrets.
# Run this step even when the tests fail. Skip if the workflow is cancelled.
if: env.HAS_BUILDPULSE_SECRETS == 'true' && !cancelled() && inputs.reason == 'buildpulse' && github.repository == 'prisma/prisma'
uses: buildpulse/buildpulse-action@v0.11.0
with:
account: 17219288
repository: 192925833
path: packages/*/junit*.xml
key: ${{ secrets.BUILDPULSE_ACCESS_KEY_ID }}
secret: ${{ secrets.BUILDPULSE_SECRET_ACCESS_KEY }}
#
# CLIENT (legacy types tests only)
#
client-legacy-types:
name: Client (legacy types)
timeout-minutes: 15
runs-on: ubuntu-latest
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-client-')
strategy:
fail-fast: false
matrix:
node: [18]
steps:
- uses: actions/checkout@v4
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
# Fails if set to true
skip-tsc: false
- run: pnpm run test src/__tests__/types/types.test.ts
working-directory: packages/client
#
# Client internals and generator packages
#
client-packages:
name: Client internals and generators [v${{ matrix.node }}]
timeout-minutes: 30
runs-on: ubuntu-latest
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-client-')
strategy:
fail-fast: false
matrix:
node: [18, 20, 22, 24]
steps:
- uses: actions/checkout@v4
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
skip-tsc: false
- run: pnpm run test
name: 'client-common'
working-directory: packages/client-common
- run: pnpm run test
name: 'client-engine-runtime'
working-directory: packages/client-engine-runtime
- run: pnpm run test
name: 'ts-builders'
working-directory: packages/ts-builders
- run: pnpm run test
name: 'client-generator-js'
working-directory: packages/client-generator-js
- run: pnpm run test
name: 'client-generator-ts'
working-directory: packages/client-generator-ts
- run: pnpm run test
name: 'client-generator-registry'
working-directory: packages/client-generator-registry
#
# WORKSPACE-TYPES
#
workspace-types:
name: Workspace types
timeout-minutes: 15
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node: [18]
steps:
- uses: actions/checkout@v4
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
skip-tsc: true
engine-hash: ${{ inputs.engineHash }}
- run: pnpm tsc -p tsconfig.utils.typecheck.json
#
# INTEGRATION-TESTS
#
integration-tests:
name: Integration tests
timeout-minutes: 20
runs-on: ubuntu-latest
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-integration-tests-')
strategy:
fail-fast: false
matrix:
queryEngine: ${{ fromJson(inputs.queryEngine) }}
node: [18]
steps:
- uses: actions/checkout@v4
- name: Set CLI Engine Type
run: |
echo "PRISMA_CLI_QUERY_ENGINE_TYPE=${{ matrix.queryEngine }}" >> "$GITHUB_ENV"
- name: Set Client Engine Type
run: |
echo "PRISMA_CLIENT_ENGINE_TYPE=${{ matrix.queryEngine }}" >> "$GITHUB_ENV"
- name: Start Docker Compose Services
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 5
retry_wait_seconds: 120
command: docker compose -f docker/docker-compose.yml up --wait --detach postgres mysql mariadb mssql
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
skip-tsc: true
- run: pnpm run test
working-directory: packages/integration-tests
#
# `@prisma/internals`
#
internals:
name: '@prisma/internals [v${{ matrix.node }}]'
timeout-minutes: 15
runs-on: ${{ matrix.os }}
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-internals-')
strategy:
fail-fast: false
matrix:
queryEngine: ${{ fromJson(inputs.queryEngine) }}
os: [ubuntu-latest]
node: [18, 20, 22, 24]
steps:
- uses: actions/checkout@v4
- name: Start Docker Compose Services
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 5
retry_wait_seconds: 120
command: docker compose -f docker/docker-compose.yml up --wait --detach postgres mysql mssql
- name: Set CLI Engine Type
run: |
echo "PRISMA_CLI_QUERY_ENGINE_TYPE=${{ matrix.queryEngine }}" >> "$GITHUB_ENV"
- name: Set Client Engine Type
run: |
echo "PRISMA_CLIENT_ENGINE_TYPE=${{ matrix.queryEngine }}" >> "$GITHUB_ENV"
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
skip-tsc: true
- run: pnpm run test
working-directory: packages/internals
#
# MIGRATE
#
migrate:
name: Migrate ${{ matrix.driverAdapter }} [v${{ matrix.node }}]
timeout-minutes: 15
runs-on: ${{ matrix.os }}
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-migrate-')
strategy:
fail-fast: false
matrix:
queryEngine: ${{ fromJson(inputs.queryEngine) }}
os: [ubuntu-latest]
node: [18, 20, 22, 24]
# driverAdapter: ['', 'libsql'] # TODO: once we have all tests pass with driver adapters actually enable them on CI and add further adapters
driverAdapter: ['']
steps:
- uses: actions/checkout@v4
- name: Start Docker Compose Services
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 5
retry_wait_seconds: 120
command: docker compose -f docker/docker-compose.yml up --wait --detach postgres mysql mssql mongodb_migrate cockroachdb
- name: Set CLI Engine Type
run: |
echo "PRISMA_CLI_QUERY_ENGINE_TYPE=${{ matrix.queryEngine }}" >> "$GITHUB_ENV"
- name: Set Client Engine Type
run: |
echo "PRISMA_CLIENT_ENGINE_TYPE=${{ matrix.queryEngine }}" >> "$GITHUB_ENV"
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
skip-tsc: true
- run: pnpm run test
working-directory: packages/migrate
env:
PRISMA_MIGRATE_TEST_ADAPTER: ${{ matrix.driverAdapter }}
#
# CLI-COMMANDS
#
cli-commands:
name: CLI commands [v${{ matrix.node }}]
timeout-minutes: 10
runs-on: ${{ matrix.os }}
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-cli-')
strategy:
fail-fast: false
matrix:
queryEngine: ${{ fromJson(inputs.queryEngine) }}
os: [ubuntu-latest]
node: [18, 20, 22, 24]
steps:
- uses: actions/checkout@v4
- name: Start Docker Compose Services
uses: nick-fields/retry@v3
with:
timeout_minutes: 10
max_attempts: 5
retry_wait_seconds: 120
command: docker compose -f docker/docker-compose.yml up --wait --detach postgres
- name: Set CLI Engine Type
run: |
echo "PRISMA_CLI_QUERY_ENGINE_TYPE=${{ matrix.queryEngine }}" >> "$GITHUB_ENV"
- name: Set Client Engine Type
run: |
echo "PRISMA_CLIENT_ENGINE_TYPE=${{ matrix.queryEngine }}" >> "$GITHUB_ENV"
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
skip-tsc: true
- run: pnpm run test
working-directory: packages/cli
#
# CLI-PLATFORM-COMMANDS (only)
#
cli-platform-commands:
name: CLI platform [${{ matrix.os }}][v${{ matrix.node }}]
timeout-minutes: 10
runs-on: ${{ matrix.os }}
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-cli-platform-')
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]
node: [18, 20, 22, 24]
include:
- os: windows-latest
version: 18
- os: macos-latest
version: 18
steps:
- uses: actions/checkout@v4
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
skip-tsc: true
- run: pnpm run test:platform
working-directory: packages/cli
#
# All the other packages!
#
others:
name: Others [v${{ matrix.node }}]
timeout-minutes: 10
runs-on: ${{ matrix.os }}
if: contains(inputs.jobsToRun, '-all-')
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]
node: [18, 20, 22, 24]
steps:
- uses: actions/checkout@v4
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
skip-tsc: true
- run: pnpm run test
name: 'debug'
working-directory: packages/debug
- run: pnpm run test
name: 'generator-helper'
working-directory: packages/generator-helper
- run: pnpm run test
name: 'get-platform'
working-directory: packages/get-platform
- run: pnpm run test
name: 'fetch-engine'
working-directory: packages/fetch-engine
- run: pnpm run test
name: 'engines'
working-directory: packages/engines
- run: pnpm run test
name: 'instrumentation'
working-directory: packages/instrumentation
- run: pnpm run test
name: 'schema-files-loader'
working-directory: packages/schema-files-loader
- run: pnpm run test
name: 'config'
working-directory: packages/config
- run: pnpm run test
name: 'dmmf'
working-directory: packages/dmmf
- run: pnpm run test
name: 'generator'
working-directory: packages/generator
- run: pnpm run test
name: 'credentials-store'
working-directory: packages/credentials-store
#
# Driver Adapter Unit Tests
#
driver-adapter-unit-tests:
name: DA Unit Tests [v${{ matrix.node }}]
timeout-minutes: 10
runs-on: ${{ matrix.os }}
if: contains(inputs.jobsToRun, '-all-')
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]
node: [18, 24]
steps:
- uses: actions/checkout@v4
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
skip-tsc: true
- run: pnpm run test
name: 'adapter-libsql'
working-directory: packages/adapter-libsql
- run: pnpm run test
name: 'adapter-mariadb'
working-directory: packages/adapter-mariadb
- run: pnpm run test
name: 'adapter-d1'
working-directory: packages/adapter-d1
- run: pnpm run test
name: 'adapter-pg'
working-directory: packages/adapter-pg
- run: pnpm run test
name: 'adapter-planetscale'
working-directory: packages/adapter-planetscale
- run: pnpm run test
name: 'adapter-mssql'
working-directory: packages/adapter-mssql
- run: pnpm run test
name: 'adapter-neon'
working-directory: packages/adapter-neon
#
# Query plan executor unit tests
#
qpe-unit-tests:
name: QPE Unit Tests [v${{ matrix.node }}]
timeout-minutes: 10
runs-on: ${{ matrix.os }}
if: contains(inputs.jobsToRun, '-all-') || contains(inputs.jobsToRun, '-query-plan-executor-')
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]
node: [24]
steps:
- uses: actions/checkout@v4
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
skip-tsc: true
- run: pnpm run test
name: 'query-plan-executor'
working-directory: packages/query-plan-executor
#
# Run type performance benchmark tests
#
type-benchmark-tests:
name: Type performance benchmarks
timeout-minutes: 10
runs-on: ubuntu-latest
if: contains(inputs.jobsToRun, '-all-')
strategy:
fail-fast: false
steps:
- uses: actions/checkout@v4
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: 22
engine-hash: ${{ inputs.engineHash }}
skip-tsc: true
- run: pnpm run test
name: 'type-benchmark-tests'
working-directory: packages/type-benchmark-tests
#
# Run all tests on macOS and Windows.
#
# Unlike the other jobs, this job doesn't use Docker (and thus skips some
# tests that require dependencies not easily installable without Docker).
#
# It also runs most tests for different packages sequentially
# to prevent the combinatorial explosion of the number of parallel jobs,
# to minimize the number of times we need to install MySQL using the package manager
# (PostgreSQL and MongoDB are provided by GitHub Actions out of the box), and
# minimize the time spent waiting for a free runner.
#
no-docker-client-functional:
name: Client (func/win+mac)
timeout-minutes: 40
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-14, windows-latest]
node: [18]
queryEngine: ${{ fromJson(inputs.queryEngine) }}
shard: ['1/2', '2/2']
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-client-')
steps:
- uses: actions/checkout@v4
- name: Prerequisites
shell: bash
run: |
{
echo "TEST_SKIP_MSSQL=true"
echo "TEST_SKIP_MONGODB=true"
echo "TEST_SKIP_COCKROACHDB=true"
echo "TEST_SKIP_VITESS=true"
echo "PRISMA_CLI_QUERY_ENGINE_TYPE=${{ matrix.queryEngine }}"
echo "PRISMA_CLIENT_ENGINE_TYPE=${{ matrix.queryEngine }}"
} >> "$GITHUB_ENV"
- name: Set up PostgreSQL
run: bash .github/workflows/scripts/setup-postgres.sh
- name: Set up MySQL
run: bash .github/workflows/scripts/setup-mysql.sh
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
skip-tsc: true
- name: Test packages/client
run: pnpm run test:functional:code ${{ env.FUNCTIONAL_TEST_OPTIONS }} --silent --shard ${{ matrix.shard }} --engine-type ${{ matrix.queryEngine }}
working-directory: packages/client
env:
# allow Node.js to allocate at most 14GB of heap on macOS and 7GB on Windows
# https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources
NODE_OPTIONS: "${{ matrix.os == 'macos-14' && '--max-old-space-size=14336' || '--max-old-space-size=7168' }}"
JEST_JUNIT_SUITE_NAME: 'client/functional'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- name: Upload test results to BuildPulse for flaky test detection
# Only run this step for branches where we have access to secrets.
# Run this step even when the tests fail. Skip if the workflow is cancelled.
if: env.HAS_BUILDPULSE_SECRETS == 'true' && !cancelled() && inputs.reason =='buildpulse' && github.repository == 'prisma/prisma'
uses: buildpulse/buildpulse-action@v0.11.0
with:
account: 17219288
repository: 192925833
path: packages/*/junit*.xml
key: ${{ secrets.BUILDPULSE_ACCESS_KEY_ID }}
secret: ${{ secrets.BUILDPULSE_SECRET_ACCESS_KEY }}
no-docker:
name: All pkgs (win+mac)
timeout-minutes: 60
runs-on: ${{ matrix.os }}
if: |
contains(inputs.jobsToRun, '-all-') ||
contains(inputs.jobsToRun, '-internals-') ||
contains(inputs.jobsToRun, '-migrate-') ||
contains(inputs.jobsToRun, '-cli-') ||
contains(inputs.jobsToRun, '-client-')
strategy:
fail-fast: false
matrix:
os: [macos-14, windows-latest]
node: [18]
queryEngine: ${{ fromJson(inputs.queryEngine) }}
steps:
- uses: actions/checkout@v4
- name: Prerequisites
shell: bash
run: |
{
echo "TEST_SKIP_MSSQL=true"
echo "TEST_SKIP_MONGODB=true"
echo "TEST_SKIP_COCKROACHDB=true"
echo "TEST_NO_DOCKER=true"
echo "PRISMA_CLI_QUERY_ENGINE_TYPE=${{ matrix.queryEngine }}"
echo "PRISMA_CLIENT_ENGINE_TYPE=${{ matrix.queryEngine }}"
} >> "$GITHUB_ENV"
- name: Set up PostgreSQL
run: bash .github/workflows/scripts/setup-postgres.sh
- name: Set up MySQL
run: bash .github/workflows/scripts/setup-mysql.sh
- name: Install & build
uses: ./.github/actions/setup
with:
node-version: ${{ matrix.node }}
engine-hash: ${{ inputs.engineHash }}
# Fails if set to true
skip-tsc: false
- name: Test packages/internals
if: contains(inputs.jobsToRun, '-all-') || contains(inputs.jobsToRun, '-internals-')
run: pnpm run test --testTimeout=40000
working-directory: packages/internals
env:
JEST_JUNIT_SUITE_NAME: 'internals'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- name: Test packages/client (old suite)
if: contains(inputs.jobsToRun, '-all-') || contains(inputs.jobsToRun, '-client-')
run: pnpm run test-notypes --silent --testTimeout=40000
working-directory: packages/client
env:
# Allow Node.js to allocate at most a certain amount heap on macOS and a different amount on Windows
# Note that this value should be lower than the total amount of RAM available
# https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources
NODE_OPTIONS: "${{ matrix.os == 'macos-14' && '--max-old-space-size=14336' || '--max-old-space-size=3072' }}"
JEST_JUNIT_SUITE_NAME: 'client/old'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- name: Test packages/migrate
if: contains(inputs.jobsToRun, '-all-') || contains(inputs.jobsToRun, '-migrate-')
run: pnpm run test --testTimeout=40000
working-directory: packages/migrate
env:
JEST_JUNIT_SUITE_NAME: 'migrate'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- name: Test packages/cli
if: contains(inputs.jobsToRun, '-all-') || contains(inputs.jobsToRun, '-cli-')
run: pnpm run test --testTimeout=40000
working-directory: packages/cli
env:
JEST_JUNIT_SUITE_NAME: 'cli'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- name: Test packages/debug
if: contains(inputs.jobsToRun, '-all-')
run: pnpm run test
working-directory: packages/debug
env:
JEST_JUNIT_SUITE_NAME: 'debug'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- name: Test packages/generator-helper
if: contains(inputs.jobsToRun, '-all-')
run: pnpm run test
working-directory: packages/generator-helper
env:
JEST_JUNIT_SUITE_NAME: 'generator-helper'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- name: Test packages/get-platform
continue-on-error: true # Can fail randomly and we don't want to fail the whole workflow
if: success() && contains(inputs.jobsToRun, '-all-')
run: pnpm run test
working-directory: packages/get-platform
env:
JEST_JUNIT_SUITE_NAME: 'get-platform'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- name: Test packages/fetch-engine
continue-on-error: true # Can fail randomly and we don't want to fail the whole workflow
if: success() && contains(inputs.jobsToRun, '-all-')
run: pnpm run test
working-directory: packages/fetch-engine
env:
JEST_JUNIT_SUITE_NAME: 'fetch-engine'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- name: Test packages/engines
if: contains(inputs.jobsToRun, '-all-')
run: pnpm run test
working-directory: packages/engines
env:
JEST_JUNIT_SUITE_NAME: 'engines'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- name: Test packages/schema-files-loader
if: contains(inputs.jobsToRun, '-all-')
run: pnpm run test
working-directory: packages/schema-files-loader
env:
JEST_JUNIT_SUITE_NAME: 'schema-files-loader'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- name: Test packages/config
if: contains(inputs.jobsToRun, '-all-')
run: pnpm run test
working-directory: packages/config
env:
JEST_JUNIT_SUITE_NAME: 'config'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- name: Test packages/client-engine-runtime
if: contains(inputs.jobsToRun, '-all-')
run: pnpm run test
working-directory: packages/client-engine-runtime
env:
JEST_JUNIT_SUITE_NAME: 'client-engine-runtime'
JEST_JUNIT_UNIQUE_OUTPUT_NAME: true
- run: pnpm run test
if: contains(inputs.jobsToRun, '-all-')
name: 'dmmf'
working-directory: packages/dmmf
- run: pnpm run test
if: contains(inputs.jobsToRun, '-all-')
name: 'generator'
working-directory: packages/generator
- run: pnpm run test
if: contains(inputs.jobsToRun, '-all-')
name: 'client-common'
working-directory: packages/client-common
- run: pnpm run test
if: contains(inputs.jobsToRun, '-all-')
name: 'ts-builders'
working-directory: packages/ts-builders
- run: pnpm run test
if: contains(inputs.jobsToRun, '-all-')
name: 'client-generator-js'
working-directory: packages/client-generator-js
- run: pnpm run test
if: contains(inputs.jobsToRun, '-all-')
name: 'client-generator-ts'
working-directory: packages/client-generator-ts
- run: pnpm run test
if: contains(inputs.jobsToRun, '-all-')
name: 'credentials-store'
working-directory: packages/credentials-store
- run: pnpm run test
if: contains(inputs.jobsToRun, '-all-')
name: 'client-generator-registry'
working-directory: packages/client-generator-registry
- run: pnpm run test
if: contains(inputs.jobsToRun, '-all-') || contains(inputs.jobsToRun, '-query-plan-executor-')
name: 'query-plan-executor'
working-directory: packages/query-plan-executor
- name: Upload test results to BuildPulse for flaky test detection
# Only run this step for branches where we have access to secrets.
# Run this step even when the tests fail. Skip if the workflow is cancelled.
if: env.HAS_BUILDPULSE_SECRETS == 'true' && !cancelled() && inputs.reason == 'buildpulse' && github.repository == 'prisma/prisma'
uses: buildpulse/buildpulse-action@v0.11.0
with:
account: 17219288
repository: 192925833
path: packages/*/junit*.xml
key: ${{ secrets.BUILDPULSE_ACCESS_KEY_ID }}
secret: ${{ secrets.BUILDPULSE_SECRET_ACCESS_KEY }}