Skip to content

test: stabilize stream reliability lifecycle waits #6640

test: stabilize stream reliability lifecycle waits

test: stabilize stream reliability lifecycle waits #6640

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
# 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
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 }}
continue-on-error: true
strategy:
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: 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
continue-on-error: true
env:
BuildExternalAssets: "false"
strategy:
matrix:
provider: ["Redis"]
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: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5
with:
global-json-file: global.json
- name: Test
run: dotnet test
--framework ${{ matrix.framework }}
--filter "Category=${{ matrix.provider }}&(Category=BVT|Category=SlowBVT|Category=Functional)"
--blame-hang-timeout 10m
--blame-crash-dump-type full
--blame-hang-dump-type full
--logger "trx;LogFileName=test_results_${{ matrix.provider }}_${{ matrix.framework }}.trx"
--
-parallel none -noshadow
env:
ORLEANSREDISCONNECTIONSTRING: "localhost:6379,ssl=False,abortConnect=False"
- name: Clean up Redis
if: always()
run: docker rm -f redis || true
- name: Archive Test Results
if: always()
continue-on-error: true
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: test_output_${{ github.job }}_${{ matrix.framework }}
retention-days: 1
path: |
**/TestResults/*
**/logs/*
test-cassandra:
name: Cassandra provider tests
runs-on: ubuntu-latest
continue-on-error: true
env:
BuildExternalAssets: "false"
CASSANDRA_IMAGE: cassandra:${{ matrix.dbversion }}
strategy:
matrix:
provider: ["Cassandra"]
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: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5
with:
global-json-file: global.json
- name: Test
run: dotnet test
--framework ${{ matrix.framework }}
--filter "Category=${{ matrix.provider }}&(Category=BVT|Category=SlowBVT|Category=Clustering)"
--blame-hang-timeout 10m
--blame-crash-dump-type full
--blame-hang-dump-type full
--logger "trx;LogFileName=test_results_${{ matrix.provider }}_${{ matrix.dbversion }}_${{ matrix.framework }}.trx"
--
-parallel none -noshadow
env:
CASSANDRAVERSION: ${{ matrix.dbversion }}
- name: Archive Test Results
if: always()
continue-on-error: true
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: test_output_${{ github.job }}_${{ matrix.dbversion }}_${{ matrix.framework }}
retention-days: 1
path: |
**/TestResults/*
**/logs/*
test-postgres:
name: PostgreSQL provider tests
runs-on: ubuntu-latest
continue-on-error: true
env:
BuildExternalAssets: "false"
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
POSTGRES_PASSWORD: postgres
strategy:
matrix:
provider: ["PostgreSql"]
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"
bash .github/scripts/docker-wait-for-health.sh postgres
- name: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5
with:
global-json-file: global.json
- name: Test
run: dotnet test
--framework ${{ matrix.framework }}
--filter "Category=${{ matrix.provider }}&(Category=BVT|Category=SlowBVT|Category=Functional)"
--blame-hang-timeout 10m
--blame-crash-dump-type full
--blame-hang-dump-type full
--logger "trx;LogFileName=test_results_${{ matrix.provider }}_${{ matrix.framework }}.trx"
--
-parallel none -noshadow
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
- name: Archive Test Results
if: always()
continue-on-error: true
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: test_output_${{ github.job }}_${{ matrix.framework }}
retention-days: 1
path: |
**/TestResults/*
**/logs/*
test-mariadb:
name: MariaDB/MySQL provider tests
runs-on: ubuntu-latest
continue-on-error: true
env:
BuildExternalAssets: "false"
# The official MariaDB 10.6 image is not published to GHCR. Use Google's Docker Hub mirror
# pinned to the official Docker Hub digest.
MARIADB_IMAGE: mirror.gcr.io/library/mariadb:10.6@sha256:daacc2f260f8ec999daa5e03a017a23a7e6fa3fb982aaf26e8b72f24daf03bc9
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
MARIADB_ROOT_PASSWORD: "mariadb"
strategy:
matrix:
provider: ["MySql"]
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5
with:
global-json-file: global.json
- name: Start MariaDB
shell: bash
run: |
set -euo pipefail
bash .github/scripts/docker-pull-with-retry.sh "$MARIADB_IMAGE"
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
run: dotnet test
--framework ${{ matrix.framework }}
--filter "Category=${{ matrix.provider }}&(Category=BVT|Category=SlowBVT|Category=Functional)"
--blame-hang-timeout 10m
--blame-crash-dump-type full
--blame-hang-dump-type full
--logger "trx;LogFileName=test_results_${{ matrix.provider }}_${{ matrix.framework }}.trx"
--
-parallel none -noshadow
env:
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
ORLEANSMYSQLCONNECTIONSTRING: "Server=127.0.0.1;Port=3306;UId=root;Pwd=mariadb;"
- name: Archive Test Results
if: always()
continue-on-error: true
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: test_output_${{ github.job }}_${{ matrix.framework }}
retention-days: 1
path: |
**/TestResults/*
**/logs/*
test-sqlserver:
name: Microsoft SQL Server provider tests
runs-on: ubuntu-latest
continue-on-error: true
env:
BuildExternalAssets: "false"
ACCEPT_EULA: "Y"
MSSQL_PID: "Developer"
# [SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Not a secret")]
SA_PASSWORD: "yourWeak(!)Password"
strategy:
matrix:
provider: ["SqlServer"]
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 SA_PASSWORD="$SA_PASSWORD" \
"$MSSQL_IMAGE"
echo "Waiting for SQL Server to accept TCP connections..."
timeout 120 bash -c 'until nc -z localhost 1433; do sleep 2; done'
echo "SQL Server is accepting TCP connections"
- name: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5
with:
global-json-file: global.json
- name: Test
run: dotnet test
--framework ${{ matrix.framework }}
--filter "Category=${{ matrix.provider }}&(Category=BVT|Category=SlowBVT|Category=Functional)"
--blame-hang-timeout 10m
--blame-crash-dump-type full
--blame-hang-dump-type full
--logger "trx;LogFileName=test_results_${{ matrix.provider }}_${{ matrix.framework }}.trx"
--
-parallel none -noshadow
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: Clean up SQL Server
if: always()
run: docker rm -f mssql || true
- name: Archive Test Results
if: always()
continue-on-error: true
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: test_output_${{ github.job }}_${{ matrix.framework }}
retention-days: 1
path: |
**/TestResults/*
**/logs/*
test-azure-storage:
name: Azure Storage provider tests
runs-on: ubuntu-latest
continue-on-error: true
env:
BuildExternalAssets: "false"
strategy:
matrix:
framework: ["net8.0", "net10.0"]
provider: ["AzureStorage"]
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: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5
with:
global-json-file: global.json
- name: Test
run: dotnet test
--filter "Category=${{ matrix.provider }}&(Category=BVT|Category=SlowBVT|Category=Functional)"
--framework ${{ matrix.framework }}
--blame-hang-timeout 10m
--blame-crash-dump-type full
--blame-hang-dump-type full
--logger "trx;LogFileName=test_results_${{ matrix.provider }}_${{ matrix.framework }}.trx"
--
-parallel none -noshadow
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
- name: Archive Test Results
if: always()
continue-on-error: true
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: test_output_${{ github.job }}_${{ matrix.framework }}
retention-days: 1
path: |
**/TestResults/*
**/logs/*
test-azure-eventhubs:
name: Azure Event Hubs provider tests
runs-on: ubuntu-latest
continue-on-error: true
env:
BuildExternalAssets: "false"
strategy:
matrix:
framework: ["net8.0", "net10.0"]
provider: ["EventHub"]
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: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5
with:
global-json-file: global.json
- name: Test
run: dotnet test
--filter "Category=${{ matrix.provider }}&(Category=BVT|Category=SlowBVT|Category=Functional|Category=Streaming)"
--framework ${{ matrix.framework }}
--blame-hang-timeout 10m
--blame-crash-dump-type full
--blame-hang-dump-type full
--logger "trx;LogFileName=test_results_${{ matrix.provider }}_${{ matrix.framework }}.trx"
--
-parallel none -noshadow
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
- name: Archive Test Results
if: always()
continue-on-error: true
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: test_output_${{ github.job }}_${{ matrix.framework }}
retention-days: 1
path: |
**/TestResults/*
**/logs/*
test-azure-cosmosdb:
name: Azure Cosmos DB provider tests
runs-on: ubuntu-latest
continue-on-error: true
env:
BuildExternalAssets: "false"
strategy:
matrix:
framework: ["net8.0", "net10.0"]
provider: ["Cosmos"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5
with:
global-json-file: global.json
- 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
run: |
cosmos_filter='Category=${{ matrix.provider }}&Category!=Performance&Category!=Stress'
for attempt in 1 2; do
logger_name="test_results_${{ matrix.provider }}_${{ matrix.framework }}_attempt${attempt}.trx"
extra_args=()
if [ "$attempt" -gt 1 ]; then
echo "Cosmos tests failed on attempt $((attempt - 1)); retrying once with the same filter."
extra_args+=(--no-build)
fi
if dotnet test \
test/Extensions/Orleans.Cosmos.Tests/Orleans.Cosmos.Tests.csproj \
--framework ${{ matrix.framework }} \
--filter "${cosmos_filter}" \
--blame-hang-timeout 10m \
--blame-crash-dump-type full \
--blame-hang-dump-type full \
--logger "trx;LogFileName=${logger_name}" \
"${extra_args[@]}" \
-- \
-parallel none -noshadow; then
exit 0
fi
done
exit 1
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
- name: Archive Test Results
if: always()
continue-on-error: true
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: test_output_${{ github.job }}_${{ matrix.framework }}
retention-days: 1
path: |
**/TestResults/*
**/logs/*
test-consul:
name: Consul provider tests
runs-on: ubuntu-latest
continue-on-error: true
env:
BuildExternalAssets: "false"
strategy:
matrix:
provider: ["Consul"]
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: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5
with:
global-json-file: global.json
- name: Test
run: dotnet test
--framework ${{ matrix.framework }}
--filter "Category=${{ matrix.provider }}&(Category=BVT|Category=SlowBVT|Category=Functional)"
--blame-hang-timeout 10m
--blame-crash-dump-type full
--blame-hang-dump-type full
--logger "trx;LogFileName=test_results_${{ matrix.provider }}_${{ matrix.framework }}.trx"
--
-parallel none -noshadow
- name: Archive Test Results
if: always()
continue-on-error: true
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: test_output_${{ github.job }}_${{ matrix.framework }}
retention-days: 1
path: |
**/TestResults/*
**/logs/*
test-zookeeper:
name: ZooKeeper provider tests
runs-on: ubuntu-latest
continue-on-error: true
env:
BuildExternalAssets: "false"
strategy:
matrix:
provider: ["ZooKeeper"]
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: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5
with:
global-json-file: global.json
- name: Test
run: dotnet test
--framework ${{ matrix.framework }}
--filter "Category=${{ matrix.provider }}&(Category=BVT|Category=SlowBVT|Category=Functional)"
--blame-hang-timeout 10m
--blame-crash-dump-type full
--blame-hang-dump-type full
--logger "trx;LogFileName=test_results_${{ matrix.provider }}_${{ matrix.framework }}.trx"
--
-parallel none -noshadow
env:
ORLEANSZOOKEEPERCONNECTIONSTRING: "localhost:2181"
- name: Clean up ZooKeeper
if: always()
run: docker rm -f zookeeper || true
- name: Archive Test Results
if: always()
continue-on-error: true
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: test_output_${{ github.job }}_${{ matrix.framework }}
retention-days: 1
path: |
**/TestResults/*
**/logs/*
test-dynamodb:
name: AWS DynamoDB provider tests
runs-on: ubuntu-latest
continue-on-error: true
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:
matrix:
provider: ["DynamoDB"]
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: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5
with:
global-json-file: global.json
- name: Test
run: dotnet test
--framework ${{ matrix.framework }}
--filter "Category=${{ matrix.provider }}&(Category=BVT|Category=SlowBVT|Category=Functional)"
--blame-hang-timeout 10m
--blame-crash-dump-type full
--blame-hang-dump-type full
--logger "trx;LogFileName=test_results_${{ matrix.provider }}_${{ matrix.framework }}.trx"
--
-parallel none -noshadow
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
- name: Archive Test Results
if: always()
continue-on-error: true
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: test_output_${{ github.job }}_${{ matrix.framework }}
retention-days: 1
path: |
**/TestResults/*
**/logs/*
test-sqs:
name: AWS SQS provider tests
runs-on: ubuntu-latest
continue-on-error: true
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:
matrix:
provider: ["SQS"]
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@v4
- 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: Setup .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: global.json
- name: Test
run: dotnet test
test/Extensions/Orleans.AWS.Tests/Orleans.AWS.Tests.csproj
--framework ${{ matrix.framework }}
--filter "Category=${{ matrix.provider }}"
--blame-hang-timeout 10m
--blame-crash-dump-type full
--blame-hang-dump-type full
--logger "trx;LogFileName=test_results_${{ matrix.provider }}_${{ matrix.framework }}.trx"
--
-parallel none -noshadow
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
- name: Archive Test Results
if: always()
continue-on-error: true
uses: actions/upload-artifact@v4
with:
name: test_output_${{ github.job }}_${{ matrix.framework }}
retention-days: 1
path: |
**/TestResults/*
**/logs/*
test-nats:
name: NATS stream provider tests
runs-on: ubuntu-latest
continue-on-error: true
env:
BuildExternalAssets: "false"
strategy:
matrix:
provider: ["NATS"]
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: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5
with:
global-json-file: global.json
- name: Test
run: dotnet test
test/Extensions/Orleans.Streaming.NATS.Tests/Orleans.Streaming.NATS.Tests.csproj
--framework ${{ matrix.framework }}
--filter "Category=${{ matrix.provider }}"
--blame-hang-timeout 10m
--blame-crash-dump-type full
--blame-hang-dump-type full
--logger "trx;LogFileName=test_results_${{ matrix.provider }}_${{ matrix.framework }}.trx"
--
-parallel none -noshadow
- name: Clean up container
if: always()
run: docker rm -f nats || true
- name: Archive Test Results
if: always()
continue-on-error: true
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: test_output_${{ github.job }}_${{ matrix.framework }}
retention-days: 1
path: |
**/TestResults/*
**/logs/*
test:
name: Test
runs-on: ${{ matrix.os }}
continue-on-error: true
strategy:
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: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5
with:
global-json-file: global.json
- name: Build
run: dotnet build
- name: Test
run: dotnet test
--framework ${{ matrix.framework }}
--filter "Category=${{ matrix.suite }}&Category!=Consul"
--blame-hang-timeout 10m
--blame-crash-dump-type full
--blame-hang-dump-type full
--logger "trx;LogFileName=test_results_${{ matrix.suite }}_${{ matrix.framework }}.trx"
--
-parallel none -noshadow
- name: Archive Test Results
if: always()
continue-on-error: true
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: test_output_${{ github.job }}_${{ matrix.suite }}_${{ matrix.os }}_${{ matrix.framework }}
retention-days: 1
path: |
**/TestResults/*
**/logs/*
test-codegenerator:
name: Test Code Generator
runs-on: ${{ matrix.os }}
continue-on-error: true
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
framework: ["net8.0", "net10.0"]
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
- name: Setup .NET
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5
with:
global-json-file: global.json
- name: Test Code Generator
run: dotnet test
test/Orleans.CodeGenerator.Tests/Orleans.CodeGenerator.Tests.csproj
--framework ${{ matrix.framework }}
--blame-hang-timeout 10m
--blame-crash-dump-type full
--blame-hang-dump-type full
--logger "trx;LogFileName=test_results_${{ matrix.framework }}.trx"
--
-parallel none -noshadow
- name: Archive Test Results
if: always()
continue-on-error: true
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: test_output_${{ github.job }}_${{ matrix.os }}_${{ matrix.framework }}
retention-days: 1
path: |
**/TestResults/*
**/logs/*