Skip to content

Implemented a GitHub Actions testing pipeline #1

Implemented a GitHub Actions testing pipeline

Implemented a GitHub Actions testing pipeline #1

Workflow file for this run

name: Perform Testing
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:
env:
# You are interested in changing these values
BUILD_CONFIGURATIONS: "['ReleaseFat', 'ReleaseThin']"
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:
BUILD_CONFIGURATIONS: ${{ env.BUILD_CONFIGURATIONS }}
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 "BUILD_CONFIGURATIONS=${{env.BUILD_CONFIGURATIONS}}" >> $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)}}
uses: ./.github/workflows/test-build.yml
with:
os: ${{ matrix.image.os }}
image: ${{ matrix.image.code }}
build_configuration: ${{ matrix.build_configuration }}
publish: ${{ matrix.image.os == 'windows' }}
windows-dotnet:
name: Windows .NET x86/x64
needs: [variables, build-binaries]
strategy:
matrix:
architecture: ['x86', 'x64']
target_framework: ${{fromJson(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 }}
build_configuration: ${{ matrix.build_configuration }}
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.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 }}
build_configuration: ${{ matrix.build_configuration }}
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.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 }}
build_configuration: ${{ matrix.build_configuration }}
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.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 }}
build_configuration: ${{ matrix.build_configuration }}
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.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 }}
build_configuration: ${{ matrix.build_configuration }}
ubuntu-arm64-dotnet:
name: Ubuntu .NET arm64
needs: [variables, build-binaries]
strategy:
fail-fast: false
matrix:
target_framework: ${{fromJson(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 }}
build_configuration: ${{ matrix.build_configuration }}
run_settings_args: 'NUnit.DefaultTestNamePattern="{C}:{m}{a}" RunConfiguration.TargetPlatform=arm64'
experimental: true
ubuntu-arm64-mono:
name: Ubuntu .NET arm64
needs: [variables, build-binaries]
strategy:
fail-fast: false
matrix:
target_framework: ${{fromJson(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 }}
build_configuration: ${{ matrix.build_configuration }}
run_settings_args: 'NUnit.DefaultTestNamePattern="{C}:{m}{a}" RunConfiguration.TargetPlatform=arm64'
experimental: true
macos-arm64-dotnet:
name: MacOS .NET arm64
needs: [variables, build-binaries]
strategy:
fail-fast: false
matrix:
image: [ { os: 'macos-arm64', code: 'macos-14' } ]
architecture: ['arm64']
target_framework: ${{fromJson(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 }}
build_configuration: ${{ matrix.build_configuration }}
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, ubuntu-arm64-dotnet, ubuntu-arm64-mono, macos-arm64-dotnet]
if: always()
uses: ./.github/workflows/test-result-upload.yml
test-results-experimental:
name: Download and Upload Test Results (Experimental)
needs: [windows-dotnet, windows-framework, windows-mono, ubuntu-macos-x64-dotnet, ubuntu-macos-x64-mono, ubuntu-arm64-dotnet, ubuntu-arm64-mono, macos-arm64-dotnet]
if: 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
with:
pattern: experimental-test-results-*