From 7daeac4d768c805070087f7afb289d93e39bd52d Mon Sep 17 00:00:00 2001 From: Matthew Leibowitz Date: Thu, 3 Mar 2022 20:09:35 +0800 Subject: [PATCH] Split tests and samples into a new pipeline (#1963) --- scripts/azure-pipelines-tests.yml | 48 + scripts/azure-pipelines-variables.yml | 25 + scripts/azure-pipelines.yml | 861 +--------------- scripts/azure-templates-bootstrapper.yml | 134 +-- scripts/azure-templates-build.yml | 41 +- .../azure-templates-download-artifacts.yml | 47 + scripts/azure-templates-download.yml | 21 +- scripts/azure-templates-github-status.yml | 33 + scripts/azure-templates-linux-matrix.yml | 2 + scripts/azure-templates-stages.yml | 919 ++++++++++++++++++ scripts/azure-templates-variables.yml | 50 +- scripts/azure-templates-wasm-matrix.yml | 2 + 12 files changed, 1214 insertions(+), 969 deletions(-) create mode 100644 scripts/azure-pipelines-tests.yml create mode 100644 scripts/azure-pipelines-variables.yml create mode 100644 scripts/azure-templates-download-artifacts.yml create mode 100644 scripts/azure-templates-github-status.yml create mode 100644 scripts/azure-templates-stages.yml diff --git a/scripts/azure-pipelines-tests.yml b/scripts/azure-pipelines-tests.yml new file mode 100644 index 0000000000..3265a46ab0 --- /dev/null +++ b/scripts/azure-pipelines-tests.yml @@ -0,0 +1,48 @@ +trigger: none + +pr: none + +parameters: + - name: buildExternals + displayName: 'The specific native artifacts to use for this build.' + type: number + default: 0 + - name: VM_IMAGE_WINDOWS + type: object + default: + name: Azure Pipelines + vmImage: windows-2022 + - name: VM_IMAGE_MAC + type: object + default: + name: Azure Pipelines + vmImage: macOS-10.15 + - name: VM_IMAGE_LINUX + type: object + default: + name: Azure Pipelines + vmImage: ubuntu-18.04 + +variables: + - template: azure-pipelines-variables.yml + +resources: + repositories: + - repository: xamarin-templates + type: github + name: xamarin/yaml-templates + endpoint: xamarin + ref: refs/heads/main + pipelines: + - pipeline: SkiaSharp + source: SkiaSharp + trigger: true + +stages: + - template: azure-templates-stages.yml + parameters: + isBuildPipeline: false + buildExternals: ${{ parameters.buildExternals }} + VM_IMAGE_WINDOWS: ${{ parameters.VM_IMAGE_WINDOWS }} + VM_IMAGE_MAC: ${{ parameters.VM_IMAGE_MAC }} + VM_IMAGE_LINUX: ${{ parameters.VM_IMAGE_LINUX }} diff --git a/scripts/azure-pipelines-variables.yml b/scripts/azure-pipelines-variables.yml new file mode 100644 index 0000000000..4a9e5ab045 --- /dev/null +++ b/scripts/azure-pipelines-variables.yml @@ -0,0 +1,25 @@ +variables: + SKIASHARP_VERSION: 2.88.0 + FEATURE_NAME_PREFIX: 'feature/' + VERBOSITY: normal + GIT_SHA: $(Build.SourceVersion) + GIT_BRANCH_NAME: $(Build.SourceBranch) + GIT_URL: $(Build.Repository.Uri) + FEATURE_NAME: '' + PREVIEW_LABEL: 'preview' + BUILD_NUMBER: $[counter(format('_{0}_{1}_{2}__', variables['SKIASHARP_VERSION'], variables['Build.SourceBranch'], variables['PREVIEW_LABEL']), 1)] + TIZEN_LINUX_PACKAGES: libxcb-xfixes0 libxcb-render-util0 libwebkitgtk-1.0-0 libxcb-image0 acl libsdl1.2debian libv4l-0 libxcb-randr0 libxcb-shape0 libxcb-icccm4 libsm6 gettext rpm2cpio cpio bridge-utils openvpn + MANAGED_LINUX_PACKAGES: ttf-ancient-fonts ninja-build + MONO_VERSION_MACOS: '6_12_7' + MONO_VERSION_LINUX: '' + XCODE_VERSION: 12.4 + DOTNET_VERSION_PREVIOUS: 3.1.416 + DOTNET_VERSION: 5.0.405 + DOTNET_VERSION_PREVIEW: '6.0.200-rtm.22107.3' + DOTNET_WORKLOAD_SOURCE: 'https://aka.ms/dotnet/maui/6.0.200/preview.14.json' + CONFIGURATION: 'Release' + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + THROW_ON_TEST_FAILURE: true + NUGET_DIFF_PRERELEASE: false + ENABLE_CODE_COVERAGE: true + EMSCRIPTEN_VERSION: 2.0.23 diff --git a/scripts/azure-pipelines.yml b/scripts/azure-pipelines.yml index bf2d4a6b8a..d84bb40ca2 100644 --- a/scripts/azure-pipelines.yml +++ b/scripts/azure-pipelines.yml @@ -30,31 +30,7 @@ parameters: vmImage: ubuntu-18.04 variables: - SKIASHARP_VERSION: 2.88.0 - FEATURE_NAME_PREFIX: 'feature/' - VERBOSITY: normal - GIT_SHA: $(Build.SourceVersion) - GIT_BRANCH_NAME: $(Build.SourceBranch) - GIT_URL: $(Build.Repository.Uri) - FEATURE_NAME: '' - PREVIEW_LABEL: 'preview' - BUILD_NUMBER: $[counter(format('_{0}_{1}_{2}__', variables['SKIASHARP_VERSION'], variables['Build.SourceBranch'], variables['PREVIEW_LABEL']), 1)] - TIZEN_LINUX_PACKAGES: libxcb-xfixes0 libxcb-render-util0 libwebkitgtk-1.0-0 libxcb-image0 acl libsdl1.2debian libv4l-0 libxcb-randr0 libxcb-shape0 libxcb-icccm4 libsm6 gettext rpm2cpio cpio bridge-utils openvpn - MANAGED_LINUX_PACKAGES: ttf-ancient-fonts ninja-build - MONO_VERSION_MACOS: '6_12_7' - MONO_VERSION_LINUX: '' - XCODE_VERSION: 12.4 - DOTNET_VERSION_PREVIOUS: 3.1.416 - DOTNET_VERSION: 5.0.405 - DOTNET_VERSION_PREVIEW: '6.0.200-rtm.22107.3' - DOTNET_WORKLOAD_SOURCE: 'https://aka.ms/dotnet/maui/6.0.200/preview.14.json' - VS_VERSION_PREVIEW: 17/pre - CONFIGURATION: 'Release' - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true - THROW_ON_TEST_FAILURE: true - NUGET_DIFF_PRERELEASE: false - ENABLE_CODE_COVERAGE: true - EMSCRIPTEN_VERSION: 2.0.23 + - template: azure-pipelines-variables.yml resources: repositories: @@ -65,831 +41,10 @@ resources: ref: refs/heads/main stages: - - stage: prepare - displayName: Prepare Build - jobs: - - job: prepare # Prepare Build - displayName: Prepare Build - pool: ${{ parameters.VM_IMAGE_LINUX }} - steps: - - checkout: none - - template: azure-templates-variables.yml - parameters: - updateBuild: true - - - stage: native_windows - displayName: Native Windows - dependsOn: prepare - jobs: - - template: azure-templates-bootstrapper.yml # Build Native Android|x86 (Win) - parameters: - name: native_android_x86_windows - displayName: Android x86 - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: externals-android - additionalArgs: --buildarch=x86 - installWindowsSdk: false - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native Android|x64 (Win) - parameters: - name: native_android_x64_windows - displayName: Android x64 - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: externals-android - additionalArgs: --buildarch=x64 - installWindowsSdk: false - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native Android|arm (Win) - parameters: - name: native_android_arm_windows - displayName: Android arm - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: externals-android - additionalArgs: --buildarch=arm - installWindowsSdk: false - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native Android|arm64 (Win) - parameters: - name: native_android_arm64_windows - displayName: Android arm64 - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: externals-android - additionalArgs: --buildarch=arm64 - installWindowsSdk: false - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native Tizen (Win) - parameters: - name: native_tizen_windows - displayName: Tizen - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: externals-tizen - installWindowsSdk: false - artifactName: native - - template: azure-templates-bootstrapper.yml # Build ANGLE UWP|x86 (Win) - parameters: - name: native_uwp_angle_x86_windows - displayName: ANGLE x86 - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: ANGLE - additionalArgs: -Script .\native\uwp\build.cake --buildarch=x86 - artifactName: native - - template: azure-templates-bootstrapper.yml # Build ANGLE UWP|x64 (Win) - parameters: - name: native_uwp_angle_x64_windows - displayName: ANGLE x64 - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: ANGLE - additionalArgs: -Script .\native\uwp\build.cake --buildarch=x64 - artifactName: native - - template: azure-templates-bootstrapper.yml # Build ANGLE UWP|arm (Win) - parameters: - name: native_uwp_angle_arm_windows - displayName: ANGLE arm - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: ANGLE - additionalArgs: -Script .\native\uwp\build.cake --buildarch=arm - artifactName: native - - template: azure-templates-bootstrapper.yml # Build ANGLE UWP|arm64 (Win) - parameters: - name: native_uwp_angle_arm64_windows - displayName: ANGLE arm64 - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: ANGLE - additionalArgs: -Script .\native\uwp\build.cake --buildarch=arm64 - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native UWP|x86 (Win) - parameters: - name: native_uwp_x86_windows - displayName: UWP x86 - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: externals-uwp - additionalArgs: --buildarch=x86 --skipAngle=true - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native UWP|x64 (Win) - parameters: - name: native_uwp_x64_windows - displayName: UWP x64 - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: externals-uwp - additionalArgs: --buildarch=x64 --skipAngle=true - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native UWP|arm (Win) - parameters: - name: native_uwp_arm_windows - displayName: UWP arm - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: externals-uwp - additionalArgs: --buildarch=arm --skipAngle=true - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native UWP|arm64 (Win) - parameters: - name: native_uwp_arm64_windows - displayName: UWP arm64 - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: externals-uwp - additionalArgs: --buildarch=arm64 --skipAngle=true - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native Win32|x86 (Win) - parameters: - name: native_win32_x86_windows - displayName: Win32 x86 - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: externals-windows - additionalArgs: --buildarch=x86 - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native Win32|x64 (Win) - parameters: - name: native_win32_x64_windows - displayName: Win32 x64 - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: externals-windows - additionalArgs: --buildarch=x64 - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native Win32|arm64 (Win) - parameters: - name: native_win32_arm64_windows - displayName: Win32 arm64 - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: externals-windows - additionalArgs: --buildarch=arm64 - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native NanoServer|x64 (Win) - parameters: - name: native_win32_x64_nanoserver_windows - displayName: Nano Server x64 - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: externals-nanoserver - additionalArgs: --buildarch=x64 - artifactName: native - - - stage: native_macos - displayName: Native macOS - dependsOn: prepare - jobs: - - template: azure-templates-bootstrapper.yml # Build Native Android|x86 (macOS) - parameters: - name: native_android_x86_macos - displayName: Android x86 - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_MAC }} - target: externals-android - additionalArgs: --buildarch=x86 - - template: azure-templates-bootstrapper.yml # Build Native Android|x64 (macOS) - parameters: - name: native_android_x64_macos - displayName: Android x64 - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_MAC }} - target: externals-android - additionalArgs: --buildarch=x64 - - template: azure-templates-bootstrapper.yml # Build Native Android|arm (macOS) - parameters: - name: native_android_arm_macos - displayName: Android arm - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_MAC }} - target: externals-android - additionalArgs: --buildarch=arm - - template: azure-templates-bootstrapper.yml # Build Native Android|arm64 (macOS) - parameters: - name: native_android_arm64_macos - displayName: Android arm64 - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_MAC }} - target: externals-android - additionalArgs: --buildarch=arm64 - - template: azure-templates-bootstrapper.yml # Build Native iOS (macOS) - parameters: - name: native_ios_macos - displayName: iOS - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_MAC }} - target: externals-ios - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native Mac Catalyst (macOS) - parameters: - name: native_maccatalyst_macos - displayName: Mac Catalyst - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_MAC }} - target: externals-maccatalyst - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native macOS (macOS) - parameters: - name: native_macos_macos - displayName: macOS - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_MAC }} - target: externals-macos - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native tvOS (macOS) - parameters: - name: native_tvos_macos - displayName: tvOS - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_MAC }} - target: externals-tvos - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native watchOS (macOS) - parameters: - name: native_watchos_macos - displayName: watchOS - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_MAC }} - target: externals-watchos - artifactName: native - - template: azure-templates-bootstrapper.yml # Build Native Tizen (macOS) - parameters: - name: native_tizen_macos - displayName: Tizen - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_MAC }} - target: externals-tizen - condition: false # TODO: TIZEN INSTALL BUGS - - - stage: native_linux - displayName: Native Linux - dependsOn: prepare - jobs: - - template: azure-templates-linux-matrix.yml # Build Native Linux (Linux) - parameters: - artifactName: native - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_LINUX }} - builds: - - name: '' - - name: nodeps - desc: 'No Deps' - additionalArgs: --verifyExcluded=fontconfig - gnArgs: skia_use_fontconfig=false - matrix: - - arch: x64 - docker: scripts/Docker/debian9/amd64 - - arch: x64 - variant: alpine - docker: scripts/Docker/alpine/amd64 - - arch: arm - docker: scripts/Docker/debian9/clang-cross - target: externals-linux-clang-cross - - arch: arm64 - docker: scripts/Docker/debian9/clang-cross - dockerArgs: --build-arg TOOLCHAIN_ARCH=aarch64-linux-gnu --build-arg TOOLCHAIN_ARCH_SHORT=arm64 - target: externals-linux-clang-cross - - template: azure-templates-bootstrapper.yml # Build Native Tizen (Linux) - parameters: - name: native_tizen_linux - displayName: Tizen - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_LINUX }} - packages: $(TIZEN_LINUX_PACKAGES) - target: externals-tizen - - - stage: native_wasm - displayName: Native WASM - dependsOn: prepare - jobs: - - template: azure-templates-wasm-matrix.yml # Build Native WASM (Linux) - parameters: - buildExternals: ${{ parameters.buildExternals }} - vmImage: ${{ parameters.VM_IMAGE_LINUX }} - artifactName: native - emscripten: - - 2.0.5 - - 2.0.6 - - 2.0.9 - - 2.0.11 - - 2.0.12 - - 2.0.23 - - - stage: managed - displayName: Build Managed - dependsOn: - - native_windows - - native_macos - - native_linux - - native_wasm - jobs: - - template: azure-templates-bootstrapper.yml # Build Managed (Windows) - parameters: - name: managed_windows - displayName: Managed (Windows) - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: libs - additionalArgs: --skipExternals="all" - installPreviewVs: true - requiredArtifacts: - - native - artifactName: managed - postBuildSteps: - - pwsh: Remove-Item ./output/native/ -Recurse -Force -ErrorAction Continue - displayName: Delete the native folder - - template: azure-templates-bootstrapper.yml # Build Managed (macOS) - parameters: - name: managed_macos - displayName: Managed (macOS) - vmImage: ${{ parameters.VM_IMAGE_MAC }} - target: libs - additionalArgs: --skipExternals="all" - requiredArtifacts: - - native - artifactName: managed - postBuildSteps: - - pwsh: Remove-Item ./output/native/ -Recurse -Force -ErrorAction Continue - displayName: Delete the native folder - - template: azure-templates-bootstrapper.yml # Build Managed (Linux) - parameters: - name: managed_linux - displayName: Managed (Linux) - vmImage: ${{ parameters.VM_IMAGE_LINUX }} - packages: $(MANAGED_LINUX_PACKAGES) - target: libs - additionalArgs: --skipExternals="all" - requiredArtifacts: - - native - artifactName: managed - postBuildSteps: - - pwsh: Remove-Item ./output/native/ -Recurse -Force -ErrorAction Continue - displayName: Delete the native folder - - - stage: package - displayName: Package NuGets - dependsOn: managed - jobs: - - template: azure-templates-bootstrapper.yml # Package NuGets - parameters: - name: package_windows - displayName: Package NuGets - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: nuget - additionalArgs: --packall=true --skipbuild=true - installWindowsSdk: false - installAndroidSdk: false - installDotNet: false - requiredArtifacts: - - managed - - native - postBuildSteps: - - task: PublishBuildArtifacts@1 - displayName: Publish the nuget artifacts - inputs: - artifactName: nuget - pathToPublish: 'output/nugets' - - task: PublishBuildArtifacts@1 - displayName: Publish the special nuget artifacts - inputs: - artifactName: nuget_special - pathToPublish: 'output/nugets-special' - - task: PublishBuildArtifacts@1 - displayName: Publish the special nuget artifacts - inputs: - artifactName: nuget_symbols - pathToPublish: 'output/nugets-symbols' - - task: PublishBuildArtifacts@1 - displayName: Publish the SignList.xml into nuget artifacts - inputs: - artifactName: nuget - pathToPublish: 'SignList.xml' - - pwsh: | - Remove-Item ./output/native/ -Recurse -Force - Remove-Item ./output/nugets/ -Recurse -Force - Remove-Item ./output/nugets-special/ -Recurse -Force - Remove-Item ./output/nugets-symbols/ -Recurse -Force - displayName: Delete the pre-published folders - - - stage: api_diff - displayName: API Diff - dependsOn: package - jobs: - - template: azure-templates-bootstrapper.yml # API Diff - parameters: - name: api_diff_windows - displayName: API Diff - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: docs-api-diff - additionalArgs: --nugetDiffPrerelease=$(NUGET_DIFF_PRERELEASE) - shouldPublish: false - requiredArtifacts: - - package_windows - requiredArtifactsMap: - - src: nuget - dst: nugets - preBuildSteps: - - pwsh: .\scripts\install-gtk.ps1 - displayName: Install GTK# 2.12 - postBuildSteps: - - task: PublishBuildArtifacts@1 - displayName: Publish the API diffs - condition: always() - inputs: - artifactName: api-diff - pathToPublish: '$(Build.SourcesDirectory)\output\api-diff' - - - ${{ if eq(variables['System.TeamProject'], 'devdiv') }}: - - stage: signing - displayName: Sign NuGets - dependsOn: package - jobs: - - template: sign-artifacts/jobs/v2.yml@xamarin-templates - parameters: - ${{ if or(eq(variables['Build.SourceBranch'], 'refs/heads/main'), startsWith(variables['Build.SourceBranch'], 'refs/heads/patch/')) }}: - signType: 'Real' - ${{ if not(or(eq(variables['Build.SourceBranch'], 'refs/heads/main'), startsWith(variables['Build.SourceBranch'], 'refs/heads/patch/'))) }}: - signType: 'Test' - - - stage: sbom - displayName: 'Software Bill of Materials' - dependsOn: signing - jobs: - - template: compliance/sbom/job.v1.yml@xamarin-templates # Software Bill of Materials (SBOM): https://eng.ms/docs/cloud-ai-platform/devdiv/one-engineering-system-1es/1es-docs/secure-supply-chain/ado-sbom-generator - parameters: - artifactNames: ['nuget'] - packageName: 'SkiaSharp' - packageFilter: '*.nupkg' - - - stage: tests - displayName: Tests - dependsOn: - - native_windows - - native_macos - - native_linux - - native_wasm - jobs: - - template: azure-templates-bootstrapper.yml # Tests|netfx (Windows) - parameters: - name: tests_netfx_windows - displayName: Windows (.NET Framework) - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: tests-netfx - additionalArgs: --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=$(ENABLE_CODE_COVERAGE) - installPreviewVs: true - installWindowsSdk: false - shouldPublish: false - requiredArtifacts: - - native_win32_x86_windows - - native_win32_x64_windows - postBuildSteps: - - task: PublishTestResults@2 - displayName: Publish the .NET Framework test results - condition: always() - inputs: - testResultsFormat: xUnit - testResultsFiles: 'tests/SkiaSharp*.Desktop.Tests/**/TestResults.xml' - testRunTitle: 'Windows .NET Framework Tests' - - template: azure-templates-bootstrapper.yml # Tests|netcore (Windows) - parameters: - name: tests_netcore_windows - displayName: Windows (.NET Core) - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: tests-netcore - additionalArgs: --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=$(ENABLE_CODE_COVERAGE) - installWindowsSdk: false - shouldPublish: false - requiredArtifacts: - - native_win32_x86_windows - - native_win32_x64_windows - postBuildSteps: - - task: PublishTestResults@2 - displayName: Publish the .NET Core test results - condition: always() - inputs: - testResultsFormat: xUnit - testResultsFiles: 'tests/SkiaSharp*.NetCore.Tests/**/TestResults.xml' - testRunTitle: 'Windows .NET Core Tests' - - task: PublishBuildArtifacts@1 - displayName: 'Publish the code coverage results' - inputs: - artifactName: coverage_netcore_windows - pathToPublish: 'output/coverage' - - template: azure-templates-bootstrapper.yml # Tests|netfx (macOS) - parameters: - name: tests_netfx_macos - displayName: macOS (.NET Framework) - vmImage: ${{ parameters.VM_IMAGE_MAC }} - target: tests-netfx - additionalArgs: --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=$(ENABLE_CODE_COVERAGE) - shouldPublish: false - requiredArtifacts: - - native_macos_macos - postBuildSteps: - - task: PublishTestResults@2 - displayName: Publish the Mono test results - condition: always() - inputs: - testResultsFormat: xUnit - testResultsFiles: 'tests/SkiaSharp*.Desktop.Tests/**/TestResults.xml' - testRunTitle: 'macOS Mono Tests' - - template: azure-templates-bootstrapper.yml # Tests|netcore (macOS) - parameters: - name: tests_netcore_macos - displayName: macOS (.NET Core) - vmImage: ${{ parameters.VM_IMAGE_MAC }} - target: tests-netcore - additionalArgs: --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=$(ENABLE_CODE_COVERAGE) - shouldPublish: false - requiredArtifacts: - - native_macos_macos - postBuildSteps: - - task: PublishTestResults@2 - displayName: Publish the .NET Core test results - condition: always() - inputs: - testResultsFormat: xUnit - testResultsFiles: 'tests/SkiaSharp*.NetCore.Tests/**/TestResults.xml' - testRunTitle: 'macOS .NET Core Tests' - - task: PublishBuildArtifacts@1 - displayName: 'Publish the code coverage results' - inputs: - artifactName: coverage_netcore_macos - pathToPublish: 'output/coverage' - - template: azure-templates-bootstrapper.yml # Tests|android (macOS) - parameters: - name: tests_android_macos - displayName: Android (macOS) - vmImage: ${{ parameters.VM_IMAGE_MAC }} - target: tests-android - additionalArgs: --device=android-emulator-64_30 --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=$(ENABLE_CODE_COVERAGE) - shouldPublish: false - requiredArtifacts: - - native_android_x86_macos - - native_android_x64_macos - - native_android_arm_macos - - native_android_arm64_macos - preBuildSteps: - - pwsh: .\scripts\install-android-package.ps1 -Package "emulator" - displayName: Install the Android emulator - - pwsh: .\scripts\install-android-package.ps1 -Package "system-images;android-30;google_apis_playstore;x86_64" - displayName: Install the Android API 30 emulator image - postBuildSteps: - - task: PublishTestResults@2 - displayName: Publish the Android test results - condition: always() - inputs: - testResultsFormat: xUnit - testResultsFiles: 'output/logs/testlogs/SkiaSharp.Android.Tests/**/TestResults.xml' - testRunTitle: 'Android Tests' - - task: PublishBuildArtifacts@1 - displayName: Publish the test logs - condition: always() - inputs: - artifactName: testlogs_android - pathToPublish: 'output/logs/testlogs' - - template: azure-templates-bootstrapper.yml # Tests|ios (macOS) - parameters: - name: tests_ios_macos - displayName: iOS (macOS) - vmImage: ${{ parameters.VM_IMAGE_MAC }} - target: tests-ios - additionalArgs: --device=ios-simulator-64 --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=$(ENABLE_CODE_COVERAGE) - shouldPublish: false - requiredArtifacts: - - native_ios_macos - preBuildSteps: - - template: azure-templates-provisioning-profiles.yml - postBuildSteps: - - task: PublishTestResults@2 - displayName: Publish the iOS test results - condition: always() - inputs: - testResultsFormat: xUnit - testResultsFiles: 'output/logs/testlogs/SkiaSharp.iOS.Tests/**/TestResults.xml' - testRunTitle: 'iOS Tests' - - task: PublishBuildArtifacts@1 - displayName: Publish the test logs - condition: always() - inputs: - artifactName: testlogs_ios - pathToPublish: 'output/logs/testlogs' - - template: azure-templates-bootstrapper.yml # Tests|netfx (Linux) - parameters: - name: tests_netfx_linux - displayName: Linux (.NET Framework) - vmImage: ${{ parameters.VM_IMAGE_LINUX }} - packages: $(MANAGED_LINUX_PACKAGES) - target: tests-netfx - additionalArgs: --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=$(ENABLE_CODE_COVERAGE) - shouldPublish: false - requiredArtifacts: - - native_linux_x64_linux - postBuildSteps: - - task: PublishTestResults@2 - displayName: Publish the Mono test results - condition: always() - inputs: - testResultsFormat: xUnit - testResultsFiles: 'tests/SkiaSharp*.Desktop.Tests/**/TestResults.xml' - testRunTitle: 'Linux Mono Tests' - - template: azure-templates-bootstrapper.yml # Tests|netcore (Linux) - parameters: - name: tests_netcore_linux - displayName: Linux (.NET Core) - vmImage: ${{ parameters.VM_IMAGE_LINUX }} - packages: $(MANAGED_LINUX_PACKAGES) - target: tests-netcore - additionalArgs: --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=$(ENABLE_CODE_COVERAGE) - shouldPublish: false - requiredArtifacts: - - native_linux_x64_linux - postBuildSteps: - - task: PublishTestResults@2 - displayName: Publish the .NET Core test results - condition: always() - inputs: - testResultsFormat: xUnit - testResultsFiles: 'tests/SkiaSharp*.NetCore.Tests/**/TestResults.xml' - testRunTitle: 'Linux .NET Core Tests' - - task: PublishBuildArtifacts@1 - displayName: 'Publish the code coverage results' - inputs: - artifactName: coverage_netcore_linux - pathToPublish: 'output/coverage' - - template: azure-templates-bootstrapper.yml # Tests [WASM] (Linux) - parameters: - name: tests_wasm_linux - displayName: WASM (Linux) - vmImage: ${{ parameters.VM_IMAGE_LINUX }} - packages: $(MANAGED_LINUX_PACKAGES) ninja-build - target: tests-wasm - additionalArgs: --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=false --chromedriver=$(CHROMEWEBDRIVER) - shouldPublish: false - requiredArtifacts: - - native_wasm_linux - installEmsdk: true - initScript: source ~/emsdk/emsdk_env.sh - postBuildSteps: - - task: PublishTestResults@2 - displayName: Publish the WASM test results - condition: always() - inputs: - testResultsFormat: xUnit - testResultsFiles: 'tests/SkiaSharp*.Wasm.Tests/**/TestResults.xml' - testRunTitle: 'Linux WASM Tests' - # TODO: add tests for linux alpine - # TODO: add tests for linux no dependencies - # TODO: add tests for windows nano server - - job: coverage_reports # Coverage Reports - displayName: Coverage Reports - pool: ${{ parameters.VM_IMAGE_LINUX }} - dependsOn: - - tests_netcore_windows - - tests_netcore_macos - - tests_netcore_linux - steps: - - checkout: self - - template: azure-templates-variables.yml - - task: DownloadBuildArtifacts@0 - displayName: Download the coverage_netcore_windows artifact - inputs: - artifactName: coverage_netcore_windows - downloadPath: output - - task: DownloadBuildArtifacts@0 - displayName: Download the coverage_netcore_macos artifact - inputs: - artifactName: coverage_netcore_macos - downloadPath: output - - task: DownloadBuildArtifacts@0 - displayName: Download the coverage_netcore_linux artifact - inputs: - artifactName: coverage_netcore_linux - downloadPath: output - - task: PublishCodeCoverageResults@1 - displayName: 'Publish the code coverage results' - inputs: - codeCoverageTool: Cobertura - summaryFileLocation: 'output/**/Cobertura.xml' - - - stage: samples - displayName: Samples - dependsOn: package - jobs: - - template: azure-templates-bootstrapper.yml # Build Samples (Windows) - parameters: - name: samples_windows - displayName: Windows - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: samples - installPreviewVs: true - requiredArtifactsMap: - - src: nuget - dst: nugets - postBuildSteps: - - pwsh: Remove-Item ./output/nugets/ -Recurse -Force -ErrorAction Continue - displayName: Delete the nugets folder - - template: azure-templates-bootstrapper.yml # Build Samples (macOS) - parameters: - name: samples_macos - displayName: macOS - vmImage: ${{ parameters.VM_IMAGE_MAC }} - target: samples - shouldPublish: false - requiredArtifactsMap: - - src: nuget - dst: nugets - preBuildSteps: - - template: azure-templates-provisioning-profiles.yml - - template: azure-templates-bootstrapper.yml # Build Samples (Linux) - parameters: - name: samples_linux - displayName: Linux - vmImage: ${{ parameters.VM_IMAGE_LINUX }} - packages: $(MANAGED_LINUX_PACKAGES) - target: samples - shouldPublish: false - requiredArtifactsMap: - - src: nuget - dst: nugets - installEmsdk: true - initScript: source ~/emsdk/emsdk_env.sh - - - ${{ if eq(variables['System.TeamProject'], 'devdiv') }}: - - stage: checks - displayName: Run Code Checks - dependsOn: prepare - jobs: - - template: azure-templates-bootstrapper.yml # Run Code Checks - parameters: - name: native_checks_windows - displayName: Run Code Checks - condition: or(eq(variables['Build.SourceBranch'], 'refs/heads/main'), startsWith(variables['Build.SourceBranch'], 'refs/heads/patch/')) - vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} - target: git-sync-deps - installWindowsSdk: false - installDotNet: false - installAndroidSdk: false - shouldPublish: false - postBuildSteps: - - task: CredScan@2 - displayName: Analyze source for credentials - condition: always() - inputs: - toolMajorVersion: 'V2' - - task: PoliCheck@1 - displayName: Run PoliCheck - condition: always() - inputs: - inputType: 'Basic' - targetType: 'F' - - task: SdtReport@1 - displayName: Create security analysis report - condition: always() - inputs: - AllTools: false - APIScan: false - BinSkim: false - CodesignValidation: false - CredScan: true - FortifySCA: false - FxCop: false - ModernCop: false - MSRD: false - PoliCheck: true - RoslynAnalyzers: false - SDLNativeRules: false - Semmle: false - TSLint: false - ToolLogsNotFoundAction: 'Standard' - - task: PublishSecurityAnalysisLogs@3 - displayName: Publish security analysis logs - condition: always() - - task: TSAUpload@1 - displayName: Publish TSA logs - condition: always() - continueOnError: true - inputs: - tsaVersion: 'TsaV2' - codebase: 'NewOrUpdate' - tsaEnvironment: 'PROD' - codeBaseName: 'SkiaSharp_main' - notificationAlias: 'xamacomd@microsoft.com' - notifyAlwaysV2: false - instanceUrlForTsaV2: 'DEVDIV' - projectNameDEVDIV: 'DevDiv' - areaPath: 'DevDiv\VS Client - Runtime SDKs\SkiaSharp' - iterationPath: 'DevDiv\OneVS' - uploadAPIScan: false - uploadBinSkim: false - uploadCredScan: true - uploadFortifySCA: false - uploadFxCop: false - uploadModernCop: false - uploadPoliCheck: true - uploadPREfast: false - uploadRoslyn: false - uploadTSLint: false - uploadAsync: true + - template: azure-templates-stages.yml + parameters: + isBuildPipeline: true + buildExternals: ${{ parameters.buildExternals }} + VM_IMAGE_WINDOWS: ${{ parameters.VM_IMAGE_WINDOWS }} + VM_IMAGE_MAC: ${{ parameters.VM_IMAGE_MAC }} + VM_IMAGE_LINUX: ${{ parameters.VM_IMAGE_LINUX }} diff --git a/scripts/azure-templates-bootstrapper.yml b/scripts/azure-templates-bootstrapper.yml index 763c367d71..27c1e3b6bc 100644 --- a/scripts/azure-templates-bootstrapper.yml +++ b/scripts/azure-templates-bootstrapper.yml @@ -7,7 +7,6 @@ parameters: dependsOn: [] # the dependiencies variables: [] # the job variables requiredArtifacts: [] # the artifacts that this build needs to download - requiredArtifactsMap: [] # the artifacts that this build needs to download preBuildSteps: [] # any steps to run before the build postBuildSteps: [] # any additional steps to run after the build initScript: '' # any scripts to run before starting the bootstrapper @@ -17,6 +16,7 @@ parameters: shouldPublish: true # whether or not to publish the artifacts configuration: $(CONFIGURATION) # the build configuration buildExternals: '' # the build number to download externals from + isBuildPipeline: true verbosity: $(VERBOSITY) # the level of verbosity to use when building docker: '' # the Docker image to build and use dockerArgs: '' # any additional arguments to pass to docker build @@ -32,70 +32,70 @@ parameters: tools: [] # any additional .net global tools jobs: -- ${{ if and(gt(parameters.buildExternals, 0), startsWith(parameters.name, 'native_')) }}: - - template: azure-templates-download.yml - parameters: - name: ${{ parameters.name }} - displayName: ${{ parameters.displayName }} - vmImage: ${{ parameters.vmImage }} - packages: ${{ parameters.packages }} - target: ${{ parameters.target }} - dependsOn: ${{ parameters.dependsOn }} - variables: ${{ parameters.variables }} - requiredArtifacts: ${{ parameters.requiredArtifacts }} - requiredArtifactsMap: ${{ parameters.requiredArtifactsMap }} - preBuildSteps: ${{ parameters.preBuildSteps }} - postBuildSteps: ${{ parameters.postBuildSteps }} - initScript: ${{ parameters.initScript }} - additionalArgs: ${{ parameters.additionalArgs }} - retryCount: ${{ parameters.retryCount }} - condition: ${{ parameters.condition }} - shouldPublish: ${{ parameters.shouldPublish }} - configuration: ${{ parameters.configuration }} - buildExternals: ${{ parameters.buildExternals }} - verbosity: ${{ parameters.verbosity }} - docker: ${{ parameters.docker }} - dockerArgs: ${{ parameters.dockerArgs }} - installAndroidNdk: ${{ parameters.installAndroidNdk }} - installAndroidSdk: ${{ parameters.installAndroidSdk }} - installTizenSdk: ${{ parameters.installTizenSdk }} - installWindowsSdk: ${{ parameters.installWindowsSdk }} - installPreviewVs: ${{ parameters.installPreviewVs }} - installDotNet: ${{ parameters.installDotNet }} - installLlvm: ${{ parameters.installLlvm }} - installEmsdk: ${{ parameters.installEmsdk }} - artifactName: ${{ parameters.artifactName }} - tools: ${{ parameters.tools }} + - ${{ if gt(parameters.buildExternals, 0) }}: + - template: azure-templates-download.yml + parameters: + name: ${{ parameters.name }} + displayName: ${{ parameters.displayName }} + vmImage: ${{ parameters.vmImage }} + packages: ${{ parameters.packages }} + target: ${{ parameters.target }} + dependsOn: ${{ parameters.dependsOn }} + variables: ${{ parameters.variables }} + requiredArtifacts: ${{ parameters.requiredArtifacts }} + preBuildSteps: ${{ parameters.preBuildSteps }} + postBuildSteps: ${{ parameters.postBuildSteps }} + initScript: ${{ parameters.initScript }} + additionalArgs: ${{ parameters.additionalArgs }} + retryCount: ${{ parameters.retryCount }} + condition: ${{ parameters.condition }} + shouldPublish: ${{ parameters.shouldPublish }} + configuration: ${{ parameters.configuration }} + buildExternals: ${{ parameters.buildExternals }} + verbosity: ${{ parameters.verbosity }} + docker: ${{ parameters.docker }} + dockerArgs: ${{ parameters.dockerArgs }} + installAndroidNdk: ${{ parameters.installAndroidNdk }} + installAndroidSdk: ${{ parameters.installAndroidSdk }} + installTizenSdk: ${{ parameters.installTizenSdk }} + installWindowsSdk: ${{ parameters.installWindowsSdk }} + installPreviewVs: ${{ parameters.installPreviewVs }} + installDotNet: ${{ parameters.installDotNet }} + installLlvm: ${{ parameters.installLlvm }} + installEmsdk: ${{ parameters.installEmsdk }} + artifactName: ${{ parameters.artifactName }} + tools: ${{ parameters.tools }} -- ${{ if not(and(gt(parameters.buildExternals, 0), startsWith(parameters.name, 'native_'))) }}: - - template: azure-templates-build.yml - parameters: - name: ${{ parameters.name }} - displayName: ${{ parameters.displayName }} - vmImage: ${{ parameters.vmImage }} - packages: ${{ parameters.packages }} - target: ${{ parameters.target }} - dependsOn: ${{ parameters.dependsOn }} - variables: ${{ parameters.variables }} - requiredArtifacts: ${{ parameters.requiredArtifacts }} - requiredArtifactsMap: ${{ parameters.requiredArtifactsMap }} - preBuildSteps: ${{ parameters.preBuildSteps }} - postBuildSteps: ${{ parameters.postBuildSteps }} - initScript: ${{ parameters.initScript }} - additionalArgs: ${{ parameters.additionalArgs }} - retryCount: ${{ parameters.retryCount }} - condition: ${{ parameters.condition }} - shouldPublish: ${{ parameters.shouldPublish }} - configuration: ${{ parameters.configuration }} - verbosity: ${{ parameters.verbosity }} - docker: ${{ parameters.docker }} - dockerArgs: ${{ parameters.dockerArgs }} - installAndroidNdk: ${{ parameters.installAndroidNdk }} - installTizenSdk: ${{ parameters.installTizenSdk }} - installWindowsSdk: ${{ parameters.installWindowsSdk }} - installPreviewVs: ${{ parameters.installPreviewVs }} - installDotNet: ${{ parameters.installDotNet }} - installLlvm: ${{ parameters.installLlvm }} - installEmsdk: ${{ parameters.installEmsdk }} - artifactName: ${{ parameters.artifactName }} - tools: ${{ parameters.tools }} + - ${{ if not(gt(parameters.buildExternals, 0)) }}: + - template: azure-templates-build.yml + parameters: + name: ${{ parameters.name }} + displayName: ${{ parameters.displayName }} + vmImage: ${{ parameters.vmImage }} + packages: ${{ parameters.packages }} + target: ${{ parameters.target }} + dependsOn: ${{ parameters.dependsOn }} + variables: ${{ parameters.variables }} + requiredArtifacts: ${{ parameters.requiredArtifacts }} + preBuildSteps: ${{ parameters.preBuildSteps }} + postBuildSteps: ${{ parameters.postBuildSteps }} + initScript: ${{ parameters.initScript }} + additionalArgs: ${{ parameters.additionalArgs }} + retryCount: ${{ parameters.retryCount }} + condition: ${{ parameters.condition }} + shouldPublish: ${{ parameters.shouldPublish }} + configuration: ${{ parameters.configuration }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + verbosity: ${{ parameters.verbosity }} + docker: ${{ parameters.docker }} + dockerArgs: ${{ parameters.dockerArgs }} + installAndroidNdk: ${{ parameters.installAndroidNdk }} + installAndroidSdk: ${{ parameters.installAndroidSdk }} + installTizenSdk: ${{ parameters.installTizenSdk }} + installWindowsSdk: ${{ parameters.installWindowsSdk }} + installPreviewVs: ${{ parameters.installPreviewVs }} + installDotNet: ${{ parameters.installDotNet }} + installLlvm: ${{ parameters.installLlvm }} + installEmsdk: ${{ parameters.installEmsdk }} + artifactName: ${{ parameters.artifactName }} + tools: ${{ parameters.tools }} diff --git a/scripts/azure-templates-build.yml b/scripts/azure-templates-build.yml index a6633387ff..7463a5bfd4 100644 --- a/scripts/azure-templates-build.yml +++ b/scripts/azure-templates-build.yml @@ -7,7 +7,6 @@ parameters: dependsOn: [] # the dependiencies variables: [] # the job variables requiredArtifacts: [] # the artifacts that this build needs to download - requiredArtifactsMap: [] # the artifacts that this build needs to download preBuildSteps: [] # any steps to run before the build postBuildSteps: [] # any additional steps to run after the build initScript: '' # any scripts to run before starting the bootstrapper @@ -16,6 +15,7 @@ parameters: condition: succeeded() # whether or not to run this template shouldPublish: true # whether or not to publish the artifacts configuration: $(CONFIGURATION) # the build configuration + isBuildPipeline: true verbosity: $(VERBOSITY) # the level of verbosity to use when building docker: '' # the Docker image to build and use dockerArgs: '' # any additional arguments to pass to docker build @@ -43,6 +43,11 @@ jobs: submodules: recursive - template: azure-templates-variables.yml + - ${{ if ne(parameters.isBuildPipeline, 'true') }}: + - template: azure-templates-github-status.yml + parameters: + state: 'pending' + # install any packages on linux - ${{ if and(eq(parameters.docker, ''), endsWith(parameters.name, '_linux')) }}: - bash: | @@ -179,34 +184,9 @@ jobs: displayName: Install NuGet # download artifacts - - ${{ each dep in parameters.requiredArtifacts }}: - - ${{ if ne(dep, '') }}: - - task: DownloadBuildArtifacts@0 - displayName: Download the ${{ dep }} artifacts - inputs: - artifactName: ${{ dep }} - downloadPath: 'download-temp' - - pwsh: | - New-Item '.\output\' -Type Directory -Force | Out-Null - Get-ChildItem '.\download-temp\${{ dep }}\' | Copy-Item -Destination '.\output\' -Recurse -Force - Remove-Item '.\download-temp\${{ dep }}\' -Recurse -Force - displayName: Move the ${{ dep }} artifacts to the output directory - - pwsh: Remove-Item ./output/logs/ -Recurse -Force -ErrorAction Ignore - displayName: Delete old logs - - ${{ each dep in parameters.requiredArtifactsMap }}: - - ${{ if and(ne(dep.src, ''), ne(dep.dst, '')) }}: - - task: DownloadBuildArtifacts@0 - displayName: Download the ${{ dep.src }} artifacts - inputs: - artifactName: ${{ dep.src }} - downloadPath: 'download-temp' - - pwsh: | - New-Item '.\output\${{ dep.dst }}\' -Type Directory -Force | Out-Null - Get-ChildItem '.\download-temp\${{ dep.src }}\' | Copy-Item -Destination '.\output\${{ dep.dst }}\' -Recurse -Force - Remove-Item '.\download-temp\${{ dep.src }}\' -Recurse -Force - displayName: Move the ${{ dep.src }} artifacts to the output directory - - pwsh: Remove-Item ./output/logs/ -Recurse -Force -ErrorAction Ignore - displayName: Delete old logs + - template: azure-templates-download-artifacts.yml + parameters: + artifacts: ${{ parameters.requiredArtifacts }} # pre-build steps - ${{ parameters.preBuildSteps }} @@ -276,3 +256,6 @@ jobs: scanType: 'Register' verbosity: 'Verbose' alertWarningLevel: 'High' + + - ${{ if ne(parameters.isBuildPipeline, 'true') }}: + - template: azure-templates-github-status.yml diff --git a/scripts/azure-templates-download-artifacts.yml b/scripts/azure-templates-download-artifacts.yml new file mode 100644 index 0000000000..718c30e3ca --- /dev/null +++ b/scripts/azure-templates-download-artifacts.yml @@ -0,0 +1,47 @@ +parameters: + sourceBuildId: '' + artifacts: [ ] # name, dir + +steps: + - pwsh: | + $buildId = "${{ parameters.sourceBuildId }}" + if ($env:RESOURCES_PIPELINE_SKIASHARP_RUNID) { + $buildId = $env:RESOURCES_PIPELINE_SKIASHARP_RUNID + Write-Host "Using RESOURCES_PIPELINE_SKIASHARP_RUNID = '$env:RESOURCES_PIPELINE_SKIASHARP_RUNID'" + } + if (-not $buildId) { + $buildId = $env:BUILD_BUILDID + Write-Host "Using BUILD_BUILDID = '$env:BUILD_BUILDID'" + } + $pipelineId = "$env:SYSTEM_DEFINITIONID" + if ($env:RESOURCES_PIPELINE_SKIASHARP_PIPELINEID) { + $pipelineId = $env:RESOURCES_PIPELINE_SKIASHARP_PIPELINEID + Write-Host "Using RESOURCES_PIPELINE_SKIASHARP_PIPELINEID = '$env:RESOURCES_PIPELINE_SKIASHARP_PIPELINEID'" + } + Write-Host "DOWNLOAD_BUILD_ID = '$buildId'" + Write-Host "DOWNLOAD_PIPELINE_ID = '$pipelineId'" + Write-Host "##vso[task.setvariable variable=DOWNLOAD_BUILD_ID]$buildId" + Write-Host "##vso[task.setvariable variable=DOWNLOAD_PIPELINE_ID]$pipelineId" + displayName: Ensure all the variables are set for the download + + - ${{ each artifact in parameters.artifacts }}: + - task: DownloadBuildArtifacts@0 + displayName: Download the pre-built ${{ artifact.name }} artifacts + inputs: + buildType: 'specific' + project: '$(System.TeamProjectId)' + pipeline: '$(DOWNLOAD_PIPELINE_ID)' + buildVersionToDownload: 'specific' + buildId: '$(DOWNLOAD_BUILD_ID)' + downloadType: 'single' + artifactName: ${{ artifact.name }} + downloadPath: 'download-temp' + + - pwsh: | + New-Item '.\output\${{ artifact.dir }}\' -Type Directory -Force | Out-Null + Get-ChildItem '.\download-temp\${{ artifact.name }}\' | Copy-Item -Destination '.\output\${{ artifact.dir }}\' -Recurse -Force + Remove-Item '.\download-temp\${{ artifact.name }}\' -Recurse -Force + displayName: Move the ${{ artifact.name }} artifacts to the ./output/${{ artifact.dir }} directory + + - pwsh: Remove-Item ./output/logs/ -Recurse -Force -ErrorAction Ignore + displayName: Delete old logs diff --git a/scripts/azure-templates-download.yml b/scripts/azure-templates-download.yml index 7d455fada3..19cccd1b67 100644 --- a/scripts/azure-templates-download.yml +++ b/scripts/azure-templates-download.yml @@ -14,22 +14,11 @@ jobs: condition: ${{ parameters.condition }} steps: - checkout: none - - task: DownloadBuildArtifacts@0 - displayName: Download the pre-built ${{ parameters.name }} artifacts - inputs: - buildType: 'specific' - project: '$(System.TeamProjectId)' - pipeline: '$(System.DefinitionId)' - buildVersionToDownload: 'specific' - buildId: '${{ parameters.buildExternals }}' - downloadType: 'single' - artifactName: ${{ parameters.name }} - downloadPath: 'download-temp' - - pwsh: | - New-Item '.\output\' -Type Directory -Force | Out-Null - Get-ChildItem '.\download-temp\${{ parameters.name }}\' | Copy-Item -Destination '.\output\' -Recurse -Force - Remove-Item '.\download-temp\${{ parameters.name }}\' -Recurse -Force - displayName: Move the ${{ parameters.name }} artifacts to the output directory + - template: azure-templates-download-artifacts.yml + parameters: + sourceBuildId: ${{ parameters.buildExternals }} + artifacts: + - name: ${{ parameters.name }} - task: PublishBuildArtifacts@1 displayName: Publish the ${{ parameters.name }} artifacts inputs: diff --git a/scripts/azure-templates-github-status.yml b/scripts/azure-templates-github-status.yml new file mode 100644 index 0000000000..b3905f223b --- /dev/null +++ b/scripts/azure-templates-github-status.yml @@ -0,0 +1,33 @@ +parameters: + context: '' + state: '' + pipelineName: '$(System.DefinitionName)' + displayName: 'Update the GitHub status for this job' + +steps: + - pwsh: | + $state = 'pending' + if ('${{ parameters.state }}') { + $state = '${{ parameters.state }}' + } elseif ($env:AGENT_JOBSTATUS -eq 'Failed') { + $state = 'failure' + } elseif ($env:AGENT_JOBSTATUS -eq 'Succeeded') { + $state = 'success' + } + $context = "${{ parameters.pipelineName }} ($env:SYSTEM_STAGEDISPLAYNAME $env:SYSTEM_PHASEDISPLAYNAME)" + if ('${{ parameters.context }}') { + $context = '${{ parameters.context }}' + } + Set-Content -Path temp-test.json -Value "{ + `"state`": `"$state`", + `"target_url`": `"$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI/$env:SYSTEM_TEAMPROJECT/_build/results?buildId=$env:BUILD_BUILDID&view=logs&j=$env:SYSTEM_JOBID`", + `"context`": `"$context`" + }" + curl -v ` + -X POST ` + -H "Accept: application/vnd.github.v3+json" ` + -H "Authorization: token $(Github.Token)" ` + https://api.github.com/repos/$env:BUILD_REPOSITORY_ID/statuses/$env:SYSTEM_PULLREQUEST_SOURCECOMMITID ` + -d @temp-test.json + displayName: ${{ parameters.displayName }} + condition: always() diff --git a/scripts/azure-templates-linux-matrix.yml b/scripts/azure-templates-linux-matrix.yml index 9f06d41e7d..b02a594702 100644 --- a/scripts/azure-templates-linux-matrix.yml +++ b/scripts/azure-templates-linux-matrix.yml @@ -1,6 +1,7 @@ parameters: artifactName: '' # the name of the artifact to merge this run into buildExternals: '' # the build number to download externals from + isBuildPipeline: true vmImage: '' # the VM image builds: - name: '' @@ -24,6 +25,7 @@ jobs: name: ${{ replace(replace(format('native_linux_{0}_{1}_{2}_{3}_linux', item.arch, item.variant, build.name, item.alt), '__', '_'), '__', '_') }} displayName: Linux ${{ replace(replace(replace(replace(replace(format('({0}|{1}|{2}|{3})', item.arch, item.variant, build.name, item.alt), '||', '|'), '||', '|'), '(|', '('), '|)', ')'), '|', ', ') }} buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} vmImage: ${{ parameters.vmImage }} docker: ${{ item.docker }} dockerArgs: ${{ item.dockerArgs }} diff --git a/scripts/azure-templates-stages.yml b/scripts/azure-templates-stages.yml new file mode 100644 index 0000000000..2b16cc2c48 --- /dev/null +++ b/scripts/azure-templates-stages.yml @@ -0,0 +1,919 @@ +parameters: + isBuildPipeline: true + buildExternals: 0 + VM_IMAGE_WINDOWS: '' + VM_IMAGE_MAC: '' + VM_IMAGE_LINUX: '' + +stages: + - stage: prepare + displayName: Prepare Build + jobs: + - job: prepare # Prepare Build + displayName: Prepare Build + pool: ${{ parameters.VM_IMAGE_LINUX }} + steps: + - checkout: none + - template: azure-templates-variables.yml + parameters: + updateBuild: true + - pwsh: 'dir env:' + - template: azure-templates-github-status.yml + parameters: + context: 'SkiaSharp-Tests' + state: 'pending' + displayName: Queue up the status for the tests pipeline + - ${{ if ne(parameters.isBuildPipeline, 'true') }}: + - template: azure-templates-github-status.yml + + - ${{ if eq(parameters.isBuildPipeline, 'true') }}: + - stage: native_windows + displayName: Native Windows + dependsOn: prepare + jobs: + - template: azure-templates-bootstrapper.yml # Build Native Android|x86 (Win) + parameters: + name: native_android_x86_windows + displayName: Android x86 + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: externals-android + additionalArgs: --buildarch=x86 + installWindowsSdk: false + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native Android|x64 (Win) + parameters: + name: native_android_x64_windows + displayName: Android x64 + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: externals-android + additionalArgs: --buildarch=x64 + installWindowsSdk: false + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native Android|arm (Win) + parameters: + name: native_android_arm_windows + displayName: Android arm + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: externals-android + additionalArgs: --buildarch=arm + installWindowsSdk: false + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native Android|arm64 (Win) + parameters: + name: native_android_arm64_windows + displayName: Android arm64 + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: externals-android + additionalArgs: --buildarch=arm64 + installWindowsSdk: false + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native Tizen (Win) + parameters: + name: native_tizen_windows + displayName: Tizen + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: externals-tizen + installWindowsSdk: false + artifactName: native + - template: azure-templates-bootstrapper.yml # Build ANGLE UWP|x86 (Win) + parameters: + name: native_uwp_angle_x86_windows + displayName: ANGLE x86 + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: ANGLE + additionalArgs: -Script .\native\uwp\build.cake --buildarch=x86 + artifactName: native + - template: azure-templates-bootstrapper.yml # Build ANGLE UWP|x64 (Win) + parameters: + name: native_uwp_angle_x64_windows + displayName: ANGLE x64 + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: ANGLE + additionalArgs: -Script .\native\uwp\build.cake --buildarch=x64 + artifactName: native + - template: azure-templates-bootstrapper.yml # Build ANGLE UWP|arm (Win) + parameters: + name: native_uwp_angle_arm_windows + displayName: ANGLE arm + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: ANGLE + additionalArgs: -Script .\native\uwp\build.cake --buildarch=arm + artifactName: native + - template: azure-templates-bootstrapper.yml # Build ANGLE UWP|arm64 (Win) + parameters: + name: native_uwp_angle_arm64_windows + displayName: ANGLE arm64 + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: ANGLE + additionalArgs: -Script .\native\uwp\build.cake --buildarch=arm64 + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native UWP|x86 (Win) + parameters: + name: native_uwp_x86_windows + displayName: UWP x86 + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: externals-uwp + additionalArgs: --buildarch=x86 --skipAngle=true + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native UWP|x64 (Win) + parameters: + name: native_uwp_x64_windows + displayName: UWP x64 + buildExternals: ${{ parameters.buildExternals }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: externals-uwp + additionalArgs: --buildarch=x64 --skipAngle=true + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native UWP|arm (Win) + parameters: + name: native_uwp_arm_windows + displayName: UWP arm + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: externals-uwp + additionalArgs: --buildarch=arm --skipAngle=true + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native UWP|arm64 (Win) + parameters: + name: native_uwp_arm64_windows + displayName: UWP arm64 + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: externals-uwp + additionalArgs: --buildarch=arm64 --skipAngle=true + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native Win32|x86 (Win) + parameters: + name: native_win32_x86_windows + displayName: Win32 x86 + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: externals-windows + additionalArgs: --buildarch=x86 + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native Win32|x64 (Win) + parameters: + name: native_win32_x64_windows + displayName: Win32 x64 + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: externals-windows + additionalArgs: --buildarch=x64 + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native Win32|arm64 (Win) + parameters: + name: native_win32_arm64_windows + displayName: Win32 arm64 + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: externals-windows + additionalArgs: --buildarch=arm64 + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native NanoServer|x64 (Win) + parameters: + name: native_win32_x64_nanoserver_windows + displayName: Nano Server x64 + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: externals-nanoserver + additionalArgs: --buildarch=x64 + artifactName: native + + - ${{ if eq(parameters.isBuildPipeline, 'true') }}: + - stage: native_macos + displayName: Native macOS + dependsOn: prepare + jobs: + - template: azure-templates-bootstrapper.yml # Build Native Android|x86 (macOS) + parameters: + name: native_android_x86_macos + displayName: Android x86 + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_MAC }} + target: externals-android + additionalArgs: --buildarch=x86 + - template: azure-templates-bootstrapper.yml # Build Native Android|x64 (macOS) + parameters: + name: native_android_x64_macos + displayName: Android x64 + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_MAC }} + target: externals-android + additionalArgs: --buildarch=x64 + - template: azure-templates-bootstrapper.yml # Build Native Android|arm (macOS) + parameters: + name: native_android_arm_macos + displayName: Android arm + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_MAC }} + target: externals-android + additionalArgs: --buildarch=arm + - template: azure-templates-bootstrapper.yml # Build Native Android|arm64 (macOS) + parameters: + name: native_android_arm64_macos + displayName: Android arm64 + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_MAC }} + target: externals-android + additionalArgs: --buildarch=arm64 + - template: azure-templates-bootstrapper.yml # Build Native iOS (macOS) + parameters: + name: native_ios_macos + displayName: iOS + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_MAC }} + target: externals-ios + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native Mac Catalyst (macOS) + parameters: + name: native_maccatalyst_macos + displayName: Mac Catalyst + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_MAC }} + target: externals-maccatalyst + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native macOS (macOS) + parameters: + name: native_macos_macos + displayName: macOS + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_MAC }} + target: externals-macos + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native tvOS (macOS) + parameters: + name: native_tvos_macos + displayName: tvOS + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_MAC }} + target: externals-tvos + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native watchOS (macOS) + parameters: + name: native_watchos_macos + displayName: watchOS + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_MAC }} + target: externals-watchos + artifactName: native + - template: azure-templates-bootstrapper.yml # Build Native Tizen (macOS) + parameters: + name: native_tizen_macos + displayName: Tizen + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_MAC }} + target: externals-tizen + condition: false # TODO: TIZEN INSTALL BUGS + + - ${{ if eq(parameters.isBuildPipeline, 'true') }}: + - stage: native_linux + displayName: Native Linux + dependsOn: prepare + jobs: + - template: azure-templates-linux-matrix.yml # Build Native Linux (Linux) + parameters: + artifactName: native + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_LINUX }} + builds: + - name: '' + - name: nodeps + desc: 'No Deps' + additionalArgs: --verifyExcluded=fontconfig + gnArgs: skia_use_fontconfig=false + matrix: + - arch: x64 + docker: scripts/Docker/debian9/amd64 + - arch: x64 + variant: alpine + docker: scripts/Docker/alpine/amd64 + - arch: arm + docker: scripts/Docker/debian9/clang-cross + target: externals-linux-clang-cross + - arch: arm64 + docker: scripts/Docker/debian9/clang-cross + dockerArgs: --build-arg TOOLCHAIN_ARCH=aarch64-linux-gnu --build-arg TOOLCHAIN_ARCH_SHORT=arm64 + target: externals-linux-clang-cross + - template: azure-templates-bootstrapper.yml # Build Native Tizen (Linux) + parameters: + name: native_tizen_linux + displayName: Tizen + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_LINUX }} + packages: $(TIZEN_LINUX_PACKAGES) + target: externals-tizen + + - ${{ if eq(parameters.isBuildPipeline, 'true') }}: + - stage: native_wasm + displayName: Native WASM + dependsOn: prepare + jobs: + - template: azure-templates-wasm-matrix.yml # Build Native WASM (Linux) + parameters: + buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_LINUX }} + artifactName: native + emscripten: + - 2.0.5 + - 2.0.6 + - 2.0.9 + - 2.0.11 + - 2.0.12 + - 2.0.23 + + - ${{ if eq(parameters.isBuildPipeline, 'true') }}: + - stage: managed + displayName: Build Managed + dependsOn: + - native_windows + - native_macos + - native_linux + - native_wasm + jobs: + - template: azure-templates-bootstrapper.yml # Build Managed (Windows) + parameters: + name: managed_windows + displayName: Managed (Windows) + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: libs + additionalArgs: --skipExternals="all" + installPreviewVs: true + requiredArtifacts: + - name: native + artifactName: managed + postBuildSteps: + - pwsh: Remove-Item ./output/native/ -Recurse -Force -ErrorAction Continue + displayName: Delete the native folder + - template: azure-templates-bootstrapper.yml # Build Managed (macOS) + parameters: + name: managed_macos + displayName: Managed (macOS) + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_MAC }} + target: libs + additionalArgs: --skipExternals="all" + requiredArtifacts: + - name: native + artifactName: managed + postBuildSteps: + - pwsh: Remove-Item ./output/native/ -Recurse -Force -ErrorAction Continue + displayName: Delete the native folder + - template: azure-templates-bootstrapper.yml # Build Managed (Linux) + parameters: + name: managed_linux + displayName: Managed (Linux) + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_LINUX }} + packages: $(MANAGED_LINUX_PACKAGES) + target: libs + additionalArgs: --skipExternals="all" + requiredArtifacts: + - name: native + artifactName: managed + postBuildSteps: + - pwsh: Remove-Item ./output/native/ -Recurse -Force -ErrorAction Continue + displayName: Delete the native folder + + - ${{ if eq(parameters.isBuildPipeline, 'true') }}: + - stage: package + displayName: Package NuGets + dependsOn: managed + jobs: + - template: azure-templates-bootstrapper.yml # Package NuGets + parameters: + name: package_windows + displayName: Package NuGets + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: nuget + additionalArgs: --packall=true --skipbuild=true + installWindowsSdk: false + installAndroidSdk: false + installDotNet: false + requiredArtifacts: + - name: managed + - name: native + postBuildSteps: + - task: PublishBuildArtifacts@1 + displayName: Publish the nuget artifacts + inputs: + artifactName: nuget + pathToPublish: 'output/nugets' + - task: PublishBuildArtifacts@1 + displayName: Publish the special nuget artifacts + inputs: + artifactName: nuget_special + pathToPublish: 'output/nugets-special' + - task: PublishBuildArtifacts@1 + displayName: Publish the special nuget artifacts + inputs: + artifactName: nuget_symbols + pathToPublish: 'output/nugets-symbols' + - task: PublishBuildArtifacts@1 + displayName: Publish the SignList.xml into nuget artifacts + inputs: + artifactName: nuget + pathToPublish: 'SignList.xml' + - pwsh: | + Remove-Item ./output/native/ -Recurse -Force + Remove-Item ./output/nugets/ -Recurse -Force + Remove-Item ./output/nugets-special/ -Recurse -Force + Remove-Item ./output/nugets-symbols/ -Recurse -Force + displayName: Delete the pre-published folders + + - ${{ if ne(parameters.isBuildPipeline, 'true') }}: + - stage: api_diff + displayName: API Diff + dependsOn: prepare + jobs: + - template: azure-templates-bootstrapper.yml # API Diff + parameters: + name: api_diff_windows + displayName: API Diff + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: docs-api-diff + additionalArgs: --nugetDiffPrerelease=$(NUGET_DIFF_PRERELEASE) + shouldPublish: false + requiredArtifacts: + - name: package_windows + - name: nuget + dir: nugets + preBuildSteps: + - pwsh: .\scripts\install-gtk.ps1 + displayName: Install GTK# 2.12 + postBuildSteps: + - task: PublishBuildArtifacts@1 + displayName: Publish the API diffs + condition: always() + inputs: + artifactName: api-diff + pathToPublish: '$(Build.SourcesDirectory)\output\api-diff' + + - ${{ if and(eq(variables['System.TeamProject'], 'devdiv'), eq(parameters.isBuildPipeline, 'true')) }}: + - stage: signing + displayName: Sign NuGets + dependsOn: package + jobs: + - template: sign-artifacts/jobs/v2.yml@xamarin-templates + parameters: + ${{ if or(eq(variables['Build.SourceBranch'], 'refs/heads/main'), startsWith(variables['Build.SourceBranch'], 'refs/heads/patch/')) }}: + signType: 'Real' + ${{ if not(or(eq(variables['Build.SourceBranch'], 'refs/heads/main'), startsWith(variables['Build.SourceBranch'], 'refs/heads/patch/'))) }}: + signType: 'Test' + + - ${{ if and(eq(variables['System.TeamProject'], 'devdiv'), eq(parameters.isBuildPipeline, 'true')) }}: + - stage: sbom + displayName: 'Software Bill of Materials' + dependsOn: signing + jobs: + - template: compliance/sbom/job.v1.yml@xamarin-templates # Software Bill of Materials (SBOM): https://eng.ms/docs/cloud-ai-platform/devdiv/one-engineering-system-1es/1es-docs/secure-supply-chain/ado-sbom-generator + parameters: + artifactNames: ['nuget'] + packageName: 'SkiaSharp' + packageFilter: '*.nupkg' + + - ${{ if ne(parameters.isBuildPipeline, 'true') }}: + - stage: tests + displayName: Tests + dependsOn: prepare + jobs: + - template: azure-templates-bootstrapper.yml # Tests|netfx (Windows) + parameters: + name: tests_netfx_windows + displayName: Windows (.NET Framework) + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: tests-netfx + additionalArgs: --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=$(ENABLE_CODE_COVERAGE) + installPreviewVs: true + installWindowsSdk: false + shouldPublish: false + requiredArtifacts: + - name: native_win32_x86_windows + - name: native_win32_x64_windows + postBuildSteps: + - task: PublishTestResults@2 + displayName: Publish the .NET Framework test results + condition: always() + inputs: + testResultsFormat: xUnit + testResultsFiles: 'tests/SkiaSharp*.Desktop.Tests/**/TestResults.xml' + testRunTitle: 'Windows .NET Framework Tests' + - template: azure-templates-bootstrapper.yml # Tests|netcore (Windows) + parameters: + name: tests_netcore_windows + displayName: Windows (.NET Core) + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: tests-netcore + additionalArgs: --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=$(ENABLE_CODE_COVERAGE) + installWindowsSdk: false + shouldPublish: false + requiredArtifacts: + - name: native_win32_x86_windows + - name: native_win32_x64_windows + postBuildSteps: + - task: PublishTestResults@2 + displayName: Publish the .NET Core test results + condition: always() + inputs: + testResultsFormat: xUnit + testResultsFiles: 'tests/SkiaSharp*.NetCore.Tests/**/TestResults.xml' + testRunTitle: 'Windows .NET Core Tests' + - task: PublishBuildArtifacts@1 + displayName: 'Publish the code coverage results' + inputs: + artifactName: coverage_netcore_windows + pathToPublish: 'output/coverage' + - template: azure-templates-bootstrapper.yml # Tests|netfx (macOS) + parameters: + name: tests_netfx_macos + displayName: macOS (.NET Framework) + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_MAC }} + target: tests-netfx + additionalArgs: --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=$(ENABLE_CODE_COVERAGE) + shouldPublish: false + requiredArtifacts: + - name: native_macos_macos + postBuildSteps: + - task: PublishTestResults@2 + displayName: Publish the Mono test results + condition: always() + inputs: + testResultsFormat: xUnit + testResultsFiles: 'tests/SkiaSharp*.Desktop.Tests/**/TestResults.xml' + testRunTitle: 'macOS Mono Tests' + - template: azure-templates-bootstrapper.yml # Tests|netcore (macOS) + parameters: + name: tests_netcore_macos + displayName: macOS (.NET Core) + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_MAC }} + target: tests-netcore + additionalArgs: --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=$(ENABLE_CODE_COVERAGE) + shouldPublish: false + requiredArtifacts: + - name: native_macos_macos + postBuildSteps: + - task: PublishTestResults@2 + displayName: Publish the .NET Core test results + condition: always() + inputs: + testResultsFormat: xUnit + testResultsFiles: 'tests/SkiaSharp*.NetCore.Tests/**/TestResults.xml' + testRunTitle: 'macOS .NET Core Tests' + - task: PublishBuildArtifacts@1 + displayName: 'Publish the code coverage results' + inputs: + artifactName: coverage_netcore_macos + pathToPublish: 'output/coverage' + - template: azure-templates-bootstrapper.yml # Tests|android (macOS) + parameters: + name: tests_android_macos + displayName: Android (macOS) + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_MAC }} + target: tests-android + additionalArgs: --device=android-emulator-64_30 --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=$(ENABLE_CODE_COVERAGE) + shouldPublish: false + requiredArtifacts: + - name: native_android_x86_macos + - name: native_android_x64_macos + - name: native_android_arm_macos + - name: native_android_arm64_macos + preBuildSteps: + - pwsh: .\scripts\install-android-package.ps1 -Package "emulator" + displayName: Install the Android emulator + - pwsh: .\scripts\install-android-package.ps1 -Package "system-images;android-30;google_apis_playstore;x86_64" + displayName: Install the Android API 30 emulator image + postBuildSteps: + - task: PublishTestResults@2 + displayName: Publish the Android test results + condition: always() + inputs: + testResultsFormat: xUnit + testResultsFiles: 'output/logs/testlogs/SkiaSharp.Android.Tests/**/TestResults.xml' + testRunTitle: 'Android Tests' + - task: PublishBuildArtifacts@1 + displayName: Publish the test logs + condition: always() + inputs: + artifactName: testlogs_android + pathToPublish: 'output/logs/testlogs' + - template: azure-templates-bootstrapper.yml # Tests|ios (macOS) + parameters: + name: tests_ios_macos + displayName: iOS (macOS) + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_MAC }} + target: tests-ios + additionalArgs: --device=ios-simulator-64 --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=$(ENABLE_CODE_COVERAGE) + shouldPublish: false + requiredArtifacts: + - name: native_ios_macos + preBuildSteps: + - template: azure-templates-provisioning-profiles.yml + postBuildSteps: + - task: PublishTestResults@2 + displayName: Publish the iOS test results + condition: always() + inputs: + testResultsFormat: xUnit + testResultsFiles: 'output/logs/testlogs/SkiaSharp.iOS.Tests/**/TestResults.xml' + testRunTitle: 'iOS Tests' + - task: PublishBuildArtifacts@1 + displayName: Publish the test logs + condition: always() + inputs: + artifactName: testlogs_ios + pathToPublish: 'output/logs/testlogs' + - template: azure-templates-bootstrapper.yml # Tests|netfx (Linux) + parameters: + name: tests_netfx_linux + displayName: Linux (.NET Framework) + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_LINUX }} + packages: $(MANAGED_LINUX_PACKAGES) + target: tests-netfx + additionalArgs: --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=$(ENABLE_CODE_COVERAGE) + shouldPublish: false + requiredArtifacts: + - name: native_linux_x64_linux + postBuildSteps: + - task: PublishTestResults@2 + displayName: Publish the Mono test results + condition: always() + inputs: + testResultsFormat: xUnit + testResultsFiles: 'tests/SkiaSharp*.Desktop.Tests/**/TestResults.xml' + testRunTitle: 'Linux Mono Tests' + - template: azure-templates-bootstrapper.yml # Tests|netcore (Linux) + parameters: + name: tests_netcore_linux + displayName: Linux (.NET Core) + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_LINUX }} + packages: $(MANAGED_LINUX_PACKAGES) + target: tests-netcore + additionalArgs: --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=$(ENABLE_CODE_COVERAGE) + shouldPublish: false + requiredArtifacts: + - name: native_linux_x64_linux + postBuildSteps: + - task: PublishTestResults@2 + displayName: Publish the .NET Core test results + condition: always() + inputs: + testResultsFormat: xUnit + testResultsFiles: 'tests/SkiaSharp*.NetCore.Tests/**/TestResults.xml' + testRunTitle: 'Linux .NET Core Tests' + - task: PublishBuildArtifacts@1 + displayName: 'Publish the code coverage results' + inputs: + artifactName: coverage_netcore_linux + pathToPublish: 'output/coverage' + - template: azure-templates-bootstrapper.yml # Tests [WASM] (Linux) + parameters: + name: tests_wasm_linux + displayName: WASM (Linux) + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_LINUX }} + packages: $(MANAGED_LINUX_PACKAGES) ninja-build + target: tests-wasm + additionalArgs: --skipExternals="all" --throwOnTestFailure=$(THROW_ON_TEST_FAILURE) --coverage=false --chromedriver=$(CHROMEWEBDRIVER) + shouldPublish: false + requiredArtifacts: + - name: native_wasm_linux + installEmsdk: true + initScript: source ~/emsdk/emsdk_env.sh + postBuildSteps: + - task: PublishTestResults@2 + displayName: Publish the WASM test results + condition: always() + inputs: + testResultsFormat: xUnit + testResultsFiles: 'tests/SkiaSharp*.Wasm.Tests/**/TestResults.xml' + testRunTitle: 'Linux WASM Tests' + # TODO: add tests for linux alpine + # TODO: add tests for linux no dependencies + # TODO: add tests for windows nano server + - job: coverage_reports # Coverage Reports + displayName: Coverage Reports + pool: ${{ parameters.VM_IMAGE_LINUX }} + dependsOn: + - tests_netcore_windows + - tests_netcore_macos + - tests_netcore_linux + steps: + - checkout: self + - template: azure-templates-variables.yml + - template: azure-templates-github-status.yml + parameters: + state: 'pending' + - task: DownloadBuildArtifacts@0 + displayName: Download the coverage_netcore_windows artifact + inputs: + artifactName: coverage_netcore_windows + downloadPath: output + - task: DownloadBuildArtifacts@0 + displayName: Download the coverage_netcore_macos artifact + inputs: + artifactName: coverage_netcore_macos + downloadPath: output + - task: DownloadBuildArtifacts@0 + displayName: Download the coverage_netcore_linux artifact + inputs: + artifactName: coverage_netcore_linux + downloadPath: output + - task: PublishCodeCoverageResults@1 + displayName: 'Publish the code coverage results' + inputs: + codeCoverageTool: Cobertura + summaryFileLocation: 'output/**/Cobertura.xml' + - template: azure-templates-github-status.yml + + - ${{ if ne(parameters.isBuildPipeline, 'true') }}: + - stage: samples + displayName: Samples + dependsOn: prepare + jobs: + - template: azure-templates-bootstrapper.yml # Build Samples (Windows) + parameters: + name: samples_windows + displayName: Windows + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: samples + installPreviewVs: true + requiredArtifacts: + - name: nuget + dir: nugets + postBuildSteps: + - pwsh: Remove-Item ./output/nugets/ -Recurse -Force -ErrorAction Continue + displayName: Delete the nugets folder + - template: azure-templates-bootstrapper.yml # Build Samples (macOS) + parameters: + name: samples_macos + displayName: macOS + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_MAC }} + target: samples + shouldPublish: false + requiredArtifacts: + - name: nuget + dir: nugets + preBuildSteps: + - template: azure-templates-provisioning-profiles.yml + - template: azure-templates-bootstrapper.yml # Build Samples (Linux) + parameters: + name: samples_linux + displayName: Linux + isBuildPipeline: ${{ parameters.isBuildPipeline }} + vmImage: ${{ parameters.VM_IMAGE_LINUX }} + packages: $(MANAGED_LINUX_PACKAGES) + target: samples + shouldPublish: false + requiredArtifacts: + - name: nuget + dir: nugets + installEmsdk: true + initScript: source ~/emsdk/emsdk_env.sh + + - ${{ if and(eq(variables['System.TeamProject'], 'devdiv'), eq(parameters.isBuildPipeline, 'true')) }}: + - stage: checks + displayName: Run Code Checks + dependsOn: prepare + jobs: + - template: azure-templates-bootstrapper.yml # Run Code Checks + parameters: + name: native_checks_windows + displayName: Run Code Checks + isBuildPipeline: ${{ parameters.isBuildPipeline }} + condition: or(eq(variables['Build.SourceBranch'], 'refs/heads/main'), startsWith(variables['Build.SourceBranch'], 'refs/heads/patch/')) + vmImage: ${{ parameters.VM_IMAGE_WINDOWS}} + target: git-sync-deps + installWindowsSdk: false + installAndroidSdk: false + installDotNet: false + shouldPublish: false + postBuildSteps: + - task: CredScan@2 + displayName: Analyze source for credentials + condition: always() + inputs: + toolMajorVersion: 'V2' + - task: PoliCheck@1 + displayName: Run PoliCheck + condition: always() + inputs: + inputType: 'Basic' + targetType: 'F' + - task: SdtReport@1 + displayName: Create security analysis report + condition: always() + inputs: + AllTools: false + APIScan: false + BinSkim: false + CodesignValidation: false + CredScan: true + FortifySCA: false + FxCop: false + ModernCop: false + MSRD: false + PoliCheck: true + RoslynAnalyzers: false + SDLNativeRules: false + Semmle: false + TSLint: false + ToolLogsNotFoundAction: 'Standard' + - task: PublishSecurityAnalysisLogs@3 + displayName: Publish security analysis logs + condition: always() + - task: TSAUpload@1 + displayName: Publish TSA logs + condition: always() + continueOnError: true + inputs: + tsaVersion: 'TsaV2' + codebase: 'NewOrUpdate' + tsaEnvironment: 'PROD' + codeBaseName: 'SkiaSharp_main' + notificationAlias: 'xamacomd@microsoft.com' + notifyAlwaysV2: false + instanceUrlForTsaV2: 'DEVDIV' + projectNameDEVDIV: 'DevDiv' + areaPath: 'DevDiv\VS Client - Runtime SDKs\SkiaSharp' + iterationPath: 'DevDiv\OneVS' + uploadAPIScan: false + uploadBinSkim: false + uploadCredScan: true + uploadFortifySCA: false + uploadFxCop: false + uploadModernCop: false + uploadPoliCheck: true + uploadPREfast: false + uploadRoslyn: false + uploadTSLint: false + uploadAsync: true + + - ${{ if ne(parameters.isBuildPipeline, 'true') }}: + - stage: finalize + displayName: Finalize Build + dependsOn: + - api_diff + - samples + - tests + jobs: + - job: finalize # Finalize Build + displayName: Finalize Build + pool: ${{ parameters.VM_IMAGE_LINUX }} + steps: + - checkout: none + - template: azure-templates-variables.yml + - template: azure-templates-github-status.yml + parameters: + context: 'SkiaSharp-Tests' + displayName: Update the final status for the tests pipeline diff --git a/scripts/azure-templates-variables.yml b/scripts/azure-templates-variables.yml index 1c6ccf5723..0bec2f95a4 100644 --- a/scripts/azure-templates-variables.yml +++ b/scripts/azure-templates-variables.yml @@ -2,6 +2,7 @@ parameters: updateBuild: false steps: + - pwsh: | $featurePrefix = "refs/heads/$env:FEATURE_NAME_PREFIX" if ($env:BUILD_SOURCEBRANCH.StartsWith($featurePrefix)) { @@ -12,25 +13,66 @@ steps: Write-Host "No feature name." } displayName: Determine the feature name, if any + + - pwsh: | + $isPR = [regex]::Match("$:env:BUILD_SOURCEBRANCH", 'refs\/pull\/(\d+)\/merge') + if ($isPR) { + if (-not $env:SYSTEM_PULLREQUEST_PULLREQUESTNUMBER) { + $pr = $isPR.Groups[1].Value + Write-Host "PR number: $pr" + $env:SYSTEM_PULLREQUEST_PULLREQUESTNUMBER = $pr + Write-Host "##vso[task.setvariable variable=SYSTEM_PULLREQUEST_PULLREQUESTNUMBER]$pr" + } + if (-not $env:SYSTEM_PULLREQUEST_SOURCECOMMITID) { + $sha = [regex]::Match("$env:BUILD_SOURCEVERSIONMESSAGE", 'Merge (.+) into (.+)').Groups[1].Value + Write-Host "PR SHA: $sha" + $env:SYSTEM_PULLREQUEST_SOURCECOMMITID = $sha + Write-Host "##vso[task.setvariable variable=SYSTEM_PULLREQUEST_SOURCECOMMITID]$sha" + } + } else { + Write-Host "Not a PR build." + } + condition: eq(variables['Build.Reason'], 'ResourceTrigger') + displayName: Update the PR variables for downstream builds + - pwsh: | $pr = "pr." + $env:SYSTEM_PULLREQUEST_PULLREQUESTNUMBER Write-Host "Preview label: $pr" Write-Host "##vso[task.setvariable variable=PREVIEW_LABEL]$pr" displayName: Use a special preview label for PRs condition: eq(variables['Build.Reason'], 'PullRequest') + - pwsh: | $nightly = "nightly" Write-Host "Preview label: $nightly" Write-Host "##vso[task.setvariable variable=PREVIEW_LABEL]$nightly" displayName: Use a special preview label for scheduled condition: eq(variables['Build.Reason'], 'Schedule') + + - pwsh: | + if ($env:RESOURCES_PIPELINE_SKIASHARP_RUNNAME) { + Write-Host "Working with $env:RESOURCES_PIPELINE_SKIASHARP_RUNNAME" + $match = [regex]::Match("$env:RESOURCES_PIPELINE_SKIASHARP_RUNNAME", '.*\-(.+)\.(\d+)') + $label = $match.Groups[1].Value + Write-Host "Preview label: $label" + Write-Host "##vso[task.setvariable variable=PREVIEW_LABEL]$label" + $buildnumber = $match.Groups[2].Value + Write-Host "Build number: $buildnumber" + Write-Host "##vso[task.setvariable variable=BUILD_NUMBER]$buildnumber" + } + displayName: Override the preview label and build number if this is a secondary build + - pwsh: | $label = "" - if ($env:BUILD_REASON -ne "PullRequest") { - $label = "+" + $env:BUILD_SOURCEBRANCHNAME + if ($env:RESOURCES_PIPELINE_SKIASHARP_RUNNAME) { + $label = $env:RESOURCES_PIPELINE_SKIASHARP_RUNNAME + } else { + if ($env:BUILD_REASON -ne "PullRequest") { + $label = "+" + $env:BUILD_SOURCEBRANCHNAME + } + $label = "$env:SKIASHARP_VERSION-$env:PREVIEW_LABEL.$env:BUILD_NUMBER$label" } - $label = "$env:SKIASHARP_VERSION-$env:PREVIEW_LABEL.$env:BUILD_NUMBER$label" Write-Host "Build label: $label" Write-Host "##vso[build.updatebuildnumber]$label" displayName: Update the build number with a more readable one - condition: ${{ parameters.updateBuild }} \ No newline at end of file + condition: ${{ parameters.updateBuild }} diff --git a/scripts/azure-templates-wasm-matrix.yml b/scripts/azure-templates-wasm-matrix.yml index f2cb0fa818..79de66f58b 100644 --- a/scripts/azure-templates-wasm-matrix.yml +++ b/scripts/azure-templates-wasm-matrix.yml @@ -1,6 +1,7 @@ parameters: artifactName: '' # the name of the artifact to merge this run into buildExternals: '' # the build number to download externals from + isBuildPipeline: false vmImage: '' # the VM image emscripten: [ ] @@ -11,6 +12,7 @@ jobs: name: native_wasm_${{ replace(version, '.', '_') }}_linux displayName: WASM (${{ version }}) buildExternals: ${{ parameters.buildExternals }} + isBuildPipeline: ${{ parameters.isBuildPipeline }} vmImage: ${{ parameters.vmImage }} docker: scripts/Docker/wasm target: externals-wasm