perf(codegen): pool generated IInvokable request objects #9538
Workflow file for this run
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 | |
| 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" |