CI #1252
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
# https://docs.github.com/actions/using-workflows/about-workflows | |
# https://docs.github.com/actions/using-workflows/workflow-syntax-for-github-actions | |
name: CI | |
# Controls when the action will run. | |
on: | |
# Triggers the workflow on push or pull request events but only for the main or release branches | |
push: | |
branches: [ main, 'rel/*', 'dev/*' ] | |
pull_request: | |
branches: [ main, 'dev/*' ] | |
# Allows you to run this workflow manually from the Actions tab | |
workflow_dispatch: | |
merge_group: | |
env: | |
DOTNET_VERSION: ${{ '8.0.201' }} | |
ENABLE_DIAGNOSTICS: true | |
MSBUILD_VERBOSITY: normal | |
#COREHOST_TRACE: 1 | |
COREHOST_TRACEFILE: corehosttrace.log | |
MULTI_TARGET_DIRECTORY: tooling/MultiTarget | |
HEADS_DIRECTORY: tooling/ProjectHeads | |
IS_MAIN: ${{ github.ref == 'refs/heads/main' }} | |
IS_PR: ${{ startsWith(github.ref, 'refs/pull/') }} | |
IS_RELEASE: ${{ startsWith(github.ref, 'refs/heads/rel/') }} | |
# A workflow run is made up of one or more jobs that can run sequentially or in parallel | |
jobs: | |
# This workflow contains a single job called "Xaml-Style-Check" | |
Xaml-Style-Check: | |
runs-on: windows-latest | |
# Steps represent a sequence of tasks that will be executed as part of the job | |
steps: | |
- name: Install .NET SDK v${{ env.DOTNET_VERSION }} | |
uses: actions/setup-dotnet@v4 | |
with: | |
dotnet-version: ${{ env.DOTNET_VERSION }} | |
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it | |
- name: Checkout Repository | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
# Restore Tools from Manifest list in the Repository | |
- name: Restore dotnet tools | |
run: dotnet tool restore | |
- name: Check XAML Styling | |
run: powershell -version 5.1 -command "./ApplyXamlStyling.ps1 -Passive" -ErrorAction Stop | |
# Build both Uno.UI/WinUI2/UWP and Uno.WinUI/WinUI3/WindowsAppSDK versions of our packages using a matrix | |
build: | |
needs: [Xaml-Style-Check] | |
runs-on: windows-latest-large | |
# See https://docs.github.com/actions/using-jobs/using-a-matrix-for-your-jobs | |
strategy: | |
fail-fast: false # prevent one matrix pipeline from being cancelled if one fails, we want them all to run to completion. | |
matrix: | |
winui: [2, 3] | |
multitarget: ['uwp', 'wasdk', 'wasm', 'wpf', 'linuxgtk', 'macos', 'ios', 'android'] | |
exclude: | |
# WinUI 2 not supported on wasdk | |
- winui: 2 | |
multitarget: wasdk | |
# WinUI 3 not supported on uwp | |
- winui: 3 | |
multitarget: uwp | |
# Steps represent a sequence of tasks that will be executed as part of the job | |
steps: | |
- name: Configure Pagefile | |
uses: al-cheb/configure-pagefile-action@v1.4 | |
with: | |
minimum-size: 32GB | |
maximum-size: 32GB | |
disk-root: "C:" | |
- name: Enable User-Mode Dumps collecting | |
if: ${{ env.ENABLE_DIAGNOSTICS == 'true' || env.COREHOST_TRACE != '' }} | |
shell: powershell | |
run: | | |
New-Item '${{ github.workspace }}\CrashDumps' -Type Directory | |
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps' -Name 'DumpFolder' -Type ExpandString -Value '${{ github.workspace }}\CrashDumps' | |
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps' -Name 'DumpCount' -Type DWord -Value '10' | |
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps' -Name 'DumpType' -Type DWord -Value '2' | |
- name: Install .NET SDK v${{ env.DOTNET_VERSION }} | |
uses: actions/setup-dotnet@v4 | |
with: | |
dotnet-version: ${{ env.DOTNET_VERSION }} | |
- name: .NET Info (if diagnostics) | |
if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }} | |
run: dotnet --info | |
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it | |
- name: Checkout Repository | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
# Restore Tools from Manifest list in the Repository | |
- name: Restore dotnet tools | |
run: dotnet tool restore | |
- name: Run Uno Check to Install Dependencies | |
if: ${{ matrix.multitarget != 'wasdk' && matrix.multitarget != 'linuxgtk' && matrix.multitarget != 'wpf' }} | |
run: > | |
dotnet tool run uno-check | |
--ci | |
--target ${{ matrix.multitarget }} | |
--fix | |
--non-interactive | |
--skip wsl | |
--skip androidemulator | |
--skip vswinworkloads | |
--verbose | |
- name: Add msbuild to PATH | |
uses: microsoft/setup-msbuild@v2 | |
with: | |
vs-version: '[17.9,)' | |
# Generate full solution with all projects (sample gallery heads, components, tests) | |
- name: Generate solution with ${{ matrix.multitarget }} gallery, components and tests | |
working-directory: ./ | |
run: powershell -version 5.1 -command "./tooling/GenerateAllSolution.ps1 -MultiTargets ${{ matrix.multitarget }} ${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} -WinUIMajorVersion ${{ matrix.winui }}" -ErrorAction Stop | |
# Build solution | |
- name: MSBuild | |
run: > | |
msbuild.exe /restore /nowarn:MSB4011 | |
/p:Configuration=Release | |
/m | |
${{ env.ENABLE_DIAGNOSTICS == 'true' && '/bl' || '' }} | |
/v:${{ env.MSBUILD_VERBOSITY }} | |
CommunityToolkit.AllComponents.sln | |
# Run tests | |
- name: Setup VSTest Path | |
uses: darenm/setup-vstest@3a16d909a1f3bbc65b52f8270d475d905e7d3e44 | |
- name: Install Testspace Module | |
uses: testspace-com/setup-testspace@v1 | |
with: | |
domain: ${{ github.repository_owner }} | |
- name: Run SourceGenerators tests | |
id: test-generator | |
run: vstest.console.exe ./tooling/CommunityToolkit.Tooling.SampleGen.Tests/bin/Release/net6.0/CommunityToolkit.Tooling.SampleGen.Tests.dll /logger:"trx;LogFileName=SourceGenerators.trx" | |
- name: Run component tests against ${{ matrix.multitarget }} | |
if: ${{ matrix.multitarget == 'uwp' || matrix.multitarget == 'wasdk' }} | |
id: test-platform | |
run: vstest.console.exe ./tooling/**/CommunityToolkit.Tests.${{ matrix.multitarget }}.build.appxrecipe /Framework:FrameworkUap10 /logger:"trx;LogFileName=${{ matrix.multitarget }}.trx" /Blame | |
- name: Create test reports | |
run: | | |
testspace '[${{ matrix.multitarget }}]./TestResults/*.trx' | |
if: ${{ (matrix.multitarget == 'uwp' || matrix.multitarget == 'wasdk') && (steps.test-generator.conclusion == 'success' || steps.test-platform.conclusion == 'success') }} | |
- name: Artifact - Diagnostic Logs | |
uses: actions/upload-artifact@v4 | |
if: ${{ (env.ENABLE_DIAGNOSTICS == 'true' || env.COREHOST_TRACE != '') && always() }} | |
with: | |
name: build-logs-${{ matrix.multitarget }}-winui${{ matrix.winui }} | |
path: ./**/*.*log | |
- name: Artifact - ILC Repro | |
uses: actions/upload-artifact@v4 | |
if: ${{ (env.ENABLE_DIAGNOSTICS == 'true' || env.COREHOST_TRACE != '') && always() }} | |
with: | |
name: ilc-repro | |
path: ./*.zip | |
# https://github.com/dorny/paths-filter#custom-processing-of-changed-files | |
- name: Detect If any Dump Files | |
id: detect-dump | |
if: always() | |
working-directory: ${{ github.workspace }} | |
run: | | |
echo "DUMP_FILE=$(Get-ChildItem .\CrashDumps\*.dmp -ErrorAction SilentlyContinue)" >> $env:GITHUB_OUTPUT | |
- name: Artifact - WER crash dumps | |
uses: actions/upload-artifact@v4 | |
if: ${{ (env.ENABLE_DIAGNOSTICS == 'true' || env.COREHOST_TRACE != '') && always() }} | |
with: | |
name: CrashDumps-${{ matrix.multitarget }}-winui${{ matrix.winui }} | |
path: '${{ github.workspace }}/CrashDumps' | |
- name: Analyze Dump | |
if: ${{ steps.detect-dump.outputs.DUMP_FILE != '' && (env.ENABLE_DIAGNOSTICS == 'true' || env.COREHOST_TRACE != '') && always() }} | |
run: | | |
dotnet tool install --global dotnet-dump | |
dotnet-dump analyze ${{ steps.detect-dump.outputs.DUMP_FILE }} -c "clrstack" -c "pe -lines" -c "exit" | |
package: | |
runs-on: windows-latest | |
needs: [build] | |
strategy: | |
fail-fast: false # prevent one matrix pipeline from being cancelled if one fails, we want them all to run to completion. | |
matrix: | |
winui: [2, 3] | |
env: | |
VERSION_PROPERTY: ${{ github.ref == 'refs/heads/main' && format('build.{0}', github.run_number) || format('pull-{0}.{1}', github.event.number, github.run_number) }} | |
steps: | |
- name: Install .NET SDK v${{ env.DOTNET_VERSION }} | |
uses: actions/setup-dotnet@v4 | |
with: | |
dotnet-version: ${{ env.DOTNET_VERSION }} | |
- name: .NET Info (if diagnostics) | |
if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }} | |
run: dotnet --info | |
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it | |
- name: Checkout Repository | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
# Semver regex: https://regex101.com/r/Ly7O1x/3/ | |
- name: Format Date/Time of Release Package Version | |
if: ${{ env.IS_RELEASE == 'true' }} | |
run: | | |
$ref = "${{ github.ref }}" | |
$ref -match "^refs/heads/rel/(?<major>0|[1-9]\d*)\.(?<minor>0|[1-9]\d*)\.(?<patch>0|[1-9]\d*)(?:-(?<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$" | |
echo "VERSION_DATE=$($matches['patch'])" >> $env:GITHUB_ENV | |
echo "VERSION_PROPERTY=$($matches['prerelease'])" >> $env:GITHUB_ENV | |
- name: Format Date/Time of Commit for Package Version | |
if: ${{ env.IS_RELEASE == 'false' }} | |
run: | | |
echo "VERSION_DATE=$(git log -1 --format=%cd --date=format:%y%m%d)" >> $env:GITHUB_ENV | |
- name: Restore dotnet tools | |
run: dotnet tool restore | |
- name: Run Uno Check to Install Dependencies | |
run: > | |
dotnet tool run uno-check | |
--ci | |
--fix | |
--non-interactive | |
--skip wsl | |
--skip androidemulator | |
--skip vswinworkloads | |
--verbose | |
- name: Add msbuild to PATH | |
uses: microsoft/setup-msbuild@v2 | |
with: | |
vs-version: '[17.9,)' | |
- name: Define excluded MultiTargets (WinUI 2) | |
if: ${{ matrix.winui == '2' }} | |
run: | | |
echo "EXCLUDED_MULTITARGETS=wasdk" >> $env:GITHUB_ENV | |
- name: Define excluded MultiTargets (WinUI 3) | |
if: ${{ matrix.winui == '3' }} | |
run: | | |
echo "EXCLUDED_MULTITARGETS=uwp" >> $env:GITHUB_ENV | |
# Build and pack component nupkg | |
- name: Build and pack component packages | |
run: ./tooling/Build-Toolkit-Components.ps1 -MultiTargets all -ExcludeMultiTargets ${{ env.EXCLUDED_MULTITARGETS }} -WinUIMajorVersion ${{ matrix.winui }} -DateForVersion ${{ env.VERSION_DATE }} ${{ env.VERSION_PROPERTY != '' && format('-PreviewVersion "{0}"', env.VERSION_PROPERTY) || '' }} ${{ env.ENABLE_DIAGNOSTICS == 'true' && '-EnableBinlogs' || '' }} ${{ env.ENABLE_DIAGNOSTICS == 'true' && '-Verbose' || '' }} -BinlogOutput ./ -NupkgOutput ./ -Release | |
# Push Pull Request Packages to our DevOps Artifacts Feed (see nuget.config) | |
- name: Push Pull Request Packages (if not fork) | |
if: ${{ env.IS_PR == 'true' && github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]' }} | |
run: | | |
dotnet nuget add source https://pkgs.dev.azure.com/dotnet/CommunityToolkit/_packaging/CommunityToolkit-PullRequests/nuget/v3/index.json ` | |
--name PullRequests ` | |
--username dummy --password ${{ secrets.DEVOPS_PACKAGE_PUSH_TOKEN }} | |
dotnet nuget push "*.nupkg" --api-key dummy --source PullRequests --skip-duplicate | |
- name: Upload Package List | |
uses: actions/upload-artifact@v4 | |
if: ${{ env.IS_PR == 'false' }} | |
with: | |
name: nuget-list-${{ matrix.winui }} | |
if-no-files-found: error | |
path: | | |
${{ github.workspace }}/.github/workflows/SignClientFileList.txt | |
# if we're not doing a PR build (or it's a PR from a fork) then we upload our packages so we can sign as a separate job or have available to test. | |
- name: Upload Packages as Artifacts | |
uses: actions/upload-artifact@v4 | |
if: ${{ env.IS_PR == 'false' || github.event.pull_request.head.repo.full_name != github.repository }} | |
with: | |
name: nuget-packages-winui${{ matrix.winui }} | |
if-no-files-found: error | |
path: | | |
./*.nupkg | |
- name: Artifact - Diagnostic Logs | |
uses: actions/upload-artifact@v4 | |
if: ${{ (env.ENABLE_DIAGNOSTICS == 'true' || env.COREHOST_TRACE != '') && always() }} | |
with: | |
name: build-logs-winui${{ matrix.winui }} | |
path: ./*.*log | |
sign: | |
needs: [package] | |
if: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/rel/') }} | |
runs-on: windows-latest | |
permissions: | |
id-token: write # Required for requesting the JWT | |
strategy: | |
fail-fast: false # prevent one matrix pipeline from being cancelled if one fails, we want them both to run to completion. | |
matrix: | |
winui: [2, 3] | |
steps: | |
- name: Install .NET SDK v${{ env.DOTNET_VERSION }} | |
uses: actions/setup-dotnet@v4 | |
with: | |
dotnet-version: ${{ env.DOTNET_VERSION }} | |
- name: Download Package List | |
uses: actions/download-artifact@v4 | |
with: | |
name: nuget-list-${{ matrix.winui }} | |
path: ./ | |
- name: Download built packages for WinUI ${{ matrix.winui }} | |
uses: actions/download-artifact@v4 | |
with: | |
name: nuget-packages-winui${{ matrix.winui }} | |
path: ./packages | |
- name: Install Signing Tool | |
run: dotnet tool install --tool-path ./tools sign --version 0.9.1-beta.23356.1 | |
- name: Sign Packages | |
run: > | |
./tools/sign code azure-key-vault | |
**/*.nupkg | |
--base-directory "${{ github.workspace }}/packages" | |
--file-list "${{ github.workspace }}/SignClientFileList.txt" | |
--timestamp-url "http://timestamp.digicert.com" | |
--publisher-name ".NET Foundation" | |
--description "Windows Community Toolkit" | |
--description-url "https://github.com/CommunityToolkit/Windows" | |
--azure-key-vault-url "${{ secrets.SIGN_KEY_VAULT_URL }}" | |
--azure-key-vault-client-id ${{ secrets.SIGN_CLIENT_ID }} | |
--azure-key-vault-client-secret "${{ secrets.SIGN_CLIENT_SECRET }}" | |
--azure-key-vault-tenant-id ${{ secrets.SIGN_TENANT_ID }} | |
--azure-key-vault-certificate "${{ secrets.SIGN_CERTIFICATE }}" | |
--verbosity Information | |
- name: Push Signed Packages | |
run: | | |
dotnet nuget add source https://pkgs.dev.azure.com/dotnet/CommunityToolkit/_packaging/CommunityToolkit-MainLatest/nuget/v3/index.json ` | |
--name MainLatest ` | |
--username dummy --password ${{ secrets.DEVOPS_PACKAGE_PUSH_TOKEN }} | |
dotnet nuget push "**/*.nupkg" --api-key dummy --source MainLatest --skip-duplicate | |
- name: Upload Signed Packages as Artifacts (for release) | |
uses: actions/upload-artifact@v4 | |
if: ${{ env.IS_RELEASE == 'true' }} | |
with: | |
name: signed-nuget-packages-${{ matrix.winui }} | |
if-no-files-found: error | |
path: | | |
${{ github.workspace }}/packages/**/*.nupkg | |
release: | |
if: ${{ startsWith(github.ref, 'refs/heads/rel/') }} | |
needs: [sign] | |
environment: nuget-release-gate # This gates this job until manually approved | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false # prevent one matrix pipeline from being cancelled if one fails, we want them both to run to completion. | |
matrix: | |
winui: [2, 3] | |
steps: | |
- name: Install .NET SDK v${{ env.DOTNET_VERSION }} | |
uses: actions/setup-dotnet@v4 | |
with: | |
dotnet-version: ${{ env.DOTNET_VERSION }} | |
- name: Download signed packages for WinUI ${{ matrix.winui }} | |
uses: actions/download-artifact@v4 | |
with: | |
name: signed-nuget-packages-${{ matrix.winui }} | |
path: ./packages | |
- name: Push to NuGet.org | |
run: > | |
dotnet nuget push | |
**/*.nupkg | |
--source https://api.nuget.org/v3/index.json | |
--api-key ${{ secrets.NUGET_PACKAGE_PUSH_TOKEN }} | |
--skip-duplicate | |
wasm-linux: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Install .NET SDK v${{ env.DOTNET_VERSION }} | |
uses: actions/setup-dotnet@v4 | |
with: | |
dotnet-version: ${{ env.DOTNET_VERSION }} | |
- name: .NET Info (if diagnostics) | |
if: ${{ env.ENABLE_DIAGNOSTICS == 'true' }} | |
run: dotnet --info | |
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it | |
- name: Checkout Repository | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
# Restore Tools from Manifest list in the Repository | |
- name: Restore dotnet tools | |
run: dotnet tool restore | |
- name: Enable WASM TargetFrameworks | |
shell: pwsh | |
working-directory: ./${{ env.MULTI_TARGET_DIRECTORY }} | |
run: ./UseTargetFrameworks.ps1 wasm | |
- name: Generate solution | |
shell: pwsh | |
working-directory: ./ | |
run: ./tooling/GenerateAllSolution.ps1${{ env.ENABLE_DIAGNOSTICS == 'true' && ' -UseDiagnostics' || '' }} | |
- name: Install ninja for WASM native dependencies | |
run: sudo apt-get install ninja-build | |
# Issue with Comment Links currently, see: https://github.com/mrlacey/CommentLinks/issues/38 | |
# See launch.json configuration file for analogous command we're emulating here to build LINK: ../../.vscode/launch.json:CommunityToolkit.App.Wasm.csproj | |
- name: dotnet build | |
working-directory: ./${{ env.HEADS_DIRECTORY }}/AllComponents/Wasm/ | |
run: dotnet build /r /bl -v:${{ env.MSBUILD_VERBOSITY }} | |
# TODO: Do we want to run tests here? Can we do that on linux easily? | |
- name: Artifact - Diagnostic Logs | |
uses: actions/upload-artifact@v4 | |
if: ${{ (env.ENABLE_DIAGNOSTICS == 'true' || env.COREHOST_TRACE != '') && always() }} | |
with: | |
name: linux-logs | |
path: ./**/*.*log |