Skip to content

Add support for running tests on BaaSaas locally (#3523) #2396

Add support for running tests on BaaSaas locally (#3523)

Add support for running tests on BaaSaas locally (#3523) #2396

Workflow file for this run

name: main
"on":
push:
branches:
- main
workflow_dispatch:
inputs:
publish-prerelease:
description: Indicates whether to publish the package to Sleet/npm
required: false
type: boolean
run-benchmark:
description: Indicates whether to run the benchmark tests
required: false
type: boolean
env:
REALM_DISABLE_ANALYTICS: true
DOTNET_NOLOGO: true
jobs:
build-wrappers:
uses: ./.github/workflows/wrappers.yml
name: Wrappers
deploy-cluster:
uses: ./.github/workflows/deploy-baas.yml
with:
differentiators: '["net-framework", "code-coverage", "uwp-managed", "xamarinmacos", "ios", "android", "maccatalyst"]'
BaseUrl: https://realm-qa.mongodb.com
AtlasBaseUrl: https://cloud-qa.mongodb.com
secrets:
AtlasProjectId: ${{ secrets.ATLAS_QA_PROJECT_ID }}
AtlasPublicKey: ${{ secrets.ATLAS_QA_PUBLIC_API_KEY }}
AtlasPrivateKey: ${{ secrets.ATLAS_QA_PRIVATE_API_KEY }}
build-packages:
uses: ./.github/workflows/build-packages.yml
name: Package
needs:
- build-wrappers
publish-packages-to-sleet:
runs-on: ubuntu-latest
name: Publish package to S3
needs:
- build-packages
if: always() && !cancelled() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') && (github.event_name == 'push' || github.event.inputs.publish-prerelease)
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
submodules: false
ref: ${{ github.event.pull_request.head.sha }}
- name: Fetch Realm.PlatformHelpers
uses: actions/download-artifact@v3
with:
name: Realm.PlatformHelpers.${{ needs.build-packages.outputs.package_version }}
path: ${{ github.workspace }}/Realm/packages/
- name: Fetch Realm
uses: actions/download-artifact@v3
with:
name: Realm.${{ needs.build-packages.outputs.package_version }}
path: ${{ github.workspace }}/Realm/packages/
- name: Configure .NET
uses: actions/setup-dotnet@607fce577a46308457984d59e4954e075820f10a
with:
dotnet-version: 6.0.x
- name: Install sleet
run: dotnet tool install -g sleet
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1-node16
with:
aws-access-key-id: ${{ secrets.NUGET_S3_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.NUGET_S3_SECRET_KEY }}
aws-region: us-east-1
- name: NuGet Publish Realm.PlatformHelpers.${{ needs.build-packages.outputs.package_version }}
run: sleet push ${{ github.workspace }}/Realm/packages/Realm.PlatformHelpers.${{ needs.build-packages.outputs.package_version }}.nupkg --config ${{ github.workspace }}/.github/sleet.json --source NugetSource
- name: NuGet Publish Realm.${{ needs.build-packages.outputs.package_version }}
run: sleet push ${{ github.workspace }}/Realm/packages/Realm.${{ needs.build-packages.outputs.package_version }}.nupkg --config ${{ github.workspace }}/.github/sleet.json --source NugetSource
build-unity:
uses: ./.github/workflows/build-unity.yml
name: Package
with:
version: ${{ needs.build-packages.outputs.package_version }}
needs:
- build-packages
if: always() && !cancelled() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled')
test-net-framework:
uses: ./.github/workflows/test-net-framework.yml
name: Test
if: always() && !cancelled() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled')
needs:
- build-packages
- deploy-cluster
with:
version: ${{ needs.build-packages.outputs.package_version }}
clusterName: ${{ needs.deploy-cluster.outputs.clusterName }}
realmUrl: https://realm-qa.mongodb.com
atlasUrl: https://cloud-qa.mongodb.com
secrets:
AtlasProjectId: ${{ secrets.ATLAS_QA_PROJECT_ID }}
AtlasPublicKey: ${{ secrets.ATLAS_QA_PUBLIC_API_KEY }}
AtlasPrivateKey: ${{ secrets.ATLAS_QA_PRIVATE_API_KEY }}
test-uwp-managed:
uses: ./.github/workflows/test-uwp-managed.yml
name: Test
if: always() && !cancelled() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled')
needs:
- build-packages
- deploy-cluster
with:
version: ${{ needs.build-packages.outputs.package_version }}
clusterName: ${{ needs.deploy-cluster.outputs.clusterName }}
realmUrl: https://realm-qa.mongodb.com
atlasUrl: https://cloud-qa.mongodb.com
secrets:
AtlasProjectId: ${{ secrets.ATLAS_QA_PROJECT_ID }}
AtlasPublicKey: ${{ secrets.ATLAS_QA_PUBLIC_API_KEY }}
AtlasPrivateKey: ${{ secrets.ATLAS_QA_PRIVATE_API_KEY }}
Pfx_Password: ${{ secrets.Pfx_Password }}
Base64_Encoded_Pfx: ${{ secrets.Base64_Encoded_Pfx }}
test-net-core:
if: always() && !cancelled() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled')
name: Test
needs:
- build-packages
uses: ./.github/workflows/test-net-core.yml
with:
version: ${{ needs.build-packages.outputs.package_version }}
framework: '["net6.0", "net7.0"]'
test-macos:
uses: ./.github/workflows/test-macos.yml
name: Test
if: always() && !cancelled() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled')
needs:
- build-packages
- deploy-cluster
with:
version: ${{ needs.build-packages.outputs.package_version }}
clusterName: ${{ needs.deploy-cluster.outputs.clusterName }}
realmUrl: https://realm-qa.mongodb.com
atlasUrl: https://cloud-qa.mongodb.com
secrets:
AtlasProjectId: ${{ secrets.ATLAS_QA_PROJECT_ID }}
AtlasPublicKey: ${{ secrets.ATLAS_QA_PUBLIC_API_KEY }}
AtlasPrivateKey: ${{ secrets.ATLAS_QA_PRIVATE_API_KEY }}
test-ios:
uses: ./.github/workflows/test-ios.yml
name: Test
if: always() && !cancelled() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled')
needs:
- build-packages
- deploy-cluster
with:
version: ${{ needs.build-packages.outputs.package_version }}
clusterName: ${{ needs.deploy-cluster.outputs.clusterName }}
realmUrl: https://realm-qa.mongodb.com
atlasUrl: https://cloud-qa.mongodb.com
secrets:
AtlasProjectId: ${{ secrets.ATLAS_QA_PROJECT_ID }}
AtlasPublicKey: ${{ secrets.ATLAS_QA_PUBLIC_API_KEY }}
AtlasPrivateKey: ${{ secrets.ATLAS_QA_PRIVATE_API_KEY }}
test-tvos:
uses: ./.github/workflows/test-tvos.yml
name: Test
if: always() && !cancelled() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled')
needs:
- build-packages
with:
version: ${{ needs.build-packages.outputs.package_version }}
secrets: {}
test-android:
uses: ./.github/workflows/test-android.yml
name: Test
if: always() && !cancelled() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled')
needs:
- build-packages
- deploy-cluster
with:
version: ${{ needs.build-packages.outputs.package_version }}
clusterName: ${{ needs.deploy-cluster.outputs.clusterName }}
realmUrl: https://realm-qa.mongodb.com
atlasUrl: https://cloud-qa.mongodb.com
secrets:
AtlasProjectId: ${{ secrets.ATLAS_QA_PROJECT_ID }}
AtlasPublicKey: ${{ secrets.ATLAS_QA_PUBLIC_API_KEY }}
AtlasPrivateKey: ${{ secrets.ATLAS_QA_PRIVATE_API_KEY }}
AWS_DEVICEFARM_ACCESS_KEY_ID: ${{ secrets.AWS_DEVICEFARM_ACCESS_KEY_ID }}
AWS_DEVICEFARM_SECRET_ACCESS_KEY: ${{ secrets.AWS_DEVICEFARM_SECRET_ACCESS_KEY }}
DEVICEFARM_PROJECT_ARN: ${{ secrets.DEVICEFARM_PROJECT_ARN }}
DEVICEFARM_ANDROID_POOL_ARN: ${{ secrets.DEVICEFARM_ANDROID_POOL_ARN }}
test-xunit:
runs-on: windows-latest
name: Test xUnit Compatibility
timeout-minutes: 10
needs:
- build-packages
if: always() && !cancelled() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled')
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
submodules: false
ref: ${{ github.event.pull_request.head.sha }}
- name: Register csc problem matcher
run: echo "::add-matcher::.github/problem-matchers/csc.json"
- name: Register msvc problem matcher
run: echo "::add-matcher::.github/problem-matchers/msvc.json"
- name: Fetch Realm.PlatformHelpers
uses: actions/download-artifact@v3
with:
name: Realm.PlatformHelpers.${{ needs.build-packages.outputs.package_version }}
path: ${{ github.workspace }}/Realm/packages/
- name: Fetch Realm
uses: actions/download-artifact@v3
with:
name: Realm.${{ needs.build-packages.outputs.package_version }}
path: ${{ github.workspace }}/Realm/packages/
- name: Publish Tests/Tests.XUnit
run: dotnet publish Tests/Tests.XUnit -c Release -f net6.0 -r win-x64 -p:RestoreConfigFile=Tests/Test.NuGet.Config -p:UseRealmNupkgsWithVersion=${{ needs.build-packages.outputs.package_version }} --no-self-contained
- name: Output executable path
id: dotnet-publish
run: echo 'executable-path=./Tests/Tests.XUnit/bin/Release/net6.0/win-x64' >> $GITHUB_OUTPUT
shell: bash
- name: Run Tests
run: dotnet test ${{ steps.dotnet-publish.outputs.executable-path }}/Tests.XUnit.dll --logger GitHubActions
test-weaver:
uses: ./.github/workflows/test-weaver.yml
name: Test
test-code-coverage:
uses: ./.github/workflows/test-code-coverage.yml
name: Test
if: always() && !cancelled() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled')
needs:
- build-packages
- deploy-cluster
with:
version: ${{ needs.build-packages.outputs.package_version }}
clusterName: ${{ needs.deploy-cluster.outputs.clusterName }}
realmUrl: https://realm-qa.mongodb.com
atlasUrl: https://cloud-qa.mongodb.com
secrets:
AtlasProjectId: ${{ secrets.ATLAS_QA_PROJECT_ID }}
AtlasPublicKey: ${{ secrets.ATLAS_QA_PUBLIC_API_KEY }}
AtlasPrivateKey: ${{ secrets.ATLAS_QA_PRIVATE_API_KEY }}
benchmark-linux:
name: Benchmark Linux
needs: build-packages
runs-on: performance-tests
if: always() && !cancelled() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') && (github.event_name == 'push' || github.event.inputs.run-benchmark)
timeout-minutes: 60
steps:
- name: Cleanup Workspace
run: rm -rf "${{ github.workspace }}/*"
- name: Checkout code
uses: actions/checkout@v3
with:
submodules: false
ref: ${{ github.event.pull_request.head.sha }}
- name: Register csc problem matcher
run: echo "::add-matcher::.github/problem-matchers/csc.json"
- name: Register msvc problem matcher
run: echo "::add-matcher::.github/problem-matchers/msvc.json"
- name: Fetch Realm.PlatformHelpers
uses: actions/download-artifact@v3
with:
name: Realm.PlatformHelpers.${{ needs.build-packages.outputs.package_version }}
path: ${{ github.workspace }}/Realm/packages/
- name: Fetch Realm
uses: actions/download-artifact@v3
with:
name: Realm.${{ needs.build-packages.outputs.package_version }}
path: ${{ github.workspace }}/Realm/packages/
- name: Publish Tests/Benchmarks/PerformanceTests
run: dotnet publish Tests/Benchmarks/PerformanceTests -c Release -f net6.0 -r linux-x64 -p:RestoreConfigFile=Tests/Test.NuGet.Config -p:UseRealmNupkgsWithVersion=${{ needs.build-packages.outputs.package_version }} -p:RealmTestsStandaloneExe=true --no-self-contained
- name: Output executable path
id: dotnet-publish
run: echo 'executable-path=./Tests/Benchmarks/PerformanceTests/bin/Release/net6.0/linux-x64' >> $GITHUB_OUTPUT
shell: bash
- name: Run the tests
run: ${{ steps.dotnet-publish.outputs.executable-path }}/PerformanceTests -f "*" --join
- name: Find Results file
id: find-results-file
run: |
cd BenchmarkDotNet.Artifacts/results
file=$(basename BenchmarkRun*json)
echo "benchmark-results=$file" >> $GITHUB_OUTPUT
shell: bash
- name: Publish Benchmark Results
uses: ./.github/actions/benchmark-uploader
with:
realm-token: ${{ secrets.Realm_Token }}
file: ${{ github.workspace }}/BenchmarkDotNet.Artifacts/results/${{ steps.find-results-file.outputs.benchmark-results }}
dashboard-path: dashboard.charts
nuget-package: ${{ github.workspace }}/Realm/packages/Realm.${{ needs.build-packages.outputs.package_version }}.nupkg
- name: Store artifacts for dashboard.charts
uses: actions/upload-artifact@v3
with:
name: dashboard.charts
path: ${{ github.workspace }}/dashboard.charts
retention-days: 30
if-no-files-found: error
cleanup-cluster:
uses: ./.github/workflows/cleanup-baas.yml
if: always()
name: Cleanup
needs:
- deploy-cluster
- test-net-framework
- test-code-coverage
- test-uwp-managed
- test-macos
- test-ios
- test-android
with:
differentiators: '["net-framework", "code-coverage", "uwp-managed", "xamarinmacos", "ios", "android", "maccatalyst"]'
clusterName: ${{ needs.deploy-cluster.outputs.clusterName }}
BaseUrl: https://realm-qa.mongodb.com
AtlasBaseUrl: https://cloud-qa.mongodb.com
secrets:
AtlasProjectId: ${{ secrets.ATLAS_QA_PROJECT_ID }}
AtlasPublicKey: ${{ secrets.ATLAS_QA_PUBLIC_API_KEY }}
AtlasPrivateKey: ${{ secrets.ATLAS_QA_PRIVATE_API_KEY }}