perf(manifest): reduce cluster manifest payload size #6614
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: .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/* |