Skip to content

perf(codegen): pool generated IInvokable request objects #9538

perf(codegen): pool generated IInvokable request objects

perf(codegen): pool generated IInvokable request objects #9538

Workflow file for this run

name: .NET CI
on:
workflow_dispatch:
push:
branches:
- main
pull_request:
branches:
- main
merge_group:
types:
- checks_requested
permissions:
contents: read
env:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
DOTNET_NOLOGO: true
DOTNET_COVERAGE_VERSION: 18.5.2
# Docker images started by workflow steps are centralized so pulls can be retried and mirrors can be swapped in one place.
AZURITE_IMAGE: mcr.microsoft.com/azure-storage/azurite:3.35.0@sha256:647c63a91102a9d8e8000aab803436e1fc85fbb285e7ce830a82ee5d6661cf37
EVENTHUBS_EMULATOR_IMAGE: mcr.microsoft.com/azure-messaging/eventhubs-emulator:2.2.0@sha256:2c8e0d4dd93a5fc078df2721eeb3e211442d555d61293ac3972df931c6d9333a
COSMOSDB_EMULATOR_IMAGE: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview@sha256:bf3bd3cbe3fae2005a0745f77b01d1fc8cd04112193f3ee32289ee15ee9ae5fa
CONSUL_IMAGE: public.ecr.aws/hashicorp/consul:1.19
DYNAMODB_IMAGE: amazon/dynamodb-local:latest
ELASTICMQ_IMAGE: softwaremill/elasticmq-native:latest
MINISTACK_IMAGE: ministackorg/ministack:1.4.11@sha256:8b05715b9effc23d998d4a4e0c0a0c4af7f9435f0ff076a30cf27a77326f14b1
MSSQL_IMAGE: mcr.microsoft.com/mssql/server:latest
NATS_IMAGE: nats:latest
POSTGRES_IMAGE: postgres
REDIS_IMAGE: redis
TESTCONTAINERS_RYUK_IMAGE: testcontainers/ryuk:0.14.0
ZOOKEEPER_IMAGE: zookeeper:3.9
jobs:
build:
name: Build
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Setup Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5
with:
node-version: '24.x'
- name: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5
with:
global-json-file: global.json
- name: Test coverage reporting
if: matrix.os == 'ubuntu-latest'
shell: pwsh
run: ./.github/scripts/test-summarize-coverage.ps1
- name: Build
run: dotnet build -bl
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
continue-on-error: true
with:
name: build_log_${{ matrix.os }}
retention-days: 1
path: |
**/*.binlog
test-redis:
name: Redis provider tests
runs-on: ubuntu-latest
env:
BuildExternalAssets: "false"
strategy:
fail-fast: false
matrix:
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Start Redis
shell: bash
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$REDIS_IMAGE"
docker run -d --pull=never --name redis \
-p 6379:6379 \
--health-cmd "redis-cli ping" \
--health-interval 10s \
--health-timeout 5s \
--health-retries 5 \
"$REDIS_IMAGE"
bash .github/scripts/docker-wait-for-health.sh redis
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.framework }}
framework: ${{ matrix.framework }}
provider: Redis
env:
ORLEANSREDISCONNECTIONSTRING: "localhost:6379,ssl=False,abortConnect=False"
- name: Clean up Redis
if: always()
run: docker rm -f redis || true
test-cassandra:
name: Cassandra provider tests
runs-on: ubuntu-latest
env:
BuildExternalAssets: "false"
CASSANDRA_IMAGE: cassandra:${{ matrix.dbversion }}
strategy:
fail-fast: false
matrix:
dbversion: ["4.0", "4.1", "5.0"]
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Pre-pull Cassandra test images
shell: bash
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$TESTCONTAINERS_RYUK_IMAGE"
bash .github/scripts/docker-pull-with-retry.sh "$CASSANDRA_IMAGE"
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.dbversion }}_${{ matrix.framework }}
framework: ${{ matrix.framework }}
provider: Cassandra
env:
CASSANDRAVERSION: ${{ matrix.dbversion }}
test-postgres:
name: PostgreSQL provider tests
runs-on: ubuntu-latest
env:
BuildExternalAssets: "false"
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
POSTGRES_PASSWORD: postgres
strategy:
fail-fast: false
matrix:
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Start PostgreSQL
shell: bash
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$POSTGRES_IMAGE"
docker run -d --pull=never --name postgres \
-p 5432:5432 \
-e POSTGRES_PASSWORD="$POSTGRES_PASSWORD" \
--health-cmd "pg_isready -U postgres" \
--health-interval 10s \
--health-timeout 5s \
--health-retries 5 \
"$POSTGRES_IMAGE" \
-c max_connections=200
bash .github/scripts/docker-wait-for-health.sh postgres
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.framework }}
framework: ${{ matrix.framework }}
provider: PostgreSql
env:
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="False positive")]
ORLEANSPOSTGRESCONNECTIONSTRING: "Server=127.0.0.1;Port=5432;Pooling=false;User Id=postgres;Password=postgres;SSL Mode=Disable"
- name: Clean up PostgreSQL
if: always()
run: docker rm -f postgres || true
test-mariadb:
name: MariaDB/MySQL provider tests
runs-on: ubuntu-latest
env:
BuildExternalAssets: "false"
# The official MariaDB 10.6 image is not published to GHCR. Prefer Google's Docker Hub
# mirror, with Docker Hub as a fallback, and pin both references to the same digest.
MARIADB_IMAGE: mirror.gcr.io/library/mariadb:10.6@sha256:daacc2f260f8ec999daa5e03a017a23a7e6fa3fb982aaf26e8b72f24daf03bc9
MARIADB_FALLBACK_IMAGE: docker.io/library/mariadb:10.6@sha256:daacc2f260f8ec999daa5e03a017a23a7e6fa3fb982aaf26e8b72f24daf03bc9
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
MARIADB_ROOT_PASSWORD: "mariadb"
strategy:
fail-fast: false
matrix:
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Setup Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5
with:
node-version: '24.x'
- name: Start MariaDB
shell: bash
run: |
set -euo pipefail
mariadb_image="$MARIADB_IMAGE"
if ! bash .github/scripts/docker-pull-with-retry.sh "$mariadb_image"; then
echo "Pulling MariaDB from Docker Hub after the mirror failed."
mariadb_image="$MARIADB_FALLBACK_IMAGE"
bash .github/scripts/docker-pull-with-retry.sh "$mariadb_image"
fi
docker run -d --pull=never --name mariadb \
-p 3306:3306 \
-e MARIADB_ROOT_PASSWORD="$MARIADB_ROOT_PASSWORD" \
--health-cmd "mariadb-admin ping -h 127.0.0.1 -uroot -p${MARIADB_ROOT_PASSWORD} --silent" \
--health-interval 5s \
--health-timeout 5s \
--health-retries 24 \
"$mariadb_image"
for attempt in $(seq 1 60); do
status="$(docker inspect --format '{{.State.Health.Status}}' mariadb)"
case "$status" in
healthy)
exit 0
;;
unhealthy)
docker logs mariadb
exit 1
;;
esac
sleep 2
done
echo "MariaDB did not become healthy in time."
docker logs mariadb
exit 1
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.framework }}
framework: ${{ matrix.framework }}
provider: MySql
env:
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
ORLEANSMYSQLCONNECTIONSTRING: "Server=127.0.0.1;Port=3306;UId=root;Pwd=mariadb;"
test-sqlserver:
name: Microsoft SQL Server provider tests
runs-on: ubuntu-latest
env:
BuildExternalAssets: "false"
ACCEPT_EULA: "Y"
MSSQL_PID: "Developer"
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
SA_PASSWORD: "yourWeak(!)Password"
strategy:
fail-fast: false
matrix:
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Start SQL Server
shell: bash
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$MSSQL_IMAGE"
docker run -d --pull=never --name mssql \
-p 1433:1433 \
-e ACCEPT_EULA="$ACCEPT_EULA" \
-e MSSQL_PID="$MSSQL_PID" \
-e MSSQL_SA_PASSWORD="$SA_PASSWORD" \
--health-cmd '/opt/mssql-tools18/bin/sqlcmd -C -S localhost -U sa -P "$MSSQL_SA_PASSWORD" -Q "SELECT 1" -b -o /dev/null' \
--health-interval 2s \
--health-timeout 5s \
--health-retries 60 \
"$MSSQL_IMAGE"
bash .github/scripts/docker-wait-for-health.sh mssql 120
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.framework }}
framework: ${{ matrix.framework }}
provider: SqlServer
env:
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
ORLEANSMSSQLCONNECTIONSTRING: "Server=127.0.0.1,1433;User Id=SA;Password=yourWeak(!)Password;TrustServerCertificate=True;"
- name: Diagnose SQL Server
if: failure()
shell: bash
run: |
docker inspect --format 'status={{.State.Status}} health={{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}} restartCount={{.RestartCount}} oomKilled={{.State.OOMKilled}} exitCode={{.State.ExitCode}} error={{json .State.Error}}' mssql || true
docker inspect --format '{{if .State.Health}}{{range .State.Health.Log}}{{println .Start "exitCode=" .ExitCode .Output}}{{end}}{{end}}' mssql || true
docker logs --timestamps mssql || true
- name: Clean up SQL Server
if: always()
run: docker rm -f mssql || true
test-sqlite:
name: SQLite provider tests
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.framework }}
framework: ${{ matrix.framework }}
provider: Sqlite
test-azure-storage:
name: Azure Storage provider tests
runs-on: ubuntu-latest
env:
BuildExternalAssets: "false"
strategy:
fail-fast: false
matrix:
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Start Azurite
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$AZURITE_IMAGE"
docker run -d --pull=never --name azurite \
-p 10000:10000 \
-p 10001:10001 \
-p 10002:10002 \
"$AZURITE_IMAGE" \
azurite --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --skipApiVersionCheck
- name: Wait for Azurite
run: |
echo "Waiting for Azurite to be ready..."
timeout 60 bash -c 'until nc -z localhost 10000 && nc -z localhost 10001 && nc -z localhost 10002; do sleep 1; done'
echo "Azurite is ready"
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.framework }}
framework: ${{ matrix.framework }}
provider: AzureStorage
env:
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
# [SuppressMessage("Microsoft.Security", "CSCAN0090:ConfigFile", Justification="Not a secret")]
# [SuppressMessage("Microsoft.Security", "CSCAN0220:DefaultPasswordContexts", Justification="Not a secret")]
ORLEANSDATACONNECTIONSTRING: "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;"
- name: Clean up Azurite
if: always()
run: docker rm -f azurite || true
test-azure-eventhubs:
name: Azure Event Hubs provider tests
runs-on: ubuntu-latest
env:
BuildExternalAssets: "false"
strategy:
fail-fast: false
matrix:
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Start Azurite
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$AZURITE_IMAGE"
docker run -d --pull=never --name azurite \
-p 10000:10000 \
-p 10001:10001 \
-p 10002:10002 \
"$AZURITE_IMAGE" \
azurite --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --skipApiVersionCheck
- name: Wait for Azurite
run: |
echo "Waiting for Azurite to be ready..."
timeout 60 bash -c 'until nc -z localhost 10000 && nc -z localhost 10001 && nc -z localhost 10002; do sleep 1; done'
echo "Azurite is ready"
- name: Start Event Hubs emulator
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$EVENTHUBS_EMULATOR_IMAGE"
docker run -d --pull=never --name eventhubs-emulator \
-v ${{ github.workspace }}/.github/eventhubs-emulator/Config.json:/Eventhubs_Emulator/ConfigFiles/Config.json \
-p 5672:5672 \
-e BLOB_SERVER=host.docker.internal \
-e METADATA_SERVER=host.docker.internal \
-e ACCEPT_EULA=Y \
--add-host=host.docker.internal:host-gateway \
"$EVENTHUBS_EMULATOR_IMAGE"
- name: Wait for Event Hubs emulator
run: |
echo "Waiting for Event Hubs emulator to be ready..."
timeout 60 bash -c 'until nc -z localhost 5672; do sleep 1; done'
echo "Event Hubs emulator is ready"
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.framework }}
framework: ${{ matrix.framework }}
provider: EventHub
env:
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
# [SuppressMessage("Microsoft.Security", "CSCAN0090:ConfigFile", Justification="Not a secret")]
# [SuppressMessage("Microsoft.Security", "CSCAN0220:DefaultPasswordContexts", Justification="Not a secret")]
ORLEANSEVENTHUBCONNECTIONSTRING: "Endpoint=sb://localhost;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;"
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
ORLEANSDATACONNECTIONSTRING: "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;"
- name: Clean up Event Hubs emulator
if: always()
run: docker rm -f eventhubs-emulator || true
- name: Clean up Azurite
if: always()
run: docker rm -f azurite || true
test-azure-cosmosdb:
name: Azure Cosmos DB provider tests
runs-on: ubuntu-latest
env:
BuildExternalAssets: "false"
strategy:
fail-fast: false
matrix:
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Start Azure Cosmos DB emulator
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$COSMOSDB_EMULATOR_IMAGE"
docker run -d --pull=never --name cosmosdb-emulator \
-p 8081:8081 \
-e PROTOCOL=https \
-e ENABLE_EXPLORER=false \
-e ENABLE_TELEMETRY=false \
-e LOG_LEVEL=warn \
"$COSMOSDB_EMULATOR_IMAGE"
- name: Wait for Azure Cosmos DB emulator
run: |
endpoint="https://localhost:8081/"
echo "Waiting for Azure Cosmos DB emulator to be ready..."
for i in {1..60}; do
if curl --silent --show-error --insecure "${endpoint}" > /dev/null; then
echo "Azure Cosmos DB emulator is ready"
echo "ORLEANSCOSMOSDBACCOUNTENDPOINT=${endpoint}" >> "$GITHUB_ENV"
exit 0
fi
if [ "$i" -eq 60 ]; then
docker logs --tail 200 cosmosdb-emulator
echo "Azure Cosmos DB emulator did not become ready in time."
exit 1
fi
sleep 2
done
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.framework }}
framework: ${{ matrix.framework }}
provider: Cosmos
retry: 'true'
env:
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
#ORLEANSCOSMOSDBACCOUNTENDPOINT: "https://localhost:8081/"
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
ORLEANSCOSMOSDBACCOUNTKEY: "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="
- name: Clean up Azure Cosmos DB emulator
if: always()
run: docker rm -f cosmosdb-emulator || true
test-consul:
name: Consul provider tests
runs-on: ubuntu-latest
env:
BuildExternalAssets: "false"
strategy:
fail-fast: false
matrix:
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Pre-pull Consul test images
shell: bash
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$TESTCONTAINERS_RYUK_IMAGE"
bash .github/scripts/docker-pull-with-retry.sh "$CONSUL_IMAGE"
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.framework }}
framework: ${{ matrix.framework }}
provider: Consul
test-zookeeper:
name: ZooKeeper provider tests
runs-on: ubuntu-latest
env:
BuildExternalAssets: "false"
strategy:
fail-fast: false
matrix:
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Start ZooKeeper
shell: bash
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$ZOOKEEPER_IMAGE"
docker run -d --pull=never --name zookeeper \
-p 2181:2181 \
"$ZOOKEEPER_IMAGE"
echo "Waiting for ZooKeeper to accept TCP connections..."
timeout 60 bash -c 'until nc -z localhost 2181; do sleep 1; done'
echo "ZooKeeper is accepting TCP connections"
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.framework }}
framework: ${{ matrix.framework }}
provider: ZooKeeper
env:
ORLEANSZOOKEEPERCONNECTIONSTRING: "localhost:2181"
- name: Clean up ZooKeeper
if: always()
run: docker rm -f zookeeper || true
test-dynamodb:
name: AWS DynamoDB provider tests
runs-on: ubuntu-latest
env:
BuildExternalAssets: "false"
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
AWS_ACCESS_KEY_ID: root
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
AWS_SECRET_ACCESS_KEY: pass
AWS_REGION: us-east-1
strategy:
fail-fast: false
matrix:
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Start DynamoDB Local
shell: bash
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$DYNAMODB_IMAGE"
docker run -d --pull=never --name dynamodb \
-p 8000:8000 \
-e AWS_ACCESS_KEY_ID="$AWS_ACCESS_KEY_ID" \
-e AWS_SECRET_ACCESS_KEY="$AWS_SECRET_ACCESS_KEY" \
-e AWS_REGION="$AWS_REGION" \
"$DYNAMODB_IMAGE"
echo "Waiting for DynamoDB Local to accept TCP connections..."
timeout 60 bash -c 'until nc -z localhost 8000; do sleep 1; done'
echo "DynamoDB Local is accepting TCP connections"
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.framework }}
framework: ${{ matrix.framework }}
provider: DynamoDB
env:
ORLEANSDYNAMODBSERVICE: "http://127.0.0.1:8000"
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
ORLEANSDYNAMODBACCESSKEY: "root"
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
ORLEANSDYNAMODBSECRETKEY: "pass"
- name: Clean up DynamoDB Local
if: always()
run: docker rm -f dynamodb || true
test-sqs:
name: AWS SQS provider tests
runs-on: ubuntu-latest
env:
BuildExternalAssets: "false"
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
AWS_ACCESS_KEY_ID: root
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
AWS_SECRET_ACCESS_KEY: pass
AWS_REGION: us-east-1
strategy:
fail-fast: false
matrix:
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Start DynamoDB Local
shell: bash
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$DYNAMODB_IMAGE"
docker run -d --pull=never --name dynamodb \
-p 8000:8000 \
-e AWS_ACCESS_KEY_ID="$AWS_ACCESS_KEY_ID" \
-e AWS_SECRET_ACCESS_KEY="$AWS_SECRET_ACCESS_KEY" \
-e AWS_REGION="$AWS_REGION" \
"$DYNAMODB_IMAGE"
- name: Start ElasticMQ
shell: bash
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$ELASTICMQ_IMAGE"
docker run -d --pull=never --name elasticmq \
-p 9324:9324 \
"$ELASTICMQ_IMAGE"
- name: Wait for ElasticMQ and DynamoDB
run: |
echo "Waiting for ElasticMQ and DynamoDB Local to be ready..."
timeout 60 bash -c 'until nc -z localhost 9324 && nc -z localhost 8000; do sleep 1; done'
echo "ElasticMQ and DynamoDB Local are ready"
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.framework }}
framework: ${{ matrix.framework }}
provider: SQS
env:
ORLEANSSQSCONNECTIONSTRING: "Service=http://127.0.0.1:9324"
ORLEANSDYNAMODBSERVICE: "http://127.0.0.1:8000"
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
ORLEANSDYNAMODBACCESSKEY: "root"
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
ORLEANSDYNAMODBSECRETKEY: "pass"
- name: Clean up ElasticMQ
if: always()
run: docker rm -f elasticmq || true
- name: Clean up DynamoDB Local
if: always()
run: docker rm -f dynamodb || true
test-nats:
name: NATS stream provider tests
runs-on: ubuntu-latest
env:
BuildExternalAssets: "false"
strategy:
fail-fast: false
matrix:
framework: ["net8.0", "net10.0"]
# services:
# nats:
# image: nats:latest
# ports:
# - 4222:4222
# - 8222:8222
# env:
# HTTP_PORT: 8222
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Start NATS
shell: bash
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$NATS_IMAGE"
docker run -d --pull=never --name nats \
-p 4222:4222 \
-p 8222:8222 \
"$NATS_IMAGE" \
--js --http_port=8222
- name: Wait for NATS
run: |
echo "Waiting for NATS to be ready..."
if ! timeout 60 bash -c 'until docker logs nats 2>&1 | grep -q "Server is ready"; do sleep 1; done'; then
docker logs nats
exit 1
fi
echo "NATS is ready"
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.framework }}
framework: ${{ matrix.framework }}
provider: NATS
- name: Clean up container
if: always()
run: docker rm -f nats || true
test-kinesis:
name: AWS Kinesis provider tests
runs-on: ubuntu-latest
env:
BuildExternalAssets: "false"
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
AWS_ACCESS_KEY_ID: test
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
AWS_SECRET_ACCESS_KEY: test
AWS_REGION: us-east-1
strategy:
fail-fast: false
matrix:
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Start Ministack
shell: bash
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$MINISTACK_IMAGE"
docker run -d --pull=never --name ministack \
-p 4566:4566 \
-e MINISTACK_REGION="$AWS_REGION" \
"$MINISTACK_IMAGE"
- name: Start DynamoDB Local
shell: bash
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$DYNAMODB_IMAGE"
docker run -d --pull=never --name dynamodb \
-p 8000:8000 \
-e AWS_ACCESS_KEY_ID="$AWS_ACCESS_KEY_ID" \
-e AWS_SECRET_ACCESS_KEY="$AWS_SECRET_ACCESS_KEY" \
-e AWS_REGION="$AWS_REGION" \
"$DYNAMODB_IMAGE"
- name: Wait for Ministack and DynamoDB Local
run: |
echo "Waiting for Ministack and DynamoDB Local to be ready..."
timeout 60 bash -c 'until curl --fail --silent http://localhost:4566/_ministack/health > /dev/null && nc -z localhost 8000; do sleep 1; done'
echo "Ministack and DynamoDB Local are ready"
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.framework }}
framework: ${{ matrix.framework }}
provider: Kinesis
env:
ORLEANSKINESISCONNECTIONSTRING: "http://localhost:4566;test;test;us-east-1"
ORLEANSDYNAMODBSERVICE: "http://localhost:8000"
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
ORLEANSDYNAMODBACCESSKEY: "test"
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
ORLEANSDYNAMODBSECRETKEY: "test"
- name: Clean up Ministack
if: always()
run: docker rm -f ministack || true
- name: Clean up DynamoDB Local
if: always()
run: docker rm -f dynamodb || true
test:
name: Test
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
suite: [BVT, SlowBVT, Functional]
os: [ubuntu-latest, windows-latest, macos-latest]
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Setup Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5
with:
node-version: '24.x'
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.suite }}_${{ matrix.os }}_${{ matrix.framework }}
filter-query: /[(Provider=None)&(Suite=${{ matrix.suite }})&(Area!=CodeGen)]
framework: ${{ matrix.framework }}
test-codegenerator:
name: Test Code Generator
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Test Code Generator
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.os }}_${{ matrix.framework }}
filter-query: /[(Provider=None)&(Area=CodeGen)&((Suite=BVT)|(Suite=SlowBVT)|(Suite=Functional))]
framework: ${{ matrix.framework }}
static-instrumentation: 'true'
test-google:
name: Google Cloud providers tests
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Setup Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5
with:
node-version: '24.x'
- name: Setup Java
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
with:
distribution: temurin
java-version: '21'
- name: Setup Google Emulators
working-directory: test/Extensions/Google/Emulators
run: |
set -euo pipefail
npm install --global firebase-tools@15.24.0
firebase setup:emulators:storage
firebase setup:emulators:firestore
firebase setup:emulators:pubsub
firebase emulators:start --only firestore,pubsub,storage --project orleans-test > firebase-emulators.log 2>&1 &
emulator_pid=$!
for attempt in {1..60}; do
if ! kill -0 "$emulator_pid" 2>/dev/null; then
cat firebase-emulators.log
exit 1
fi
ready=true
for port in 8080 8085 9199; do
if ! (echo > /dev/tcp/127.0.0.1/$port) 2>/dev/null; then
ready=false
break
fi
done
if $ready; then
exit 0
fi
sleep 1
done
cat firebase-emulators.log
exit 1
- name: Test
uses: ./.github/actions/run-tests
with:
artifact-name: test_output_${{ github.job }}_${{ matrix.framework }}
framework: ${{ matrix.framework }}
provider: GoogleCloud
ci:
name: CI
if: always()
needs:
- build
- test-redis
- test-cassandra
- test-postgres
- test-mariadb
- test-sqlserver
- test-sqlite
- test-azure-storage
- test-azure-eventhubs
- test-azure-cosmosdb
- test-consul
- test-zookeeper
- test-dynamodb
- test-sqs
- test-nats
- test-kinesis
- test
- test-codegenerator
- test-google
runs-on: ubuntu-latest
steps:
- name: Verify all CI jobs succeeded
env:
JOB_RESULTS: ${{ toJSON(needs) }}
run: jq --exit-status 'all(.[]; .result == "success")' <<< "$JOB_RESULTS"