Platform Tests #94
This file contains 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: Platform Tests | |
on: | |
push: | |
branches: | |
- master | |
paths-ignore: | |
- '.github/workflows/docs.yml' | |
- 'Harmony/Documentation/*' | |
pull_request: | |
branches: | |
- master | |
paths-ignore: | |
- '.github/workflows/docs.yml' | |
- 'Harmony/Documentation/*' | |
workflow_dispatch: | |
concurrency: | |
group: ${{github.workflow}}-${{github.event.pull_request.number || github.ref}} | |
cancel-in-progress: true | |
env: | |
# Right now we can't run experimental tests that can fail, since it will affect the PR | |
# We could potentially exclude experimental build on PR and only run it on master push | |
EXPERIMENTAL: false | |
# If set true, each target framework will be tested in it's own job instead of a single job | |
# NOTE: At some point when we'll have more target frameworks, parallelization should be more efficient | |
# It also will be more efficient once the `windows` workers will have a faster startup time | |
# METRICS: | |
# PARALLEL: true & PREBUILD: true ~ 15 minutes | |
# PARALLEL: false ~ 7 minutes | |
PARALLEL: false | |
# Whether we should build the binaries before running the tests | |
# Use with `PARALLEL: true` to reduce the execution time of test jobs, this increasing the throughput | |
PREBUILD: false | |
# You are interested in changing these values | |
BUILD_CONFIGURATIONS: "['ReleaseFat', 'ReleaseThin']" | |
BUILD_CONFIGURATIONS_WITH_REF: "['ReleaseFat', 'ReleaseThin', 'ReleaseRef']" | |
DOTNET_TARGET_FRAMEWORKS: "['netcoreapp3.0', 'netcoreapp3.1', 'net5.0', 'net6.0', 'net7.0', 'net8.0']" | |
DOTNET_TARGET_FRAMEWORKS_MACOS_ARM64: "['net6.0', 'net7.0', 'net8.0']" | |
FRAMEWORK_TARGET_FRAMEWORKS: "['net35', 'net452', 'net472', 'net48']" | |
jobs: | |
# https://stackoverflow.com/a/77549656 | |
variables: | |
name: Variable Accessibility Workaround for Jobs | |
runs-on: ubuntu-latest | |
outputs: | |
EXPERIMENTAL: ${{env.EXPERIMENTAL}} | |
PARALLEL: ${{env.PARALLEL}} | |
PREBUILD: ${{env.PREBUILD}} | |
BUILD_CONFIGURATIONS: ${{env.BUILD_CONFIGURATIONS}} | |
BUILD_CONFIGURATIONS_WITH_REF: ${{env.BUILD_CONFIGURATIONS_WITH_REF}} | |
DOTNET_TARGET_FRAMEWORKS: ${{env.DOTNET_TARGET_FRAMEWORKS}} | |
DOTNET_TARGET_FRAMEWORKS_MACOS_ARM64: ${{env.DOTNET_TARGET_FRAMEWORKS_MACOS_ARM64}} | |
FRAMEWORK_TARGET_FRAMEWORKS: ${{env.FRAMEWORK_TARGET_FRAMEWORKS}} | |
steps: | |
- name: Compute outputs | |
run: | | |
echo "EXPERIMENTAL=${{env.EXPERIMENTAL}}" >> $GITHUB_OUTPUT | |
echo "PARALLEL=${{env.PARALLEL}}" >> $GITHUB_OUTPUT | |
echo "PREBUILD=${{env.PREBUILD}}" >> $GITHUB_OUTPUT | |
echo "BUILD_CONFIGURATIONS=${{env.BUILD_CONFIGURATIONS}}" >> $GITHUB_OUTPUT | |
echo "BUILD_CONFIGURATIONS_WITH_REF=${{env.BUILD_CONFIGURATIONS_WITH_REF}}" >> $GITHUB_OUTPUT | |
echo "DOTNET_TARGET_FRAMEWORKS=${{env.DOTNET_TARGET_FRAMEWORKS}}" >> $GITHUB_OUTPUT | |
echo "DOTNET_TARGET_FRAMEWORKS_MACOS_ARM64=${{env.DOTNET_TARGET_FRAMEWORKS_MACOS_ARM64}}" >> $GITHUB_OUTPUT | |
echo "FRAMEWORK_TARGET_FRAMEWORKS=${{env.FRAMEWORK_TARGET_FRAMEWORKS}}" >> $GITHUB_OUTPUT | |
# Ideally we should be able to build binaries on Ubuntu to all platforms to test | |
# and have a job that will create binaries on each platform and compare the output dll's | |
build-binaries: | |
name: Build Binaries | |
needs: variables | |
strategy: | |
matrix: | |
image: [ { os: 'windows', code: 'windows-latest' }, { os: 'ubuntu', code: 'ubuntu-latest' }, { os: 'macos', code: 'macos-13' }, { os: 'macos-arm64', code: 'macos-14' } ] | |
build_configuration: ${{fromJson(needs.variables.outputs.BUILD_CONFIGURATIONS_WITH_REF)}} | |
uses: ./.github/workflows/test-build.yml | |
with: | |
os: ${{matrix.image.os}} | |
image: ${{matrix.image.code}} | |
build_configuration: ${{matrix.build_configuration}} | |
publish: ${{matrix.image.os == 'ubuntu'}} | |
manual_build: ${{needs.variables.outputs.PREBUILD != 'true'}} | |
windows-dotnet: | |
name: Windows .NET x86/x64 | |
needs: [variables, build-binaries] | |
strategy: | |
matrix: | |
architecture: ['x86', 'x64'] | |
target_framework: ${{fromJson((needs.variables.outputs.PARALLEL == 'true' && needs.variables.outputs.DOTNET_TARGET_FRAMEWORKS) || '[""]')}} | |
build_configuration: ${{fromJson(needs.variables.outputs.BUILD_CONFIGURATIONS)}} | |
uses: ./.github/workflows/test-windows-dotnet.yml | |
with: | |
architecture: ${{matrix.architecture}} | |
target_framework: ${{matrix.target_framework}} | |
target_framework_array: ${{needs.variables.outputs.DOTNET_TARGET_FRAMEWORKS}} | |
build_configuration: ${{matrix.build_configuration}} | |
manual_build: ${{needs.variables.outputs.PREBUILD != 'true'}} | |
windows-framework: | |
name: Windows .NET Framework x86/x64 | |
needs: [variables, build-binaries] | |
strategy: | |
fail-fast: false | |
matrix: | |
architecture: ['x86', 'x64'] | |
target_framework: ${{fromJson((needs.variables.outputs.PARALLEL == 'true' && needs.variables.outputs.FRAMEWORK_TARGET_FRAMEWORKS) || '[""]')}} | |
build_configuration: ${{fromJson(needs.variables.outputs.BUILD_CONFIGURATIONS)}} | |
uses: ./.github/workflows/test-windows-framework.yml | |
with: | |
architecture: ${{matrix.architecture}} | |
target_framework: ${{matrix.target_framework}} | |
target_framework_array: ${{needs.variables.outputs.FRAMEWORK_TARGET_FRAMEWORKS}} | |
build_configuration: ${{matrix.build_configuration}} | |
manual_build: ${{needs.variables.outputs.PREBUILD != 'true'}} | |
windows-mono: | |
name: Windows Mono x86/x64 | |
needs: [variables, build-binaries] | |
strategy: | |
fail-fast: false | |
matrix: | |
architecture: ['x86', 'x64'] | |
target_framework: ${{fromJson((needs.variables.outputs.PARALLEL == 'true' && needs.variables.outputs.FRAMEWORK_TARGET_FRAMEWORKS) || '[""]')}} | |
build_configuration: ${{fromJson(needs.variables.outputs.BUILD_CONFIGURATIONS)}} | |
uses: ./.github/workflows/test-windows-mono.yml | |
with: | |
architecture: ${{matrix.architecture}} | |
target_framework: ${{matrix.target_framework}} | |
target_framework_array: ${{needs.variables.outputs.FRAMEWORK_TARGET_FRAMEWORKS}} | |
build_configuration: ${{matrix.build_configuration}} | |
manual_build: ${{needs.variables.outputs.PREBUILD != 'true'}} | |
ubuntu-macos-x64-dotnet: | |
name: Ubuntu/MacOS .NET x64 | |
needs: [variables, build-binaries] | |
strategy: | |
fail-fast: false | |
matrix: | |
image: [ { os: 'ubuntu', code: 'ubuntu-latest' }, { os: 'macos', code: 'macos-13' } ] | |
architecture: ['x64'] | |
target_framework: ${{fromJson((needs.variables.outputs.PARALLEL == 'true' && needs.variables.outputs.DOTNET_TARGET_FRAMEWORKS) || '[""]')}} | |
build_configuration: ${{fromJson(needs.variables.outputs.BUILD_CONFIGURATIONS)}} | |
uses: ./.github/workflows/test-unix-dotnet.yml | |
with: | |
os: ${{matrix.image.os}} | |
image: ${{matrix.image.code}} | |
architecture: ${{matrix.architecture}} | |
target_framework: ${{matrix.target_framework }} | |
target_framework_array: ${{needs.variables.outputs.DOTNET_TARGET_FRAMEWORKS}} | |
build_configuration: ${{matrix.build_configuration}} | |
manual_build: ${{needs.variables.outputs.PREBUILD != 'true'}} | |
ubuntu-macos-x64-mono: | |
name: Ubuntu/MacOS Mono x64 | |
needs: [variables, build-binaries] | |
strategy: | |
fail-fast: false | |
matrix: | |
image: [ { os: 'ubuntu', code: 'ubuntu-latest' }, { os: 'macos', code: 'macos-13' } ] | |
architecture: ['x64'] | |
target_framework: ${{fromJson((needs.variables.outputs.PARALLEL == 'true' && needs.variables.outputs.FRAMEWORK_TARGET_FRAMEWORKS) || '[""]')}} | |
build_configuration: ${{fromJson(needs.variables.outputs.BUILD_CONFIGURATIONS)}} | |
uses: ./.github/workflows/test-unix-mono.yml | |
with: | |
os: ${{matrix.image.os}} | |
image: ${{matrix.image.code}} | |
architecture: ${{matrix.architecture}} | |
target_framework: ${{matrix.target_framework}} | |
target_framework_array: ${{needs.variables.outputs.FRAMEWORK_TARGET_FRAMEWORKS}} | |
build_configuration: ${{matrix.build_configuration}} | |
manual_build: ${{needs.variables.outputs.PREBUILD != 'true'}} | |
macos-rosetta-dotnet: | |
name: MacOS .NET Rosetta 2 | |
needs: [variables, build-binaries] | |
if: ${{needs.variables.outputs.EXPERIMENTAL == 'true'}} | |
strategy: | |
fail-fast: false | |
matrix: | |
image: [ { os: 'macos-arm64', code: 'macos-14' } ] | |
architecture: ['x64'] | |
target_framework: ${{fromJson((needs.variables.outputs.PARALLEL == 'true' && needs.variables.outputs.DOTNET_TARGET_FRAMEWORKS_MACOS_ARM64) || '[""]')}} | |
build_configuration: ${{fromJson(needs.variables.outputs.BUILD_CONFIGURATIONS)}} | |
uses: ./.github/workflows/test-unix-dotnet.yml | |
with: | |
os: ${{matrix.image.os}} | |
image: ${{matrix.image.code}} | |
architecture: ${{matrix.architecture}} | |
target_framework: ${{matrix.target_framework }} | |
target_framework_array: ${{needs.variables.outputs.DOTNET_TARGET_FRAMEWORKS_MACOS_ARM64}} | |
build_configuration: ${{matrix.build_configuration}} | |
manual_build: ${{needs.variables.outputs.PREBUILD != 'true'}} | |
macos-rosetta-mono: | |
name: MacOS Mono Rosetta 2 | |
needs: [variables, build-binaries] | |
strategy: | |
fail-fast: false | |
matrix: | |
image: [ { os: 'macos-arm64', code: 'macos-14' } ] | |
architecture: ['x64'] | |
target_framework: ${{fromJson((needs.variables.outputs.PARALLEL == 'true' && needs.variables.outputs.FRAMEWORK_TARGET_FRAMEWORKS) || '[""]')}} | |
build_configuration: ${{fromJson(needs.variables.outputs.BUILD_CONFIGURATIONS)}} | |
uses: ./.github/workflows/test-unix-mono.yml | |
with: | |
os: ${{matrix.image.os}} | |
image: ${{matrix.image.code}} | |
architecture: ${{matrix.architecture}} | |
target_framework: ${{matrix.target_framework}} | |
target_framework_array: ${{needs.variables.outputs.FRAMEWORK_TARGET_FRAMEWORKS}} | |
build_configuration: ${{matrix.build_configuration}} | |
manual_build: ${{needs.variables.outputs.PREBUILD != 'true'}} | |
ubuntu-arm64-dotnet: | |
name: Ubuntu .NET arm64 | |
needs: [variables, build-binaries] | |
if: ${{needs.variables.outputs.EXPERIMENTAL == 'true'}} | |
strategy: | |
fail-fast: false | |
matrix: | |
target_framework: ${{fromJson((needs.variables.outputs.PARALLEL == 'true' && needs.variables.outputs.DOTNET_TARGET_FRAMEWORKS_MACOS_ARM64) || '[""]')}} | |
build_configuration: ${{fromJson(needs.variables.outputs.BUILD_CONFIGURATIONS)}} | |
uses: ./.github/workflows/test-qemu-dotnet.yml | |
with: | |
target_framework: ${{matrix.target_framework}} | |
#target_framework_array: ${{fromJson(needs.variables.outputs.DOTNET_TARGET_FRAMEWORKS_MACOS_ARM64)}} | |
build_configuration: ${{ matrix.build_configuration }} | |
run_settings_args: 'NUnit.DefaultTestNamePattern="{C}:{m}{a}" RunConfiguration.TargetPlatform=arm64' | |
#manual_build: ${{needs.variables.outputs.PREBUILD != 'true'}} | |
experimental: true | |
ubuntu-arm64-mono: | |
name: Ubuntu .NET arm64 | |
needs: [variables, build-binaries] | |
if: ${{needs.variables.outputs.EXPERIMENTAL == 'true'}} | |
strategy: | |
fail-fast: false | |
matrix: | |
target_framework: ${{fromJson((needs.variables.outputs.PARALLEL == 'true' && needs.variables.outputs.FRAMEWORK_TARGET_FRAMEWORKS) || '[""]')}} | |
build_configuration: ${{fromJson(needs.variables.outputs.BUILD_CONFIGURATIONS)}} | |
uses: ./.github/workflows/test-qemu-mono.yml | |
with: | |
target_framework: ${{matrix.target_framework}} | |
#target_framework_array: ${{fromJson(needs.variables.outputs.FRAMEWORK_TARGET_FRAMEWORKS)}} | |
build_configuration: ${{matrix.build_configuration}} | |
run_settings_args: 'NUnit.DefaultTestNamePattern="{C}:{m}{a}" RunConfiguration.TargetPlatform=arm64' | |
#manual_build: ${{needs.variables.outputs.PREBUILD != 'true'}} | |
experimental: true | |
macos-arm64-dotnet: | |
name: MacOS .NET arm64 | |
needs: [variables, build-binaries] | |
if: ${{needs.variables.outputs.EXPERIMENTAL == 'true'}} | |
strategy: | |
fail-fast: false | |
matrix: | |
image: [ { os: 'macos-arm64', code: 'macos-14' } ] | |
architecture: ['arm64'] | |
target_framework: ${{fromJson((needs.variables.outputs.PARALLEL == 'true' && needs.variables.outputs.DOTNET_TARGET_FRAMEWORKS_MACOS_ARM64) || '[""]')}} | |
build_configuration: ${{fromJson(needs.variables.outputs.BUILD_CONFIGURATIONS)}} | |
uses: ./.github/workflows/test-unix-dotnet.yml | |
with: | |
os: ${{ matrix.image.os }} | |
image: ${{ matrix.image.code }} | |
architecture: ${{ matrix.architecture }} | |
target_framework: ${{ matrix.target_framework }} | |
target_framework_array: ${{fromJson(needs.variables.outputs.DOTNET_TARGET_FRAMEWORKS_MACOS_ARM64)}} | |
build_configuration: ${{matrix.build_configuration}} | |
manual_build: ${{needs.variables.outputs.PREBUILD != 'true'}} | |
experimental: true | |
test-results: | |
name: Download and Upload Test Results | |
needs: [windows-dotnet, windows-framework, windows-mono, ubuntu-macos-x64-dotnet, ubuntu-macos-x64-mono, macos-rosetta-dotnet, macos-rosetta-mono] | |
if: always() | |
uses: ./.github/workflows/test-result-upload.yml | |
test-results-experimental: | |
name: Download and Upload Test Results (Experimental) | |
needs: [ubuntu-arm64-dotnet, ubuntu-arm64-mono, macos-arm64-dotnet] | |
if: ${{needs.variables.outputs.EXPERIMENTAL == 'true' && always()}} | |
uses: ./.github/workflows/test-result-upload.yml | |
with: | |
experimental: true | |
cleanup-build-output: | |
name: Cleanup Build Output | |
needs: [test-results, test-results-experimental] | |
runs-on: ubuntu-latest | |
if: always() | |
steps: | |
- uses: joutvhu/delete-artifact@v2 | |
with: | |
pattern: build-output-* | |
- uses: joutvhu/delete-artifact@v2 | |
with: | |
pattern: test-results-* | |
- uses: joutvhu/delete-artifact@v2 | |
if: ${{needs.variables.outputs.PARALLEL == 'true'}} | |
with: | |
pattern: experimental-test-results-* |