From 82cbf02d7200e2c950d27d6a96d6a28360887dd8 Mon Sep 17 00:00:00 2001 From: Peter Collins Date: Mon, 4 Mar 2024 10:22:15 -0800 Subject: [PATCH 1/4] [ci] Migrate to the 1ES template Context: https://aka.ms/1espt The build pipeline has been updated to extend the 1ES pipeline template, which will keep the pipeline up to date with the latest compliance and security requirements. Most compliance tasks and scans will now run automatically as part of artifact upload steps. API Scan and policheck scans against multiple languages are not supported and will continue to run separately. Conflicts: build-tools/automation/azure-pipelines-nightly.yaml build-tools/automation/azure-pipelines.yaml build-tools/automation/guardian/source.gdnsuppress build-tools/automation/yaml-templates/build-macos.yaml build-tools/automation/yaml-templates/commercial-build.yaml build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml --- .gdn/.gdnsettings | 7 + .gdn/.gdnsuppress | 62 + .gdn/.gitignore | 11 + .gdn/policheck/CHT.gdnsuppress | 26 + .../policheck}/PoliCheck.Exclusions.xml | 0 .gdn/policheck/source.gdnsuppress | 171 +++ .../guardian => .gdn}/tsaoptions-v2.json | 0 .../automation/azure-pipelines-nightly.yaml | 57 +- build-tools/automation/azure-pipelines.yaml | 1222 ++++++++--------- .../automation/guardian/CHT.gdnsuppress | 26 - .../guardian/CredScanSuppressions.json | 41 - .../automation/guardian/source.gdnsuppress | 236 ---- .../yaml-templates/apk-instrumentation.yaml | 35 +- .../yaml-templates/build-linux.yaml | 57 +- .../yaml-templates/build-macos.yaml | 83 +- .../yaml-templates/build-windows.yaml | 27 +- .../yaml-templates/commercial-build.yaml | 63 +- ...bal-tool.yaml => install-dotnet-tool.yaml} | 6 +- .../yaml-templates/plots-to-appinsights.yaml | 62 - .../yaml-templates/publish-artifact.yaml | 21 +- .../yaml-templates/run-designer-tests.yml | 79 -- .../yaml-templates/run-emulator-tests.yaml | 13 +- .../yaml-templates/run-installer.yaml | 40 - .../yaml-templates/run-msbuild-tests.yaml | 24 +- .../yaml-templates/run-nunit-tests.yaml | 74 +- .../run-sliced-nunit-tests.yaml | 10 +- .../yaml-templates/run-xaprepare.yaml | 3 +- .../setup-test-environment.yaml | 32 +- .../yaml-templates/setup-ubuntu.yaml | 23 - .../stage-msbuild-emulator-tests.yaml | 35 +- .../yaml-templates/stage-msbuild-tests.yaml | 4 +- .../yaml-templates/upload-results.yaml | 9 +- .../yaml-templates/use-dot-net.yaml | 1 - .../automation/yaml-templates/variables.yaml | 6 +- .../Utilities/BaseTest.cs | 12 +- 35 files changed, 1112 insertions(+), 1466 deletions(-) create mode 100644 .gdn/.gdnsettings create mode 100644 .gdn/.gdnsuppress create mode 100644 .gdn/.gitignore create mode 100644 .gdn/policheck/CHT.gdnsuppress rename {build-tools/automation/guardian => .gdn/policheck}/PoliCheck.Exclusions.xml (100%) create mode 100644 .gdn/policheck/source.gdnsuppress rename {build-tools/automation/guardian => .gdn}/tsaoptions-v2.json (100%) delete mode 100644 build-tools/automation/guardian/CHT.gdnsuppress delete mode 100644 build-tools/automation/guardian/CredScanSuppressions.json delete mode 100644 build-tools/automation/guardian/source.gdnsuppress rename build-tools/automation/yaml-templates/{install-global-tool.yaml => install-dotnet-tool.yaml} (75%) delete mode 100644 build-tools/automation/yaml-templates/plots-to-appinsights.yaml delete mode 100644 build-tools/automation/yaml-templates/run-designer-tests.yml delete mode 100644 build-tools/automation/yaml-templates/run-installer.yaml delete mode 100644 build-tools/automation/yaml-templates/setup-ubuntu.yaml diff --git a/.gdn/.gdnsettings b/.gdn/.gdnsettings new file mode 100644 index 00000000000..9ebd4133b35 --- /dev/null +++ b/.gdn/.gdnsettings @@ -0,0 +1,7 @@ +{ + "files": { }, + "folders": { }, + "overwriteLogs": true, + "telemetryFlushTimeout": 10, + "variables": { } +} diff --git a/.gdn/.gdnsuppress b/.gdn/.gdnsuppress new file mode 100644 index 00000000000..05025c8dc59 --- /dev/null +++ b/.gdn/.gdnsuppress @@ -0,0 +1,62 @@ +{ + "hydrated": false, + "properties": { + "helpUri": "https://eng.ms/docs/microsoft-security/security/azure-security/cloudai-security-fundamentals-engineering/security-integration/guardian-wiki/microsoft-guardian/general/suppressions", + "hydrationStatus": "This file does not contain identifying data. It is safe to check into your repo. To hydrate this file with identifying data, run `guardian hydrate --help` and follow the guidance." + }, + "version": "1.0.0", + "suppressionSets": { + "default": { + "name": "default", + "createdDate": "2024-02-21 20:58:02Z", + "lastUpdatedDate": "2024-02-22 21:40:38Z" + } + }, + "results": { + "28e1a7a1157c8739dce8ac1bbd828a471e477444ec50d2656d0440948b58a274": { + "signature": "28e1a7a1157c8739dce8ac1bbd828a471e477444ec50d2656d0440948b58a274", + "alternativeSignatures": [], + "memberOf": [ + "default" + ], + "justification": "FillEventHistory+Event API documentation with generic example password.", + "createdDate": "2024-02-21 20:58:02Z" + }, + "0b7cc0b28f27b0eeb2a415f10e62c32675dd2d4edcffe35600eae35f8064004e": { + "signature": "0b7cc0b28f27b0eeb2a415f10e62c32675dd2d4edcffe35600eae35f8064004e", + "alternativeSignatures": [], + "memberOf": [ + "default" + ], + "justification": "Android.Service.Autofill.FillEventHistory+Event API documentation with generic example password.", + "createdDate": "2024-02-21 20:58:02Z" + }, + "e57727a14a28f6fd8f4aa87cd3c4b33401dfea1078ce32fb3cbdf342e8adf63d": { + "signature": "e57727a14a28f6fd8f4aa87cd3c4b33401dfea1078ce32fb3cbdf342e8adf63d", + "alternativeSignatures": [], + "memberOf": [ + "default" + ], + "justification": "Javax.Crypto.ISecretKey API documentation with generic example password.", + "createdDate": "2024-02-21 20:58:02Z" + }, + "15c51590a2e2bb503a7277448e05357f5fd8d4cb2f9b9b7446e41c872cceaac4": { + "signature": "15c51590a2e2bb503a7277448e05357f5fd8d4cb2f9b9b7446e41c872cceaac4", + "alternativeSignatures": [], + "memberOf": [ + "default" + ], + "justification": "Javax.Security.Auth.Callback.PasswordCallback API documentation with generic example password.", + "createdDate": "2024-02-21 20:58:02Z" + }, + "1ccf925aa704efd1035bac38e94d2e629fb5b0d1784d5473e4a52e6d13db16ee": { + "signature": "1ccf925aa704efd1035bac38e94d2e629fb5b0d1784d5473e4a52e6d13db16ee", + "alternativeSignatures": [], + "memberOf": [ + "default" + ], + "justification": "Dummy test.keystore file used for testing.", + "createdDate": "2024-02-21 20:58:02Z" + } + } +} diff --git a/.gdn/.gitignore b/.gdn/.gitignore new file mode 100644 index 00000000000..de1a20ab6d5 --- /dev/null +++ b/.gdn/.gitignore @@ -0,0 +1,11 @@ +## Ignore Guardian internal files +.r/ +rc/ +rs/ +i/ +p/ +c/ +o/ + +## Ignore Guardian Local settings +LocalSettings.gdn.json diff --git a/.gdn/policheck/CHT.gdnsuppress b/.gdn/policheck/CHT.gdnsuppress new file mode 100644 index 00000000000..4a7ab1881eb --- /dev/null +++ b/.gdn/policheck/CHT.gdnsuppress @@ -0,0 +1,26 @@ +{ + "hydrated": false, + "properties": { + "helpUri": "https://eng.ms/docs/microsoft-security/security/azure-security/cloudai-security-fundamentals-engineering/security-integration/guardian-wiki/microsoft-guardian/general/suppressions", + "hydrationStatus": "This file does not contain identifying data. It is safe to check into your repo. To hydrate this file with identifying data, run `guardian hydrate --help` and follow the guidance." + }, + "version": "1.0.0", + "suppressionSets": { + "default": { + "name": "default", + "createdDate": "2023-02-24 00:05:39Z", + "lastUpdatedDate": "2024-02-22 21:40:38Z" + } + }, + "results": { + "04910d714a13bf4523ffa77350f654f52114fa4fa3d760c9f63186d41716c019": { + "signature": "04910d714a13bf4523ffa77350f654f52114fa4fa3d760c9f63186d41716c019", + "alternativeSignatures": [], + "memberOf": [ + "default" + ], + "justification": "Reference to the Android package format APK.", + "createdDate": "2023-02-24 00:05:39Z" + } + } +} diff --git a/build-tools/automation/guardian/PoliCheck.Exclusions.xml b/.gdn/policheck/PoliCheck.Exclusions.xml similarity index 100% rename from build-tools/automation/guardian/PoliCheck.Exclusions.xml rename to .gdn/policheck/PoliCheck.Exclusions.xml diff --git a/.gdn/policheck/source.gdnsuppress b/.gdn/policheck/source.gdnsuppress new file mode 100644 index 00000000000..f73824769dc --- /dev/null +++ b/.gdn/policheck/source.gdnsuppress @@ -0,0 +1,171 @@ +{ + "hydrated": false, + "properties": { + "helpUri": "https://eng.ms/docs/microsoft-security/security/azure-security/cloudai-security-fundamentals-engineering/security-integration/guardian-wiki/microsoft-guardian/general/suppressions", + "hydrationStatus": "This file does not contain identifying data. It is safe to check into your repo. To hydrate this file with identifying data, run `guardian hydrate --help` and follow the guidance." + }, + "version": "1.0.0", + "suppressionSets": { + "default": { + "name": "default", + "createdDate": "2023-02-22 23:55:29Z", + "lastUpdatedDate": "2024-02-22 21:40:38Z" + } + }, + "results": { + "6789cab1bdc97b0cc3ad057b7fdd21d63cdf8bc2679391923803fa240ef81292": { + "signature": "6789cab1bdc97b0cc3ad057b7fdd21d63cdf8bc2679391923803fa240ef81292", + "alternativeSignatures": [ + "b5041e3ec6776af49d6d69148e4db480f366b559299d19ec8ea3e095295b39a8" + ], + "memberOf": [ + "default" + ], + "justification": "Reference to an ISCII term.", + "createdDate": "2023-02-22 23:55:29Z" + }, + "bbaf5f946cb72748567e41f0df5f1bae05550f4ba7381e21ec6b26d6c3ecec9f": { + "signature": "bbaf5f946cb72748567e41f0df5f1bae05550f4ba7381e21ec6b26d6c3ecec9f", + "alternativeSignatures": [ + "739cb5e6ee2409515900652ca668f819f697f23834becece8d2f9f9236723c1b" + ], + "memberOf": [ + "default" + ], + "justification": "Reference to an ISCII term.", + "createdDate": "2023-02-22 23:55:29Z" + }, + "db8916a0f0cdca4082c540921dd362e09a9ff413862ab826308411b76ee35789": { + "signature": "db8916a0f0cdca4082c540921dd362e09a9ff413862ab826308411b76ee35789", + "alternativeSignatures": [ + "a755747462567003e5aa2b7bf01aa72af5143714e427ad043747b1fb54b1c440" + ], + "memberOf": [ + "default" + ], + "justification": "Reference to an Android logging function.", + "createdDate": "2023-02-22 23:55:29Z" + }, + "6d1fb3a483eb491710d6a09ed0b4bab47f13942d0c6fc744e6683614a66604ab": { + "signature": "6d1fb3a483eb491710d6a09ed0b4bab47f13942d0c6fc744e6683614a66604ab", + "alternativeSignatures": [ + "a755747462567003e5aa2b7bf01aa72af5143714e427ad043747b1fb54b1c440" + ], + "memberOf": [ + "default" + ], + "justification": "Reference to an Android logging function.", + "createdDate": "2023-02-22 23:55:29Z" + }, + "b07e75fc8a506b94690dbd06877da06c1228e40e7deda3967f6b882b842f726d": { + "signature": "b07e75fc8a506b94690dbd06877da06c1228e40e7deda3967f6b882b842f726d", + "alternativeSignatures": [ + "a755747462567003e5aa2b7bf01aa72af5143714e427ad043747b1fb54b1c440" + ], + "memberOf": [ + "default" + ], + "justification": "Reference to an Android logging function.", + "createdDate": "2023-02-22 23:55:29Z" + }, + "87d8313310c2dd42021844b95bdcb9121bf10036fea5b212b945e0732a456e5a": { + "signature": "87d8313310c2dd42021844b95bdcb9121bf10036fea5b212b945e0732a456e5a", + "alternativeSignatures": [ + "a755747462567003e5aa2b7bf01aa72af5143714e427ad043747b1fb54b1c440" + ], + "memberOf": [ + "default" + ], + "justification": "Reference to an Android logging function.", + "createdDate": "2023-02-22 23:55:29Z" + }, + "8e5400e0233c8d887ad48bd8a48e8a7be5a579f9eefad521419b6df0828bbfac": { + "signature": "8e5400e0233c8d887ad48bd8a48e8a7be5a579f9eefad521419b6df0828bbfac", + "alternativeSignatures": [ + "a755747462567003e5aa2b7bf01aa72af5143714e427ad043747b1fb54b1c440" + ], + "memberOf": [ + "default" + ], + "justification": "Reference to an Android logging function.", + "createdDate": "2023-02-22 23:55:29Z" + }, + "1b38e026fae90da4ae2fe9151c9c1ebd73c8b3c2c5f072ceae390a3ceec2fb97": { + "signature": "1b38e026fae90da4ae2fe9151c9c1ebd73c8b3c2c5f072ceae390a3ceec2fb97", + "alternativeSignatures": [ + "a755747462567003e5aa2b7bf01aa72af5143714e427ad043747b1fb54b1c440" + ], + "memberOf": [ + "default" + ], + "justification": "Reference to an Android logging function.", + "createdDate": "2023-02-22 23:55:29Z" + }, + "a2b4d032c59a9d1211d218c3cd550cf8febb369941d70284d07d03ebee855bc0": { + "signature": "a2b4d032c59a9d1211d218c3cd550cf8febb369941d70284d07d03ebee855bc0", + "alternativeSignatures": [ + "9feaec8a73b72e0d212c0e18d863e4fe16ff010c5d33cf8d47d8b0f465cc4c5e" + ], + "memberOf": [ + "default" + ], + "justification": "Reference to find first set bit function.", + "createdDate": "2023-02-22 23:55:29Z" + }, + "1c87b45a6044d205dc3f3562f349c238f7cabe22b4609da762df9dc44151e9fb": { + "signature": "1c87b45a6044d205dc3f3562f349c238f7cabe22b4609da762df9dc44151e9fb", + "alternativeSignatures": [ + "9feaec8a73b72e0d212c0e18d863e4fe16ff010c5d33cf8d47d8b0f465cc4c5e" + ], + "memberOf": [ + "default" + ], + "justification": "Reference to find first set bit function.", + "createdDate": "2023-02-22 23:55:29Z" + }, + "a6639098c4785509a4215c9e2fc10f82c06fce461915dc11a00227ddec558845": { + "signature": "a6639098c4785509a4215c9e2fc10f82c06fce461915dc11a00227ddec558845", + "alternativeSignatures": [ + "9feaec8a73b72e0d212c0e18d863e4fe16ff010c5d33cf8d47d8b0f465cc4c5e" + ], + "memberOf": [ + "default" + ], + "justification": "Reference to find first set bit function.", + "createdDate": "2023-02-22 23:55:29Z" + }, + "f94ede7b396cb54934db2084f0879cd31a17ce2584eb01e0bfcd35324a724c31": { + "signature": "f94ede7b396cb54934db2084f0879cd31a17ce2584eb01e0bfcd35324a724c31", + "alternativeSignatures": [ + "9feaec8a73b72e0d212c0e18d863e4fe16ff010c5d33cf8d47d8b0f465cc4c5e" + ], + "memberOf": [ + "default" + ], + "justification": "Reference to find first set bit function.", + "createdDate": "2024-02-22 21:40:38Z" + }, + "b34b42aa41018376a31460c142f2ae910704725d9e9a4470f92b587df682369b": { + "signature": "b34b42aa41018376a31460c142f2ae910704725d9e9a4470f92b587df682369b", + "alternativeSignatures": [ + "3901d031f3ac168bb1a84d06bb234355af514c59a0ed9da325b11a8861ff0b05" + ], + "memberOf": [ + "default" + ], + "justification": "Reference to output from an external tool.", + "createdDate": "2023-02-22 23:55:29Z" + }, + "243e199c7aec22377e0363bdca82384278cc36b0674f35697935fde6c45cfd0e": { + "signature": "243e199c7aec22377e0363bdca82384278cc36b0674f35697935fde6c45cfd0e", + "alternativeSignatures": [ + "cf02f44873b25336e01a1fa294bd858d2ea69ae734f08c6db40d4b83d17ccf76" + ], + "memberOf": [ + "default" + ], + "justification": "Reference to a proper name.", + "createdDate": "2023-10-26 21:20:54Z" + } + } +} diff --git a/build-tools/automation/guardian/tsaoptions-v2.json b/.gdn/tsaoptions-v2.json similarity index 100% rename from build-tools/automation/guardian/tsaoptions-v2.json rename to .gdn/tsaoptions-v2.json diff --git a/build-tools/automation/azure-pipelines-nightly.yaml b/build-tools/automation/azure-pipelines-nightly.yaml index 4370dc175d1..3d5e70518c5 100644 --- a/build-tools/automation/azure-pipelines-nightly.yaml +++ b/build-tools/automation/azure-pipelines-nightly.yaml @@ -27,7 +27,7 @@ resources: # Global variables variables: -- template: yaml-templates/variables.yaml +- template: /build-tools/automation/yaml-templates/variables.yaml stages: - stage: mac_build @@ -52,16 +52,17 @@ stages: - checkout: self submodules: recursive - - template: yaml-templates/commercial-build.yaml + - template: /build-tools/automation/yaml-templates/commercial-build.yaml parameters: makeMSBuildArgs: /p:EnableNativeAnalyzers=true + use1ESTemplate: false - - template: yaml-templates/upload-results.yaml + - template: /build-tools/automation/yaml-templates/upload-results.yaml parameters: xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android artifactName: Build Results - Nightly macOS includeBuildResults: true - + use1ESTemplate: false - stage: test_apk displayName: Test APKs @@ -112,29 +113,26 @@ stages: workspace: clean: all steps: - - template: yaml-templates/setup-test-environment.yaml + - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml parameters: - installLegacyDotNet: false - restoreNUnitConsole: false - updateMono: false xaprepareScenario: EmulatorTestDependencies jdkTestFolder: $(JAVA_HOME_11_X64) - - template: yaml-templates/run-dotnet-preview.yaml + - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml parameters: project: Xamarin.Android.sln arguments: -t:PrepareJavaInterop -c $(XA.Build.Configuration) -m:1 -v:n displayName: prepare java.interop $(XA.Build.Configuration) continueOnError: false - - template: yaml-templates/start-stop-emulator.yaml + - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml parameters: specificImage: true avdApiLevel: $(avdApiLevel) avdAbi: $(avdAbi) avdType: $(avdType) - - template: yaml-templates/apk-instrumentation.yaml + - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml parameters: configuration: $(XA.Build.Configuration) testName: Mono.Android.NET_Tests-$(XA.Build.Configuration)-$(avdApiLevel) @@ -144,26 +142,27 @@ stages: artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab artifactFolder: Mono.Android-$(XA.Build.Configuration)-$(avdApiLevel) - - template: yaml-templates/upload-results.yaml + - template: /build-tools/automation/yaml-templates/upload-results.yaml parameters: configuration: $(XA.Build.Configuration) artifactName: Test Results - Emulator $(avdApiLevel)-$(avdAbi)-$(avdType) - macOS + use1ESTemplate: false - - template: yaml-templates/fail-on-issue.yaml + - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml - - template: yaml-templates/run-emulator-tests.yaml + - template: /build-tools/automation/yaml-templates/run-emulator-tests.yaml parameters: emulatorMSBuildArgs: -p:TestAvdExtraBootArgs=-writable-system jobName: SystemApplicationTests jobTimeout: 120 jdkTestFolder: $HOME/android-toolchain/jdk-17 + use1ESTemplate: false testSteps: - template: run-nunit-tests.yaml parameters: testRunTitle: SystemApplicationTests On Device - macOS testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/$(DotNetStableTargetFramework)/MSBuildDeviceIntegration.dll dotNetTestExtraArgs: --filter "Name=SystemApplicationTests" - testResultsFile: TestResult-SystemApplicationTests-$(XA.Build.Configuration).xml # TimeZoneInfo test jobs @@ -193,12 +192,9 @@ stages: echo "##vso[task.setvariable variable=JAVA_HOME]$HOME/android-toolchain/jdk-17" displayName: set JAVA_HOME to $HOME/android-toolchain/jdk-17 - - template: yaml-templates/setup-test-environment.yaml + - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml parameters: installTestSlicer: true - installLegacyDotNet: false - restoreNUnitConsole: false - updateMono: false xaprepareScenario: EmulatorTestDependencies jdkTestFolder: $HOME/android-toolchain/jdk-17 @@ -207,21 +203,22 @@ stages: artifactName: $(TestAssembliesArtifactName) downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) - - template: yaml-templates/start-stop-emulator.yaml + - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml parameters: emulatorMSBuildArgs: -p:TestAvdShowWindow=true - - template: yaml-templates/run-sliced-nunit-tests.yaml + - template: /build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml parameters: testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/$(DotNetStableTargetFramework)/MSBuildDeviceIntegration.dll testFilter: method == CheckTimeZoneInfoIsCorrectWithSlicer testRunTitle: CheckTimeZoneInfoIsCorrectNode On Device - macOS - - template: yaml-templates/upload-results.yaml + - template: /build-tools/automation/yaml-templates/upload-results.yaml parameters: artifactName: Test Results - TimeZoneInfoTests With Emulator - macOS-$(System.JobPositionInPhase) + use1ESTemplate: false - - template: yaml-templates/fail-on-issue.yaml + - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml # Localization test jobs @@ -251,12 +248,9 @@ stages: echo "##vso[task.setvariable variable=JAVA_HOME]$HOME/android-toolchain/jdk-17" displayName: set JAVA_HOME to $HOME/android-toolchain/jdk-17 - - template: yaml-templates/setup-test-environment.yaml + - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml parameters: installTestSlicer: true - installLegacyDotNet: false - restoreNUnitConsole: false - updateMono: false xaprepareScenario: EmulatorTestDependencies jdkTestFolder: $HOME/android-toolchain/jdk-17 @@ -265,18 +259,19 @@ stages: artifactName: $(TestAssembliesArtifactName) downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) - - template: yaml-templates/start-stop-emulator.yaml + - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml parameters: emulatorMSBuildArgs: -p:TestAvdShowWindow=true - - template: yaml-templates/run-sliced-nunit-tests.yaml + - template: /build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml parameters: testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/$(DotNetStableTargetFramework)/MSBuildDeviceIntegration.dll testFilter: method == CheckLocalizationIsCorrectWithSlicer testRunTitle: CheckLocalizationIsCorrect On Device - macOS - - template: yaml-templates/upload-results.yaml + - template: /build-tools/automation/yaml-templates/upload-results.yaml parameters: artifactName: Test Results - Localization With Emulator - macOS-$(System.JobPositionInPhase) + use1ESTemplate: false - - template: yaml-templates/fail-on-issue.yaml + - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml diff --git a/build-tools/automation/azure-pipelines.yaml b/build-tools/automation/azure-pipelines.yaml index 8d28320f2f4..6abe8d6ebb8 100644 --- a/build-tools/automation/azure-pipelines.yaml +++ b/build-tools/automation/azure-pipelines.yaml @@ -11,6 +11,10 @@ trigger: # External sources, scripts, tests, and yaml template files. resources: repositories: + - repository: 1esPipelines + type: git + name: 1ESPipelineTemplates/1ESPipelineTemplates + ref: refs/tags/release - repository: yaml-templates type: github name: xamarin/yaml-templates @@ -24,11 +28,7 @@ resources: - repository: monodroid type: github name: xamarin/monodroid - endpoint: xamarin - - repository: release_scripts - type: github - name: xamarin/release-scripts - ref: refs/heads/sign-and-notarized + ref: refs/heads/main endpoint: xamarin - repository: maui type: github @@ -37,12 +37,16 @@ resources: endpoint: xamarin parameters: +- name: pushXAPackagesToMaestro + default: true - name: macTestAgentsUseCleanImages # Test agents we do not need to clean up when finished because they are not reused default: true +- name: Skip1ESComplianceTasks + default: false # Global variables variables: -- template: yaml-templates/variables.yaml +- template: /build-tools/automation/yaml-templates/variables.yaml@self - template: templates/common/vs-release-vars.yml@sdk-insertions - ${{ if eq(variables['Build.DefinitionName'], 'Xamarin.Android-Private') }}: - group: AzureDevOps-Artifact-Feeds-Pats @@ -52,657 +56,597 @@ variables: - ${{ if ne(variables['Build.DefinitionName'], 'Xamarin.Android-Private') }}: - name: DotNetFeedCredential value: dnceng-dotnet8 -- ${{ if and(or(eq(variables['Build.DefinitionName'], 'Xamarin.Android'), eq(variables['Build.DefinitionName'], 'Xamarin.Android-Private')), ne(variables['Build.Reason'], 'PullRequest')) }}: - - name: MicroBuildSignType +- name: MicroBuildSignType + ${{ if and(or(eq(variables['Build.DefinitionName'], 'Xamarin.Android'), eq(variables['Build.DefinitionName'], 'Xamarin.Android-Private')), ne(variables['Build.Reason'], 'PullRequest')) }}: value: Real - - name: MacBuildPoolName - value: Azure Pipelines - - name: MacBuildPoolImage - value: internal-macos12 - - name: LinuxBuildPoolName - value: android-devdiv-ubuntu-vmss - - name: LinuxBuildPoolImage - value: '' -- ${{ if or(and(ne(variables['Build.DefinitionName'],'Xamarin.Android'), ne(variables['Build.DefinitionName'], 'Xamarin.Android-Private')), eq(variables['Build.Reason'], 'PullRequest')) }}: - - name: MicroBuildSignType + ${{ else }}: value: Test - - name: MacBuildPoolName - value: VSEng-Xamarin-RedmondMac-Android-Untrusted - - name: MacBuildPoolImage - value: '' - - name: LinuxBuildPoolName - value: android-devdiv-ubuntu-vmss-pr - - name: LinuxBuildPoolImage - value: '' - - name: DisablePipelineConfigDetector - value: true - -# Stage and Job "display names" are shortened because they are combined to form the name of the corresponding GitHub check. -stages: -- template: yaml-templates/build-macos.yaml - -- template: yaml-templates/build-windows.yaml - -# Check - "Xamarin.Android (Linux > Build)" -- template: yaml-templates/build-linux.yaml - -- stage: smoke_tests - displayName: Package Tests - dependsOn: mac_build - jobs: - # Check - "Xamarin.Android (macOS > Tests > APKs .NET)" - - job: mac_apk_tests_net - displayName: macOS > Tests > APKs .NET - pool: - vmImage: $(HostedMacImage) - timeoutInMinutes: 180 - workspace: - clean: all - steps: - - template: yaml-templates/setup-test-environment.yaml - parameters: - provisionClassic: false - installLegacyDotNet: false - restoreNUnitConsole: false - updateMono: false - xaprepareScenario: EmulatorTestDependencies - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: $(TestAssembliesArtifactName) - downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) - - # Set up dependencies to run tests in both debug and release configurations - - task: DotNetCoreCLI@2 - displayName: build Xamarin.Android.Tools.BootstrapTasks.csproj - inputs: - projects: $(System.DefaultWorkingDirectory)/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj - arguments: -c Debug -bl:$(System.DefaultWorkingDirectory)/bin/TestDebug/BootstrapTasks.binlog - - - template: yaml-templates/run-dotnet-preview.yaml - parameters: - project: Xamarin.Android.sln - arguments: >- - -t:PrepareJavaInterop -c Debug --no-restore - -p:DotNetPreviewTool=$(System.DefaultWorkingDirectory)/bin/$(XA.Build.Configuration)/dotnet/dotnet - displayName: prepare java.interop Debug - continueOnError: false - - - template: yaml-templates/run-dotnet-preview.yaml - parameters: - project: Xamarin.Android.sln - arguments: -t:PrepareJavaInterop -c $(XA.Build.Configuration) --no-restore - displayName: prepare java.interop $(XA.Build.Configuration) - continueOnError: false - - template: yaml-templates/start-stop-emulator.yaml +extends: + ${{ if eq(variables['MicroBuildSignType'], 'Real') }}: + template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines + ${{ else }}: + template: v1/1ES.Unofficial.PipelineTemplate.yml@1esPipelines + parameters: + sdl: + ${{ if eq('${{ parameters.Skip1ESComplianceTasks }}', 'true') }}: + enableAllTools: false + binskim: + scanOutputDirectoryOnly: true + codeql: + runSourceLanguagesInSourceAnalysis: true + policheck: + enabled: false + justification: Built in task does not support multi-language scanning + spotBugs: + enabled: false + justification: 'Failing with "Could not successfully find the java tool launcher"' + sourceAnalysisPool: + name: AzurePipelines-EO + image: $(WindowsPoolImage1ESPT) + os: windows + sourceRepositoriesToScan: + include: + - repository: monodroid + exclude: + - repository: yaml-templates + - repository: maui + suppression: + suppressionFile: $(Build.SourcesDirectory)\.gdn\.gdnsuppress + stages: + - template: /build-tools/automation/yaml-templates/build-macos.yaml@self + + - template: /build-tools/automation/yaml-templates/build-windows.yaml@self + + - template: /build-tools/automation/yaml-templates/build-linux.yaml@self + + - stage: smoke_tests + displayName: Package Tests + dependsOn: mac_build + jobs: + # Check - "Xamarin.Android (Package Tests macOS > Tests > APKs .NET)" + - job: mac_apk_tests_net + displayName: macOS > Tests > APKs .NET + pool: + name: Azure Pipelines + vmImage: $(HostedMacImage) + os: macOS + timeoutInMinutes: 180 + workspace: + clean: all + steps: + - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml@self + parameters: + xaprepareScenario: EmulatorTestDependencies - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(XA.Build.Configuration) - testName: Mono.Android.NET_Tests-$(XA.Build.Configuration) - project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj - testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration).xml - artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab - artifactFolder: $(DotNetTargetFramework)-$(XA.Build.Configuration) - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - buildConfiguration: $(XA.Build.Configuration) - configuration: Debug - testName: Mono.Android.NET_Tests-Debug - project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj - testResultsFiles: TestResult-Mono.Android.NET_Tests-Debug.xml - artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.apk - artifactFolder: $(DotNetTargetFramework)-Debug - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(XA.Build.Configuration) - testName: Mono.Android.NET_Tests-NoAab - project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj - testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)NoAab.xml - extraBuildArgs: -p:TestsFlavor=NoAab -p:AndroidPackageFormat=apk - artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.apk - artifactFolder: $(DotNetTargetFramework)-NoAab - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(XA.Build.Configuration) - testName: Mono.Android.NET_Tests-Interpreter - project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj - testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)Interpreter.xml - extraBuildArgs: -p:TestsFlavor=Interpreter -p:UseInterpreter=True - artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab - artifactFolder: $(DotNetTargetFramework)-Interpreter - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(XA.Build.Configuration) - testName: Mono.Android.NET_Tests-NoAot - project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj - testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)NoAot.xml - extraBuildArgs: -p:TestsFlavor=NoAot -p:RunAOTCompilation=false - artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab - artifactFolder: $(DotNetTargetFramework)-NoAot - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(XA.Build.Configuration) - testName: Mono.Android.NET_Tests-AotLlvm - project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj - testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)AotLlvm.xml - extraBuildArgs: -p:TestsFlavor=AotLlvm -p:EnableLLVM=true -p:AndroidEnableProfiledAot=false - artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab - artifactFolder: $(DotNetTargetFramework)-AotLlvm - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(XA.Build.Configuration) - testName: Xamarin.Android.JcwGen_Tests - project: tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj - testResultsFiles: TestResult-Xamarin.Android.JcwGen_Tests-$(XA.Build.Configuration).xml - artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Xamarin.Android.JcwGen_Tests-Signed.apk - artifactFolder: $(DotNetTargetFramework)-Default - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(XA.Build.Configuration) - testName: Xamarin.Android.JcwGen_Tests_FastDev - project: tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj - testResultsFiles: TestResult-Xamarin.Android.JcwGen_Tests-$(XA.Build.Configuration).xml - artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Xamarin.Android.JcwGen_Tests-Signed.apk - artifactFolder: $(DotNetTargetFramework)-FastDev_Assemblies_Dexes - extraBuildArgs: /p:AndroidFastDeploymentType=Assemblies:Dexes - - - template: yaml-templates/run-nunit-tests.yaml - parameters: - testRunTitle: Xamarin.Android.Tools.Aidl-Tests - macOS - testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Tools.Aidl-Tests.dll - testResultsFile: TestResult-Aidl-Tests-macOS-$(XA.Build.Configuration).xml - - - task: ShellScript@2 - displayName: Test dotnet-local.sh - inputs: - scriptPath: dotnet-local.sh - args: build samples/HelloWorld/HelloWorld/HelloWorld.DotNet.csproj - - - ${{ if ne(parameters.macTestAgentsUseCleanImages, true) }}: - - template: yaml-templates/start-stop-emulator.yaml - parameters: - command: stop + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(TestAssembliesArtifactName) + downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) - - template: yaml-templates/upload-results.yaml - parameters: - artifactName: Test Results - APKs .NET $(XA.Build.Configuration) - macOS + # Set up dependencies to run tests in both debug and release configurations + - task: DotNetCoreCLI@2 + displayName: build Xamarin.Android.Tools.BootstrapTasks.csproj + inputs: + projects: $(System.DefaultWorkingDirectory)/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj + arguments: -c Debug -bl:$(System.DefaultWorkingDirectory)/bin/TestDebug/BootstrapTasks.binlog + + - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self + parameters: + project: Xamarin.Android.sln + arguments: >- + -t:PrepareJavaInterop -c Debug --no-restore + -p:DotNetPreviewTool=$(System.DefaultWorkingDirectory)/bin/$(XA.Build.Configuration)/dotnet/dotnet + displayName: prepare java.interop Debug + continueOnError: false + + - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self + parameters: + project: Xamarin.Android.sln + arguments: -t:PrepareJavaInterop -c $(XA.Build.Configuration) --no-restore + displayName: prepare java.interop $(XA.Build.Configuration) + continueOnError: false + + - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml@self + + - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self + parameters: + configuration: $(XA.Build.Configuration) + testName: Mono.Android.NET_Tests-$(XA.Build.Configuration) + project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj + testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration).xml + artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab + artifactFolder: $(DotNetTargetFramework)-$(XA.Build.Configuration) + + - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self + parameters: + buildConfiguration: $(XA.Build.Configuration) + configuration: Debug + testName: Mono.Android.NET_Tests-Debug + project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj + testResultsFiles: TestResult-Mono.Android.NET_Tests-Debug.xml + artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.apk + artifactFolder: $(DotNetTargetFramework)-Debug + + - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self + parameters: + configuration: $(XA.Build.Configuration) + testName: Mono.Android.NET_Tests-NoAab + project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj + testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)NoAab.xml + extraBuildArgs: -p:TestsFlavor=NoAab -p:AndroidPackageFormat=apk + artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.apk + artifactFolder: $(DotNetTargetFramework)-NoAab + + - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self + parameters: + configuration: $(XA.Build.Configuration) + testName: Mono.Android.NET_Tests-Interpreter + project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj + testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)Interpreter.xml + extraBuildArgs: -p:TestsFlavor=Interpreter -p:UseInterpreter=True + artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab + artifactFolder: $(DotNetTargetFramework)-Interpreter + + - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self + parameters: + configuration: $(XA.Build.Configuration) + testName: Mono.Android.NET_Tests-NoAot + project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj + testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)NoAot.xml + extraBuildArgs: -p:TestsFlavor=NoAot -p:RunAOTCompilation=false + artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab + artifactFolder: $(DotNetTargetFramework)-NoAot + + - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self + parameters: + configuration: $(XA.Build.Configuration) + testName: Mono.Android.NET_Tests-AotLlvm + project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj + testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)AotLlvm.xml + extraBuildArgs: -p:TestsFlavor=AotLlvm -p:EnableLLVM=true -p:AndroidEnableProfiledAot=false + artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab + artifactFolder: $(DotNetTargetFramework)-AotLlvm + + - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self + parameters: + configuration: $(XA.Build.Configuration) + testName: Xamarin.Android.JcwGen_Tests + project: tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj + testResultsFiles: TestResult-Xamarin.Android.JcwGen_Tests-$(XA.Build.Configuration).xml + artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Xamarin.Android.JcwGen_Tests-Signed.apk + artifactFolder: $(DotNetTargetFramework)-Default + + - template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self + parameters: + configuration: $(XA.Build.Configuration) + testName: Xamarin.Android.JcwGen_Tests_FastDev + project: tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj + testResultsFiles: TestResult-Xamarin.Android.JcwGen_Tests-$(XA.Build.Configuration).xml + artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Xamarin.Android.JcwGen_Tests-Signed.apk + artifactFolder: $(DotNetTargetFramework)-FastDev_Assemblies_Dexes + extraBuildArgs: /p:AndroidFastDeploymentType=Assemblies:Dexes + + - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml@self + parameters: + testRunTitle: Xamarin.Android.Tools.Aidl-Tests - macOS + testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Tools.Aidl-Tests.dll + + - task: ShellScript@2 + displayName: Test dotnet-local.sh + inputs: + scriptPath: dotnet-local.sh + args: build samples/HelloWorld/HelloWorld/HelloWorld.DotNet.csproj + + - ${{ if ne(parameters.macTestAgentsUseCleanImages, true) }}: + - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml@self + parameters: + command: stop + + - template: /build-tools/automation/yaml-templates/upload-results.yaml@self + parameters: + artifactName: Test Results - APKs .NET $(XA.Build.Configuration) - macOS + + - template: /build-tools/automation/yaml-templates/upload-results.yaml@self + parameters: + artifactName: Test Results - APKs .NET Debug - macOS + configuration: Debug + + - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self + + - stage: linux_tests + displayName: Linux Tests + dependsOn: + - mac_build + - linux_build + jobs: + # Check - "Xamarin.Android (Linux Tests Linux > Tests > MSBuild)" + - job: linux_tests_smoke + displayName: Linux > Tests > MSBuild + pool: + name: MAUI-1ESPT + image: $(LinuxPoolImage1ESPT) + os: linux + timeoutInMinutes: 180 + workspace: + clean: all + steps: + - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml@self - - template: yaml-templates/upload-results.yaml - parameters: - artifactName: Test Results - APKs .NET Debug - macOS - configuration: Debug - - - template: yaml-templates/fail-on-issue.yaml - -- stage: linux_tests - displayName: Linux Tests - dependsOn: - - mac_build - - linux_build - jobs: - # Check - "Xamarin.Android (Linux > Tests > MSBuild)" - - job: linux_tests_smoke - displayName: Linux > Tests > MSBuild - pool: - name: android-devdiv-ubuntu-vmss-pr - timeoutInMinutes: 180 - workspace: - clean: all - steps: - - template: yaml-templates/setup-ubuntu.yaml - - - template: yaml-templates/setup-test-environment.yaml - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: $(TestAssembliesArtifactName) - downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) - - - template: yaml-templates/run-nunit-tests.yaml - parameters: - testRunTitle: Xamarin.Android.Build.Tests - Linux BuildTest - testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll - dotNetTestExtraArgs: --filter "Name = BuildTest" - testResultsFile: TestResult-BuildTest-Linux-$(XA.Build.Configuration).xml + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(TestAssembliesArtifactName) + downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) + + - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml@self + parameters: + testRunTitle: Xamarin.Android.Build.Tests - Linux BuildTest + testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll + dotNetTestExtraArgs: --filter "Name = BuildTest" + + - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml@self + parameters: + testRunTitle: Xamarin.Android.Build.Tests - Linux PackagingTest + testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll + dotNetTestExtraArgs: --filter "Name = PackagingTest" + + - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml@self + parameters: + testRunTitle: Xamarin.Android.Build.Tests - Linux XASdkTests + testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll + dotNetTestExtraArgs: --filter "Name = XASdkTests & Name != XamarinLegacySdk" + + - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml@self + parameters: + testRunTitle: Xamarin.Android.Build.Tests - Linux AndroidDependenciesTests + testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll + dotNetTestExtraArgs: --filter "Name = AndroidDependenciesTests" + + - task: ShellScript@2 + displayName: Test dotnet-local.sh + inputs: + scriptPath: dotnet-local.sh + args: build samples/HelloWorld/HelloWorld/HelloWorld.DotNet.csproj - - template: yaml-templates/run-nunit-tests.yaml - parameters: - testRunTitle: Xamarin.Android.Build.Tests - Linux PackagingTest - testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll - dotNetTestExtraArgs: --filter "Name = PackagingTest" - testResultsFile: TestResult-PackagingTest-Linux-$(XA.Build.Configuration).xml + - template: /build-tools/automation/yaml-templates/upload-results.yaml@self + parameters: + configuration: $(XA.Build.Configuration) + artifactName: Test Results - MSBuild - Linux - - template: yaml-templates/run-nunit-tests.yaml - parameters: - testRunTitle: Xamarin.Android.Build.Tests - Linux XASdkTests - testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll - dotNetTestExtraArgs: --filter "Name = XASdkTests & Name != XamarinLegacySdk" - testResultsFile: TestResult-XASdkTests-Linux-$(XA.Build.Configuration).xml + - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self - - template: yaml-templates/run-nunit-tests.yaml - parameters: - testRunTitle: Xamarin.Android.Build.Tests - Linux AndroidDependenciesTests - testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll - dotNetTestExtraArgs: --filter "Name = AndroidDependenciesTests" - testResultsFile: TestResult-AndroidDependenciesTests-Linux-$(XA.Build.Configuration).xml - - - task: ShellScript@2 - displayName: Test dotnet-local.sh - inputs: - scriptPath: dotnet-local.sh - args: build samples/HelloWorld/HelloWorld/HelloWorld.DotNet.csproj - - - template: yaml-templates/upload-results.yaml + - template: /build-tools/automation/yaml-templates/stage-msbuild-tests.yaml@self + + - template: /build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml@self parameters: - configuration: $(XA.Build.Configuration) - artifactName: Test Results - MSBuild - Linux + usesCleanImages: ${{ parameters.macTestAgentsUseCleanImages }} + + - stage: maui_tests + displayName: MAUI Tests + dependsOn: mac_build + condition: and(eq(dependencies.mac_build.result, 'Succeeded'), eq(variables['RunMAUITestJob'], 'true')) + jobs: + # Check - "Xamarin.Android (MAUI Tests MAUI Integration)" + - job: maui_tests_integration + displayName: MAUI Integration + pool: + name: MAUI-1ESPT + image: $(WindowsPoolImage1ESPT) + os: windows + timeoutInMinutes: 180 + workspace: + clean: all + variables: + BuildVersion: $(Build.BuildId) + steps: + - checkout: maui + clean: true + submodules: recursive + path: s/maui + persistCredentials: true + + - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml@self + parameters: + xaSourcePath: $(Build.SourcesDirectory)/xamarin-android + androidSdkPlatforms: $(DefaultTestSdkPlatforms) + + - task: NuGetAuthenticate@1 + displayName: authenticate with azure artifacts + inputs: + forceReinstallCredentialProvider: true - - template: yaml-templates/fail-on-issue.yaml + - script: | + echo ##vso[task.setvariable variable=JI_JAVA_HOME]%JAVA_HOME_17_X64% + echo ##vso[task.setvariable variable=JAVA_HOME]%JAVA_HOME_17_X64% + displayName: set JI_JAVA_HOME, JAVA_HOME to $(JAVA_HOME_17_X64) -- template: yaml-templates/stage-msbuild-tests.yaml + - script: echo "##vso[task.prependpath]C:\Windows\System32\WindowsPowerShell\v1.0\" + displayName: add powershell to path -- template: yaml-templates/stage-msbuild-emulator-tests.yaml - parameters: - usesCleanImages: ${{ parameters.macTestAgentsUseCleanImages }} - -- stage: maui_tests - displayName: MAUI Tests - dependsOn: mac_build - condition: and(eq(dependencies.mac_build.result, 'Succeeded'), eq(variables['System.PullRequest.TargetBranch'], 'main')) - jobs: - # Check - "Xamarin.Android (MAUI Tests MAUI Integration)" - - job: maui_tests_integration - displayName: MAUI Integration - pool: $(1ESWindowsPool) - timeoutInMinutes: 180 - workspace: - clean: all - variables: - BuildVersion: $(Build.BuildId) - steps: - - checkout: maui - clean: true - submodules: recursive - path: s/maui - persistCredentials: true - - - template: yaml-templates/setup-test-environment.yaml - parameters: - xaSourcePath: $(Build.SourcesDirectory)/xamarin-android - provisionClassic: false - installLegacyDotNet: false - restoreNUnitConsole: false - updateMono: false - androidSdkPlatforms: 23,24,25,26,27,28,29,30,31,32,$(DefaultTestSdkPlatforms) - - - task: NuGetAuthenticate@0 - displayName: authenticate with azure artifacts - inputs: - forceReinstallCredentialProvider: true - - - script: | - echo ##vso[task.setvariable variable=JI_JAVA_HOME]%JAVA_HOME_17_X64% - echo ##vso[task.setvariable variable=JAVA_HOME]%JAVA_HOME_17_X64% - displayName: set JI_JAVA_HOME, JAVA_HOME to $(JAVA_HOME_17_X64) - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: $(NuGetArtifactName) - downloadPath: $(Build.StagingDirectory)/android-packs - - - pwsh: | - $searchPath = Join-Path $(Build.StagingDirectory) android-packs - $wlmanPack = Get-ChildItem $searchPath -Filter *Android*Manifest*.nupkg | Select-Object -First 1 - $dest = Join-Path $searchPath "tmp-wlman" "$($wlmanPack.BaseName)" - Expand-Archive -LiteralPath $wlmanPack -DestinationPath $dest - $wlmanJsonPath = Join-Path $dest "data" "WorkloadManifest.json" - $json = Get-Content $wlmanJsonPath | ConvertFrom-Json -AsHashtable - Write-Host "Setting variable ANDROID_PACK_VERSION = $($json["version"])" - Write-Host "##vso[task.setvariable variable=ANDROID_PACK_VERSION;]$($json["version"])" - displayName: Set ANDROID_PACK_VERSION - - - pwsh: >- - $(Build.SourcesDirectory)/maui/eng/scripts/update-version-props.ps1 - -xmlFileName "$(Build.SourcesDirectory)/maui/eng/Versions.props" - -androidVersion $(ANDROID_PACK_VERSION) - displayName: Update MAUI's Android dependency - - - task: DotNetCoreCLI@2 - displayName: Update Android SDK band in Workloads.csproj - inputs: - projects: $(Build.SourcesDirectory)/xamarin-android/Xamarin.Android.sln - arguments: -t:UpdateMauiWorkloadsProj -c $(XA.Build.Configuration) --no-restore -v:n -bl:$(Build.StagingDirectory)/logs/update-maui-workloadsproj.binlog - - - pwsh: ./build.ps1 --target=dotnet --configuration="$(XA.Build.Configuration)" --nugetsource="$(Build.StagingDirectory)\android-packs" --verbosity=diagnostic - displayName: Install .NET - retryCountOnTaskFailure: 3 - workingDirectory: $(Build.SourcesDirectory)/maui - - - pwsh: ./build.ps1 --target=dotnet-pack --configuration="$(XA.Build.Configuration)" --nugetsource="$(Build.StagingDirectory)\android-packs" --verbosity=diagnostic - displayName: Pack .NET Maui - workingDirectory: $(Build.SourcesDirectory)/maui - - - task: DotNetCoreCLI@2 - displayName: Install MAUI workload packs - retryCountOnTaskFailure: 3 - inputs: - projects: $(Build.SourcesDirectory)/xamarin-android/Xamarin.Android.sln - arguments: -t:InstallMaui -p:MauiUseLocalPacks=true -p:MauiWorkloadToInstall=maui -c $(XA.Build.Configuration) --no-restore -v:n -bl:$(Build.StagingDirectory)/logs/install-maui.binlog - - - template: yaml-templates/run-dotnet-preview.yaml - parameters: - command: new - arguments: maui -o $(Build.StagingDirectory)/MauiTestProj - xaSourcePath: $(Build.SourcesDirectory)/xamarin-android - displayName: Create MAUI template - continueOnError: false + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(NuGetArtifactName) + downloadPath: $(Build.StagingDirectory)/android-packs + + - pwsh: | + $searchPath = Join-Path $(Build.StagingDirectory) android-packs + $wlmanPack = Get-ChildItem $searchPath -Filter *Android*Manifest*.nupkg | Select-Object -First 1 + $dest = Join-Path $searchPath "tmp-wlman" "$($wlmanPack.BaseName)" + Expand-Archive -LiteralPath $wlmanPack -DestinationPath $dest + $wlmanJsonPath = Join-Path $dest "data" "WorkloadManifest.json" + $json = Get-Content $wlmanJsonPath | ConvertFrom-Json -AsHashtable + Write-Host "Setting variable ANDROID_PACK_VERSION = $($json["version"])" + Write-Host "##vso[task.setvariable variable=ANDROID_PACK_VERSION;]$($json["version"])" + displayName: Set ANDROID_PACK_VERSION + + - pwsh: >- + $(Build.SourcesDirectory)/maui/eng/scripts/update-version-props.ps1 + -xmlFileName "$(Build.SourcesDirectory)/maui/eng/Versions.props" + -androidVersion $(ANDROID_PACK_VERSION) + displayName: Update MAUI's Android dependency + + - task: DotNetCoreCLI@2 + displayName: Update Android SDK band in Workloads.csproj + inputs: + projects: $(Build.SourcesDirectory)/xamarin-android/Xamarin.Android.sln + arguments: -t:UpdateMauiWorkloadsProj -c $(XA.Build.Configuration) --no-restore -v:n -bl:$(Build.StagingDirectory)/logs/update-maui-workloadsproj.binlog - - template: yaml-templates/run-dotnet-preview.yaml - parameters: - project: $(Build.StagingDirectory)/MauiTestProj/MauiTestProj.csproj - arguments: >- - -f $(DotNetTargetFramework)-android -c Debug - --configfile $(Build.SourcesDirectory)/maui/NuGet.config - -bl:$(Build.StagingDirectory)/logs/MauiTestProj-Debug.binlog - xaSourcePath: $(Build.SourcesDirectory)/xamarin-android - displayName: Build MAUI template - Debug - - - template: yaml-templates/run-dotnet-preview.yaml - parameters: - project: $(Build.StagingDirectory)/MauiTestProj/MauiTestProj.csproj - arguments: >- - -f $(DotNetTargetFramework)-android -c Release - --configfile $(Build.SourcesDirectory)/maui/NuGet.config - -bl:$(Build.StagingDirectory)/logs/MauiTestProj-Release.binlog - xaSourcePath: $(Build.SourcesDirectory)/xamarin-android - displayName: Build MAUI template - Release - - - task: CopyFiles@2 - displayName: copy build logs - condition: always() - inputs: - Contents: | - $(Build.SourcesDirectory)/maui/artifacts/logs/** - TargetFolder: $(Build.StagingDirectory)/logs - flattenFolders: true - - - template: yaml-templates/publish-artifact.yaml - parameters: - displayName: upload build and test results - artifactName: Test Results - MAUI Integration - targetPath: $(Build.StagingDirectory)/logs - condition: or(ne(variables['Agent.JobStatus'], 'Succeeded'), eq(variables['XA.PublishAllLogs'], 'true')) - - - template: yaml-templates/fail-on-issue.yaml - - -- stage: dotnet_prepare_release - displayName: Prepare .NET Release - dependsOn: - - mac_build - - linux_build - condition: and(eq(dependencies.mac_build.result, 'Succeeded'), eq(dependencies.linux_build.result, 'Succeeded'), eq(variables['MicroBuildSignType'], 'Real')) - jobs: - # Check - "Xamarin.Android (Prepare .NET Release Sign Archives)" - - template: sign-artifacts/jobs/v2.yml@yaml-templates - parameters: - name: sign_net_mac_win - poolName: $(VSEngMicroBuildPool) - artifactName: $(NuGetArtifactName) - signType: $(MicroBuildSignType) - signedArtifactName: nuget-signed - usePipelineArtifactTasks: true - - # Check - "Xamarin.Android (Prepare .NET Release Sign Linux Archive)" - - template: sign-artifacts/jobs/v2.yml@yaml-templates - parameters: - name: sign_net_linux - displayName: Sign Linux Archive - poolName: $(VSEngMicroBuildPool) - artifactName: $(LinuxNuGetArtifactName) - signType: $(MicroBuildSignType) - signedArtifactName: nuget-linux-signed - usePipelineArtifactTasks: true - - # Check - "Xamarin.Android (Prepare .NET Release Convert NuGet to MSI)" - - template: nuget-msi-convert/job/v3.yml@yaml-templates - parameters: - yamlResourceName: yaml-templates - dependsOn: sign_net_mac_win - artifactName: nuget-signed - artifactPatterns: | - !*Darwin* - propsArtifactName: $(NuGetArtifactName) - signType: $(MicroBuildSignType) - postConvertSteps: - - task: DownloadPipelineArtifact@2 - inputs: + - pwsh: ./build.ps1 --target=dotnet --configuration="$(XA.Build.Configuration)" --nugetsource="$(Build.StagingDirectory)\android-packs" --verbosity=diagnostic + displayName: Install .NET + retryCountOnTaskFailure: 3 + workingDirectory: $(Build.SourcesDirectory)/maui + + - pwsh: ./build.ps1 --target=dotnet-pack --configuration="$(XA.Build.Configuration)" --nugetsource="$(Build.StagingDirectory)\android-packs" --verbosity=diagnostic + displayName: Pack .NET Maui + workingDirectory: $(Build.SourcesDirectory)/maui + + - task: DotNetCoreCLI@2 + displayName: Install MAUI workload packs + retryCountOnTaskFailure: 3 + inputs: + projects: $(Build.SourcesDirectory)/xamarin-android/Xamarin.Android.sln + arguments: -t:InstallMaui -p:MauiUseLocalPacks=true -p:MauiWorkloadToInstall=maui -c $(XA.Build.Configuration) --no-restore -v:n -bl:$(Build.StagingDirectory)/logs/install-maui.binlog + + - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self + parameters: + command: new + arguments: maui -o $(Build.StagingDirectory)/MauiTestProj + xaSourcePath: $(Build.SourcesDirectory)/xamarin-android + displayName: Create MAUI template + continueOnError: false + + - powershell: | + $project = '$(Build.StagingDirectory)/MauiTestProj/MauiTestProj.csproj' + [xml] $xml = Get-Content $project + $node = $xml.SelectSingleNode('/Project/PropertyGroup/TargetFrameworks') + $node.InnerText = '$(DotNetTargetFramework)-android' + $xml.Save($project) + displayName: set TargetFrameworks to Android-only + + - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self + parameters: + project: $(Build.StagingDirectory)/MauiTestProj/MauiTestProj.csproj + arguments: >- + -f $(DotNetTargetFramework)-android -c Debug + --configfile $(Build.SourcesDirectory)/maui/NuGet.config + -bl:$(Build.StagingDirectory)/logs/MauiTestProj-Debug.binlog + xaSourcePath: $(Build.SourcesDirectory)/xamarin-android + displayName: Build MAUI template - Debug + + - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self + parameters: + project: $(Build.StagingDirectory)/MauiTestProj/MauiTestProj.csproj + arguments: >- + -f $(DotNetTargetFramework)-android -c Release + --configfile $(Build.SourcesDirectory)/maui/NuGet.config + -bl:$(Build.StagingDirectory)/logs/MauiTestProj-Release.binlog + xaSourcePath: $(Build.SourcesDirectory)/xamarin-android + displayName: Build MAUI template - Release + + - task: CopyFiles@2 + displayName: copy build logs + condition: always() + inputs: + Contents: | + $(Build.SourcesDirectory)/maui/artifacts/logs/** + TargetFolder: $(Build.StagingDirectory)/logs + flattenFolders: true + + - template: /build-tools/automation/yaml-templates/publish-artifact.yaml@self + parameters: + displayName: upload build and test results + artifactName: Test Results - MAUI Integration + targetPath: $(Build.StagingDirectory)/logs + condition: or(ne(variables['Agent.JobStatus'], 'Succeeded'), eq(variables['XA.PublishAllLogs'], 'true')) + + - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self + + + - stage: dotnet_prepare_release + displayName: Prepare .NET Release + dependsOn: + - mac_build + - linux_build + condition: and(eq(dependencies.mac_build.result, 'Succeeded'), eq(dependencies.linux_build.result, 'Succeeded'), eq(variables['MicroBuildSignType'], 'Real')) + jobs: + # Check - "Xamarin.Android (Prepare .NET Release Sign Archives)" + - template: sign-artifacts/jobs/v2.yml@yaml-templates + parameters: + name: sign_net_mac_win + poolName: $(VSEngMicroBuildPool) artifactName: $(NuGetArtifactName) - downloadPath: $(Build.StagingDirectory)\sign-verify - patterns: | - **/SignVerifyIgnore.txt - - - task: MicroBuildCodesignVerify@3 - displayName: verify signed msi content - inputs: - TargetFolders: | - $(Build.ArtifactStagingDirectory)\bin\manifests - $(Build.ArtifactStagingDirectory)\bin\manifests-multitarget - ExcludeSNVerify: true - ApprovalListPathForCerts: $(Build.StagingDirectory)\sign-verify\SignVerifyIgnore.txt - - # Check - "Xamarin.Android (Prepare .NET Release Push Internal)" - - job: push_signed_nugets - displayName: Push Internal - dependsOn: - - nuget_convert - - sign_net_linux - condition: and(eq(dependencies.nuget_convert.result, 'Succeeded'), eq(dependencies.sign_net_linux.result, 'Succeeded')) - timeoutInMinutes: 60 - pool: $(VSEngMicroBuildPool) - workspace: - clean: all - variables: - - ${{ if eq(variables['MicroBuildSignType'], 'Real') }}: - - group: Publish-Build-Assets - steps: - - checkout: self - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: nuget-signed - downloadPath: $(Build.StagingDirectory)\nuget-signed - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: nuget-linux-signed - downloadPath: $(Build.StagingDirectory)\nuget-signed - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: vs-msi-nugets - downloadPath: $(Build.StagingDirectory)\nuget-signed - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: $(WindowsToolchainPdbArtifactName) - downloadPath: $(Build.StagingDirectory)\nuget-signed - - - task: NuGetCommand@2 - displayName: push nupkgs - inputs: - command: push - packagesToPush: $(Build.StagingDirectory)\nuget-signed\*.nupkg - nuGetFeedType: external - publishFeedCredentials: $(DotNetFeedCredential) - condition: and(succeeded(), eq(variables['PushXAPackages'], 'true')) - - - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions - parameters: - githubToken: $(GitHub.Token) - githubContext: $(NupkgCommitStatusName) - blobName: $(NupkgCommitStatusName) - packagePrefix: xamarin-android - artifactsPath: $(Build.StagingDirectory)\nuget-signed - yamlResourceName: yaml-templates - - - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions - parameters: - githubToken: $(GitHub.Token) - githubContext: $(VSDropCommitStatusName) - blobName: $(VSDropCommitStatusName) - packagePrefix: xamarin-android - artifactsPath: $(Build.StagingDirectory)\$(VSDropCommitStatusName) - yamlResourceName: yaml-templates - downloadSteps: + signType: $(MicroBuildSignType) + signedArtifactName: nuget-signed + usePipelineArtifactTasks: true + use1ESTemplate: true + + # Check - "Xamarin.Android (Prepare .NET Release Sign Linux Archive)" + - template: sign-artifacts/jobs/v2.yml@yaml-templates + parameters: + name: sign_net_linux + displayName: Sign Linux Archive + poolName: $(VSEngMicroBuildPool) + artifactName: $(LinuxNuGetArtifactName) + signType: $(MicroBuildSignType) + signedArtifactName: nuget-linux-signed + usePipelineArtifactTasks: true + use1ESTemplate: true + + # Check - "Xamarin.Android (Prepare .NET Release Convert NuGet to MSI)" + - template: nuget-msi-convert/job/v3.yml@yaml-templates + parameters: + yamlResourceName: yaml-templates + dependsOn: sign_net_mac_win + artifactName: nuget-signed + artifactPatterns: | + !*Darwin* + propsArtifactName: $(NuGetArtifactName) + signType: $(MicroBuildSignType) + use1ESTemplate: true + postConvertSteps: + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(NuGetArtifactName) + downloadPath: $(Build.StagingDirectory)\sign-verify + patterns: | + **/SignVerifyIgnore.txt + + - task: MicroBuildCodesignVerify@3 + displayName: verify signed msi content + inputs: + TargetFolders: | + $(Build.ArtifactStagingDirectory)\bin\manifests + $(Build.ArtifactStagingDirectory)\bin\manifests-multitarget + ExcludeSNVerify: true + ApprovalListPathForCerts: $(Build.StagingDirectory)\sign-verify\SignVerifyIgnore.txt + + # Check - "Xamarin.Android (Prepare .NET Release Push Internal)" + - job: push_signed_nugets + displayName: Push Internal + dependsOn: + - nuget_convert + - sign_net_linux + condition: and(eq(dependencies.nuget_convert.result, 'Succeeded'), eq(dependencies.sign_net_linux.result, 'Succeeded')) + timeoutInMinutes: 60 + pool: $(VSEngMicroBuildPool) + workspace: + clean: all + variables: + - ${{ if eq(variables['MicroBuildSignType'], 'Real') }}: + - group: Publish-Build-Assets + templateContext: + outputs: + - output: nuget + condition: and(succeeded(), eq('${{ parameters.pushXAPackagesToMaestro }}', 'true')) + useDotNetTask: false # The default is false to use the NuGetCommand task. Set to true to use the DotNetCoreCLI task to publish packages. + packagesToPush: $(Build.StagingDirectory)\nuget-signed\*.nupkg + packageParentPath: $(Build.StagingDirectory)\nuget-signed + nuGetFeedType: external + publishFeedCredentials: $(DotNetFeedCredential) + steps: + - checkout: self + - task: DownloadPipelineArtifact@2 inputs: - artifactName: vsdrop-signed - downloadPath: $(Build.StagingDirectory)\$(VSDropCommitStatusName) + artifactName: nuget-signed + downloadPath: $(Build.StagingDirectory)\nuget-signed - - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions - parameters: - githubToken: $(GitHub.Token) - githubContext: $(MultiTargetVSDropCommitStatusName) - blobName: $(MultiTargetVSDropCommitStatusName) - packagePrefix: xamarin-android - artifactsPath: $(Build.StagingDirectory)\$(MultiTargetVSDropCommitStatusName) - yamlResourceName: yaml-templates - downloadSteps: - task: DownloadPipelineArtifact@2 inputs: - artifactName: vsdrop-multitarget-signed - downloadPath: $(Build.StagingDirectory)\$(MultiTargetVSDropCommitStatusName) - - - powershell: >- - & dotnet build -v:n -c $(XA.Build.Configuration) - -t:PushManifestToBuildAssetRegistry - -p:BuildAssetRegistryToken=$(MaestroAccessToken) - -p:OutputPath=$(Build.StagingDirectory)\nuget-signed\ - $(System.DefaultWorkingDirectory)\build-tools\create-packs\Microsoft.Android.Sdk.proj - -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\push-bar-manifest.binlog - displayName: generate and publish BAR manifest - condition: and(succeeded(), eq(variables['PushXAPackageInfoToMaestro'], 'true')) - - - powershell: | - $versionEndpoint = 'https://maestro-prod.westus2.cloudapp.azure.com/api/assets/darc-version?api-version=2019-01-16' - $darcVersion = $(Invoke-WebRequest -Uri $versionEndpoint -UseBasicParsing).Content - $arcadeServicesSource = 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' - & dotnet tool update microsoft.dotnet.darc --version "$darcVersion" --add-source "$arcadeServicesSource" --tool-path $(Agent.ToolsDirectory)\darc -v n - & $(Agent.ToolsDirectory)\darc\darc add-build-to-channel --default-channels --id $(BARBuildId) --publishing-infra-version 3 --skip-assets-publishing --password $(MaestroAccessToken) --azdev-pat $(publishing-dnceng-devdiv-code-r-build-re) - displayName: add build to default darc channel - condition: and(succeeded(), eq(variables['PushXAPackageInfoToMaestro'], 'true')) - - - template: yaml-templates\upload-results.yaml - parameters: - xaSourcePath: $(System.DefaultWorkingDirectory) - artifactName: Prepare Release - Push Internal - includeBuildResults: true - - -- stage: post_build - displayName: Post Build - dependsOn: - - dotnet_prepare_release - condition: and(eq(variables['MicroBuildSignType'], 'Real'), eq(dependencies.dotnet_prepare_release.result, 'Succeeded')) - jobs: - - job: sbom - displayName: Generate SBOM - timeoutInMinutes: 60 - pool: - name: AzurePipelines-EO - demands: - - ImageOverride -equals AzurePipelinesWindows2022compliant - variables: - Packaging.EnableSBOMSigning: true - workspace: - clean: all - steps: - - checkout: self - submodules: recursive - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: nuget-signed - downloadPath: $(Build.StagingDirectory)\packages - patterns: '*.nupkg' - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: nuget-linux-signed - downloadPath: $(Build.StagingDirectory)\packages - patterns: '*.nupkg' - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: $(WindowsToolchainPdbArtifactName) - downloadPath: $(Build.StagingDirectory)\packages - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: vs-msi-nugets - downloadPath: $(Build.StagingDirectory)\packages - patterns: '*.nupkg' - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: vsdrop-signed - downloadPath: $(Build.StagingDirectory)\packages - patterns: '*.msi' - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: vsdrop-multitarget-signed - downloadPath: $(Build.StagingDirectory)\packages - patterns: '*.msi' - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: sbom-components-macos - downloadPath: $(Build.StagingDirectory)\sbom\components-macos - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: sbom-components-linux - downloadPath: $(Build.StagingDirectory)\sbom\components-linux - - - template: compliance/sbom/scan.v1.yml@yaml-templates + artifactName: nuget-linux-signed + downloadPath: $(Build.StagingDirectory)\nuget-signed + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: vs-msi-nugets + downloadPath: $(Build.StagingDirectory)\nuget-signed + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(WindowsToolchainPdbArtifactName) + downloadPath: $(Build.StagingDirectory)\nuget-signed + + - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions + parameters: + githubToken: $(GitHub.Token) + githubContext: $(NupkgCommitStatusName) + blobName: $(NupkgCommitStatusName) + packagePrefix: xamarin-android + artifactsPath: $(Build.StagingDirectory)\nuget-signed + yamlResourceName: yaml-templates + + - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions + parameters: + githubToken: $(GitHub.Token) + githubContext: $(VSDropCommitStatusName) + blobName: $(VSDropCommitStatusName) + packagePrefix: xamarin-android + artifactsPath: $(Build.StagingDirectory)\$(VSDropCommitStatusName) + yamlResourceName: yaml-templates + downloadSteps: + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: vsdrop-signed + downloadPath: $(Build.StagingDirectory)\$(VSDropCommitStatusName) + + - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions + parameters: + githubToken: $(GitHub.Token) + githubContext: $(MultiTargetVSDropCommitStatusName) + blobName: $(MultiTargetVSDropCommitStatusName) + packagePrefix: xamarin-android + artifactsPath: $(Build.StagingDirectory)\$(MultiTargetVSDropCommitStatusName) + yamlResourceName: yaml-templates + downloadSteps: + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: vsdrop-multitarget-signed + downloadPath: $(Build.StagingDirectory)\$(MultiTargetVSDropCommitStatusName) + + - powershell: >- + & dotnet build -v:n -c $(XA.Build.Configuration) + -t:PushManifestToBuildAssetRegistry + -p:BuildAssetRegistryToken=$(MaestroAccessToken) + -p:OutputPath=$(Build.StagingDirectory)\nuget-signed\ + $(System.DefaultWorkingDirectory)\build-tools\create-packs\Microsoft.Android.Sdk.proj + -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\push-bar-manifest.binlog + displayName: generate and publish BAR manifest + condition: and(succeeded(), eq('${{ parameters.pushXAPackagesToMaestro }}', 'true')) + + - powershell: | + $versionEndpoint = 'https://maestro-prod.westus2.cloudapp.azure.com/api/assets/darc-version?api-version=2019-01-16' + $darcVersion = $(Invoke-WebRequest -Uri $versionEndpoint -UseBasicParsing).Content + $arcadeServicesSource = 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' + & dotnet tool update microsoft.dotnet.darc --version "$darcVersion" --add-source "$arcadeServicesSource" --tool-path $(Agent.ToolsDirectory)\darc -v n + & $(Agent.ToolsDirectory)\darc\darc add-build-to-channel --default-channels --id $(BARBuildId) --publishing-infra-version 3 --skip-assets-publishing --password $(MaestroAccessToken) --azdev-pat $(publishing-dnceng-devdiv-code-r-build-re) + displayName: add build to default darc channel + condition: and(succeeded(), eq('${{ parameters.pushXAPackagesToMaestro }}', 'true')) + + - template: build-tools\automation\yaml-templates\upload-results.yaml@self + parameters: + xaSourcePath: $(System.DefaultWorkingDirectory) + artifactName: Prepare Release - Push Internal + includeBuildResults: true + + # Check - "Xamarin.Android (PoliCheck PoliCheck $(Language))" + - template: security/policheck/v3.yml@yaml-templates parameters: - dropDirectory: $(Build.StagingDirectory)\packages - componentsDirectory: $(Build.StagingDirectory)\sbom - manifestDirectory: $(Build.StagingDirectory)\sbom - packageName: .NET Android - packageVersionRegex: '(?i)^Microsoft.*\.(?\d+\.\d+\.\d+(-.*)?\.\d+).nupkg$' - -# Check - "Xamarin.Android (Compliance)" -- template: security/full/v0.yml@yaml-templates - parameters: - stageDependsOn: [] - credScanSuppressionFile: $(Build.SourcesDirectory)\build-tools\automation\guardian\CredScanSuppressions.json - sourceGdnSuppressionFile: $(Build.SourcesDirectory)\build-tools\automation\guardian\source.gdnsuppress - tsaConfigFile: $(Build.SourcesDirectory)\build-tools\automation\guardian\tsaoptions-v2.json - policheckLocScanEnabled: true - policheckExclusionFilesFolder: $(Build.SourcesDirectory)\build-tools\automation\guardian - policheckGdnSuppressionFilesFolder: $(Build.SourcesDirectory)\build-tools\automation\guardian - policheckChsScanFolder: $(Build.SourcesDirectory)\Localize\loc\zh-Hans - policheckChtScanFolder: $(Build.SourcesDirectory)\Localize\loc\zh-Hant - policheckCsyScanFolder: $(Build.SourcesDirectory)\Localize\loc\cs - policheckDeuScanFolder: $(Build.SourcesDirectory)\Localize\loc\de - policheckEsnScanFolder: $(Build.SourcesDirectory)\Localize\loc\es - policheckFraScanFolder: $(Build.SourcesDirectory)\Localize\loc\fr - policheckItaScanFolder: $(Build.SourcesDirectory)\Localize\loc\it - policheckJpnScanFolder: $(Build.SourcesDirectory)\Localize\loc\ja - policheckKorScanFolder: $(Build.SourcesDirectory)\Localize\loc\ko - policheckPlkScanFolder: $(Build.SourcesDirectory)\Localize\loc\pl - policheckPtbScanFolder: $(Build.SourcesDirectory)\Localize\loc\pt-BR - policheckRusScanFolder: $(Build.SourcesDirectory)\Localize\loc\ru - policheckTrkScanFolder: $(Build.SourcesDirectory)\Localize\loc\tr + windowsImageOverride: $(WindowsPoolImage1ESPT) + stageDependsOn: [] + tsaConfigFile: $(Build.SourcesDirectory)\.gdn\tsaoptions-v2.json + policheckLocScanEnabled: true + policheckExclusionFilesFolder: $(Build.SourcesDirectory)\.gdn\policheck + policheckGdnSuppressionFilesFolder: $(Build.SourcesDirectory)\.gdn\policheck + policheckChsScanFolder: $(Build.SourcesDirectory)\Localize\loc\zh-Hans + policheckChtScanFolder: $(Build.SourcesDirectory)\Localize\loc\zh-Hant + policheckCsyScanFolder: $(Build.SourcesDirectory)\Localize\loc\cs + policheckDeuScanFolder: $(Build.SourcesDirectory)\Localize\loc\de + policheckEsnScanFolder: $(Build.SourcesDirectory)\Localize\loc\es + policheckFraScanFolder: $(Build.SourcesDirectory)\Localize\loc\fr + policheckItaScanFolder: $(Build.SourcesDirectory)\Localize\loc\it + policheckJpnScanFolder: $(Build.SourcesDirectory)\Localize\loc\ja + policheckKorScanFolder: $(Build.SourcesDirectory)\Localize\loc\ko + policheckPlkScanFolder: $(Build.SourcesDirectory)\Localize\loc\pl + policheckPtbScanFolder: $(Build.SourcesDirectory)\Localize\loc\pt-BR + policheckRusScanFolder: $(Build.SourcesDirectory)\Localize\loc\ru + policheckTrkScanFolder: $(Build.SourcesDirectory)\Localize\loc\tr diff --git a/build-tools/automation/guardian/CHT.gdnsuppress b/build-tools/automation/guardian/CHT.gdnsuppress deleted file mode 100644 index 4396a9a378a..00000000000 --- a/build-tools/automation/guardian/CHT.gdnsuppress +++ /dev/null @@ -1,26 +0,0 @@ -{ - "version": "latest", - "suppressionSets": { - "default": { - "name": "default", - "createdDate": "2023-02-24 00:05:39Z", - "lastUpdatedDate": "2023-02-24 00:05:39Z" - } - }, - "results": { - "04910d714a13bf4523ffa77350f654f52114fa4fa3d760c9f63186d41716c019": { - "signature": "04910d714a13bf4523ffa77350f654f52114fa4fa3d760c9f63186d41716c019", - "alternativeSignatures": [], - "target": "Localize/loc/zh-Hant/src/Xamarin.Android.Build.Tasks/Properties/Resources.resx.lcl", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "64550", - "justification": "Reference to the Android package format APK.", - "createdDate": "2023-02-24 00:05:39Z", - "expirationDate": null, - "type": null - } - } -} diff --git a/build-tools/automation/guardian/CredScanSuppressions.json b/build-tools/automation/guardian/CredScanSuppressions.json deleted file mode 100644 index d484f12ded2..00000000000 --- a/build-tools/automation/guardian/CredScanSuppressions.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "tool": "Credential Scanner", - "suppressions": [ - { - "file": "\\src\\Xamarin.Android.Build.Tasks\\Tests\\Xamarin.ProjectTools\\Resources\\Base\\test.keystore", - "_justification": "Dummy keystore file used for testing." - }, - { - "file": "tests\\MSBuildDeviceIntegration\\Tests\\InstallTests.cs", - "_justification": "Password of the dummy keystore file used only for testing." - }, - { - "file": "external\\android-api-docs\\docs\\Mono.Android\\en\\Android.Webkit\\HttpAuthHandler.xml", - "_justification": "Android API documentation, does not contain a password." - }, - { - "file": "external\\android-api-docs\\docs\\Mono.Android\\en\\Android.Webkit\\WebViewDatabase.xml", - "_justification": "Android API documentation, does not contain a password." - }, - { - "file": "external\\android-api-docs\\docs\\Mono.Android\\en\\Java.Security\\KeyStore+PasswordProtection.xml", - "_justification": "Android API documentation, does not contain a password." - }, - { - "file": "external\\android-api-docs\\docs\\Mono.Android\\en\\Javax.Security.Auth.Callback\\PasswordCallback.xml", - "_justification": "Android API documentation, does not contain a password." - }, - { - "file": "external\\android-api-docs\\docs\\Mono.Android\\en\\Javax.Crypto\\ISecretKey.xml", - "_justification": "Android API documentation, does not contain a password." - }, - { - "file": "external\\android-api-docs\\docs\\Mono.Android\\en\\Javax.Crypto\\KeyAgreementSpi.xml", - "_justification": "Android API documentation, does not contain a password." - }, - { - "file": "external\\android-api-docs\\docs\\Mono.Android\\en\\Javax.Crypto.Interfaces\\IPBEKey.xml", - "_justification": "Android API documentation, does not contain a password." - } - ] -} diff --git a/build-tools/automation/guardian/source.gdnsuppress b/build-tools/automation/guardian/source.gdnsuppress deleted file mode 100644 index 7d42cdcacc6..00000000000 --- a/build-tools/automation/guardian/source.gdnsuppress +++ /dev/null @@ -1,236 +0,0 @@ -{ - "version": "latest", - "suppressionSets": { - "default": { - "name": "default", - "createdDate": "2023-02-22 23:55:29Z", - "lastUpdatedDate": "2023-05-04 13:54:18Z" - } - }, - "results": { - "5a0a8690d8a06dfdbf6002c67fa64a60a94f3fc77a594034cce20382e88002aa": { - "signature": "5a0a8690d8a06dfdbf6002c67fa64a60a94f3fc77a594034cce20382e88002aa", - "alternativeSignatures": [], - "target": "src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "79459", - "justification": "Reference to an external source file.", - "createdDate": "2023-02-22 23:55:29Z", - "expirationDate": null, - "type": null - }, - "1b319055b8e507b220d0dab341e67e20f49632fd1844a08a4fcc6d4493930ac5": { - "signature": "1b319055b8e507b220d0dab341e67e20f49632fd1844a08a4fcc6d4493930ac5", - "alternativeSignatures": [], - "target": "src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "79459", - "justification": "Reference to an external source file.", - "createdDate": "2023-02-22 23:55:29Z", - "expirationDate": null, - "type": null - }, - "6789cab1bdc97b0cc3ad057b7fdd21d63cdf8bc2679391923803fa240ef81292": { - "signature": "6789cab1bdc97b0cc3ad057b7fdd21d63cdf8bc2679391923803fa240ef81292", - "alternativeSignatures": [], - "target": "Documentation/guides/building-apps/build-properties.md", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "185843", - "justification": "Reference to an ISCII term.", - "createdDate": "2023-02-22 23:55:29Z", - "expirationDate": null, - "type": null - }, - "bbaf5f946cb72748567e41f0df5f1bae05550f4ba7381e21ec6b26d6c3ecec9f": { - "signature": "bbaf5f946cb72748567e41f0df5f1bae05550f4ba7381e21ec6b26d6c3ecec9f", - "alternativeSignatures": [], - "target": "Documentation/guides/building-apps/build-properties.md", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "185837", - "justification": "Reference to an ISCII term.", - "createdDate": "2023-02-22 23:55:29Z", - "expirationDate": null, - "type": null - }, - "db8916a0f0cdca4082c540921dd362e09a9ff413862ab826308411b76ee35789": { - "signature": "db8916a0f0cdca4082c540921dd362e09a9ff413862ab826308411b76ee35789", - "alternativeSignatures": [], - "target": "src/Mono.Android/Android.Util/Log.cs", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "80418", - "justification": "Reference to an Android logging function.", - "createdDate": "2023-02-22 23:55:29Z", - "expirationDate": null, - "type": null - }, - "6d1fb3a483eb491710d6a09ed0b4bab47f13942d0c6fc744e6683614a66604ab": { - "signature": "6d1fb3a483eb491710d6a09ed0b4bab47f13942d0c6fc744e6683614a66604ab", - "alternativeSignatures": [], - "target": "src/Mono.Android/Android.Util/Log.cs", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "80418", - "justification": "Reference to an Android logging function.", - "createdDate": "2023-02-22 23:55:29Z", - "expirationDate": null, - "type": null - }, - "b07e75fc8a506b94690dbd06877da06c1228e40e7deda3967f6b882b842f726d": { - "signature": "b07e75fc8a506b94690dbd06877da06c1228e40e7deda3967f6b882b842f726d", - "alternativeSignatures": [], - "target": "src/Mono.Android/Android.Util/Log.cs", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "80418", - "justification": "Reference to an Android logging function.", - "createdDate": "2023-02-22 23:55:29Z", - "expirationDate": null, - "type": null - }, - "87d8313310c2dd42021844b95bdcb9121bf10036fea5b212b945e0732a456e5a": { - "signature": "87d8313310c2dd42021844b95bdcb9121bf10036fea5b212b945e0732a456e5a", - "alternativeSignatures": [], - "target": "src/Mono.Android/Android.Util/Log.cs", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "80418", - "justification": "Reference to an Android logging function.", - "createdDate": "2023-02-22 23:55:29Z", - "expirationDate": null, - "type": null - }, - "8e5400e0233c8d887ad48bd8a48e8a7be5a579f9eefad521419b6df0828bbfac": { - "signature": "8e5400e0233c8d887ad48bd8a48e8a7be5a579f9eefad521419b6df0828bbfac", - "alternativeSignatures": [], - "target": "src/Mono.Android/Android.Util/Log.cs", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "80418", - "justification": "Reference to an Android logging function.", - "createdDate": "2023-02-22 23:55:29Z", - "expirationDate": null, - "type": null - }, - "1b38e026fae90da4ae2fe9151c9c1ebd73c8b3c2c5f072ceae390a3ceec2fb97": { - "signature": "1b38e026fae90da4ae2fe9151c9c1ebd73c8b3c2c5f072ceae390a3ceec2fb97", - "alternativeSignatures": [], - "target": "src/Mono.Android/Android.Util/Log.cs", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "80418", - "justification": "Reference to an Android logging function.", - "createdDate": "2023-02-22 23:55:29Z", - "expirationDate": null, - "type": null - }, - "a2b4d032c59a9d1211d218c3cd550cf8febb369941d70284d07d03ebee855bc0": { - "signature": "a2b4d032c59a9d1211d218c3cd550cf8febb369941d70284d07d03ebee855bc0", - "alternativeSignatures": [], - "target": "src/monodroid/jni/logger.cc", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "79668", - "justification": "Reference to find first set bit function.", - "createdDate": "2023-02-22 23:55:29Z", - "expirationDate": null, - "type": null - }, - "1c87b45a6044d205dc3f3562f349c238f7cabe22b4609da762df9dc44151e9fb": { - "signature": "1c87b45a6044d205dc3f3562f349c238f7cabe22b4609da762df9dc44151e9fb", - "alternativeSignatures": [], - "target": "src/monodroid/jni/logger.cc", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "79668", - "justification": "Reference to find first set bit function.", - "createdDate": "2023-02-22 23:55:29Z", - "expirationDate": null, - "type": null - }, - "a6639098c4785509a4215c9e2fc10f82c06fce461915dc11a00227ddec558845": { - "signature": "a6639098c4785509a4215c9e2fc10f82c06fce461915dc11a00227ddec558845", - "alternativeSignatures": [], - "target": "src/monodroid/jni/logger.cc", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "79668", - "justification": "Reference to find first set bit function.", - "createdDate": "2023-02-22 23:55:29Z", - "expirationDate": null, - "type": null - }, - "d6b3df0b1d35cb4acec6a954acc145c9ec22041cd463b94ff080682c65a9bd62": { - "signature": "d6b3df0b1d35cb4acec6a954acc145c9ec22041cd463b94ff080682c65a9bd62", - "alternativeSignatures": [], - "target": "src/monodroid/jni/logger.cc", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "79668", - "justification": "Reference to find first set bit function.", - "createdDate": "2023-02-22 23:55:29Z", - "expirationDate": null, - "type": null - }, - "b34b42aa41018376a31460c142f2ae910704725d9e9a4470f92b587df682369b": { - "signature": "b34b42aa41018376a31460c142f2ae910704725d9e9a4470f92b587df682369b", - "alternativeSignatures": [], - "target": "src/Xamarin.Android.Build.Tasks/Tasks/Aapt2.cs", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "80411", - "justification": "Reference to output from an external tool.", - "createdDate": "2023-02-22 23:55:29Z", - "expirationDate": null, - "type": null - }, - "75474fa652dbbf8f96826100a5fe37ba686a032ca07d61ef68a79c8e4412c150": { - "signature": "75474fa652dbbf8f96826100a5fe37ba686a032ca07d61ef68a79c8e4412c150", - "alternativeSignatures": [], - "target": "src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/Linker.cs", - "memberOf": [ - "default" - ], - "tool": "policheck", - "ruleId": "79459", - "justification": "Reference to an external source file.", - "createdDate": "2023-02-22 23:55:29Z", - "expirationDate": null, - "type": null - } - } -} diff --git a/build-tools/automation/yaml-templates/apk-instrumentation.yaml b/build-tools/automation/yaml-templates/apk-instrumentation.yaml index 7f8b03133bf..0eac8e12dd8 100644 --- a/build-tools/automation/yaml-templates/apk-instrumentation.yaml +++ b/build-tools/automation/yaml-templates/apk-instrumentation.yaml @@ -9,41 +9,24 @@ parameters: testResultsFormat: NUnit artifactSource: "" artifactFolder: "" - useDotNet: true condition: succeeded() retryCountOnTaskFailure: 1 steps: -- ${{ if eq(parameters.useDotNet, false) }}: - - task: MSBuild@1 +- template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self + parameters: + configuration: ${{ parameters.buildConfiguration }} + xaSourcePath: ${{ parameters.xaSourcePath }} displayName: run ${{ parameters.testName }} - inputs: - solution: ${{ parameters.project }} - configuration: ${{ parameters.configuration }} - msbuildArguments: >- - /restore - /t:RunTestApp - /bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/run-${{ parameters.testName }}.binlog - ${{ parameters.extraBuildArgs }} + project: ${{ parameters.project }} + arguments: >- + -t:RunTestApp + -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/run-${{ parameters.testName }}.binlog + -v:n -c ${{ parameters.configuration }} ${{ parameters.extraBuildArgs }} condition: ${{ parameters.condition }} continueOnError: true retryCountOnTaskFailure: ${{ parameters.retryCountOnTaskFailure }} -- ${{ if eq(parameters.useDotNet, true) }}: - - template: run-dotnet-preview.yaml - parameters: - configuration: ${{ parameters.buildConfiguration }} - xaSourcePath: ${{ parameters.xaSourcePath }} - displayName: run ${{ parameters.testName }} - project: ${{ parameters.project }} - arguments: >- - -t:RunTestApp - -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/run-${{ parameters.testName }}.binlog - -v:n -c ${{ parameters.configuration }} ${{ parameters.extraBuildArgs }} - condition: ${{ parameters.condition }} - continueOnError: true - retryCountOnTaskFailure: ${{ parameters.retryCountOnTaskFailure }} - - script: > DEST="$(Build.StagingDirectory)/Test${{ parameters.configuration }}/${{ parameters.artifactFolder }}/" && mkdir -p "$DEST" && diff --git a/build-tools/automation/yaml-templates/build-linux.yaml b/build-tools/automation/yaml-templates/build-linux.yaml index 859ab2b4b46..1d7c9288391 100644 --- a/build-tools/automation/yaml-templates/build-linux.yaml +++ b/build-tools/automation/yaml-templates/build-linux.yaml @@ -1,6 +1,4 @@ parameters: - buildPoolName: $(LinuxBuildPoolName) - buildPoolImage: $(LinuxBuildPoolImage) buildResultArtifactName: Build Results - Linux checkoutCommit: '' checkoutPath: 's/xamarin-android' @@ -13,6 +11,7 @@ parameters: repositoryAlias: self stageName: linux_build stageDisplayName: Linux + use1ESTemplate: true stages: - stage: ${{ parameters.stageName }} @@ -21,17 +20,26 @@ stages: ${{ if and(ne(parameters.dependsOn, ''), ne(parameters.dependsOnResult, '')) }}: condition: eq(dependencies.${{ parameters.dependsOn }}.result, '${{ parameters.dependsOnResult }}') jobs: + # Check - "Xamarin.Android (Linux Linux > Build)" - job: ${{ parameters.jobName }} displayName: ${{ parameters.jobDisplayName }} pool: - name: ${{ parameters.buildPoolName }} - vmImage: ${{ parameters.buildPoolImage }} - timeoutInMinutes: 180 + name: MAUI-1ESPT + image: $(LinuxPoolImage1ESPT) + os: linux + timeoutInMinutes: 240 workspace: clean: all variables: CXX: g++-10 CC: gcc-10 + ${{ if eq(parameters.use1ESTemplate, true) }}: + templateContext: + outputs: + - output: pipelineArtifact + displayName: upload linux sdk + artifactName: ${{ parameters.nugetArtifactName }} + targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux steps: - template: sdk-unified/steps/checkout/v1.yml@yaml-templates parameters: @@ -84,39 +92,18 @@ stages: workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android displayName: copy linux sdk - - task: PublishPipelineArtifact@1 - displayName: upload linux sdk - inputs: - artifactName: ${{ parameters.nugetArtifactName }} - targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux - - - powershell: | - [IO.Directory]::CreateDirectory("$(Build.StagingDirectory)/empty") - [IO.Directory]::CreateDirectory("$(Build.StagingDirectory)/sbom-components") - displayName: create SBOM directories - condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real')) - - - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 - displayName: generate components SBOM - condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real')) - inputs: - BuildDropPath: $(Build.StagingDirectory)/empty - BuildComponentPath: $(System.DefaultWorkingDirectory)/xamarin-android - ManifestDirPath: $(Build.StagingDirectory)/sbom-components - PackageName: .NET Android - Verbosity: Verbose - - - task: PublishBuildArtifacts@1 - displayName: publish components SBOM - condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real')) - inputs: - artifactName: sbom-components-linux - pathToPublish: $(Build.StagingDirectory)/sbom-components + - ${{ if ne(parameters.use1ESTemplate, true) }}: + - task: PublishPipelineArtifact@1 + displayName: upload linux sdk + inputs: + artifactName: ${{ parameters.nugetArtifactName }} + targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux - - template: upload-results.yaml + - template: /build-tools/automation/yaml-templates/upload-results.yaml@self parameters: xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android artifactName: ${{ parameters.buildResultArtifactName }} includeBuildResults: true + use1ESTemplate: ${{ parameters.use1ESTemplate }} - - template: fail-on-issue.yaml + - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self diff --git a/build-tools/automation/yaml-templates/build-macos.yaml b/build-tools/automation/yaml-templates/build-macos.yaml index 23d400ada95..2d12c21573a 100644 --- a/build-tools/automation/yaml-templates/build-macos.yaml +++ b/build-tools/automation/yaml-templates/build-macos.yaml @@ -1,9 +1,8 @@ parameters: - buildPoolName: $(MacBuildPoolName) - buildPoolImage: $(MacBuildPoolImage) buildResultArtifactName: Build Results - macOS checkoutCommit: '' checkoutPath: 's/xamarin-android' + xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android checkoutPersistCredentials: false dependsOn: '' dependsOnResult: '' @@ -16,6 +15,7 @@ parameters: stageDisplayName: Mac testAssembliesArtifactName: $(TestAssembliesArtifactName) windowsToolchainPdbArtifactName: $(WindowsToolchainPdbArtifactName) + use1ESTemplate: true stages: - stage: ${{ parameters.stageName }} @@ -24,18 +24,43 @@ stages: ${{ if and(ne(parameters.dependsOn, ''), ne(parameters.dependsOnResult, '')) }}: condition: eq(dependencies.${{ parameters.dependsOn }}.result, '${{ parameters.dependsOnResult }}') jobs: - # Check - "Xamarin.Android (macOS > Build)" + # Check - "Xamarin.Android (Mac macOS > Build)" - job: ${{ parameters.jobName }} displayName: ${{ parameters.jobDisplayName }} pool: - name: ${{ parameters.buildPoolName }} - vmImage: ${{ parameters.buildPoolImage }} - ${{ if or(and(ne(variables['Build.DefinitionName'],'Xamarin.Android'), ne(variables['Build.DefinitionName'], 'Xamarin.Android-Private'), ne(variables['Build.DefinitionName'], 'xamarin.megapipeline')), eq(variables['Build.Reason'], 'PullRequest')) }}: + ${{ if or(eq(variables['Build.DefinitionName'], 'Xamarin.Android-PR'), eq(variables['Build.DefinitionName'], 'Xamarin.Android Nightly')) }}: + name: VSEng-Xamarin-RedmondMac-Android-Untrusted demands: macOS.Name -equals Monterey + ${{ else }}: + name: Azure Pipelines + vmImage: $(HostedMacImage) + os: macOS timeoutInMinutes: 240 cancelTimeoutInMinutes: 5 workspace: clean: all + ${{ if eq(parameters.use1ESTemplate, true) }}: + templateContext: + outputParentDirectory: ${{ parameters.xaSourcePath }}/bin + outputs: + - output: pipelineArtifact + displayName: upload nupkgs + artifactName: ${{ parameters.nugetArtifactName }} + targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned + - output: pipelineArtifact + displayName: upload Windows toolchain pdb files + artifactName: ${{ parameters.windowsToolchainPdbArtifactName }} + targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb + - output: pipelineArtifact + displayName: upload test assemblies + artifactName: ${{ parameters.testAssembliesArtifactName }} + targetPath: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration) + sbomEnabled: false + - output: pipelineArtifact + displayName: upload build tools inventory + artifactName: AndroidBuildToolsInventory + targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/buildtoolsinventory.csv + sbomEnabled: false steps: - template: sdk-unified/steps/checkout/v1.yml@yaml-templates parameters: @@ -44,50 +69,18 @@ stages: path: ${{ parameters.checkoutPath }} persistCredentials: ${{ parameters.checkoutPersistCredentials }} - - template: commercial-build.yaml + - template: /build-tools/automation/yaml-templates/commercial-build.yaml@self parameters: + xaSourcePath: ${{ parameters.xaSourcePath }} installerArtifactName: ${{ parameters.installerArtifactName }} nugetArtifactName: ${{ parameters.nugetArtifactName }} testAssembliesArtifactName: ${{ parameters.testAssembliesArtifactName }} + windowsToolchainPdbArtifactName: ${{ parameters.windowsToolchainPdbArtifactName }} + use1ESTemplate: ${{ parameters.use1ESTemplate }} - - powershell: | - [IO.Directory]::CreateDirectory("$(Build.StagingDirectory)/empty") - [IO.Directory]::CreateDirectory("$(Build.StagingDirectory)/sbom-components") - displayName: create SBOM directories - condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real')) - - - task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0 - displayName: generate components SBOM - condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real')) - inputs: - BuildDropPath: $(Build.StagingDirectory)/empty - BuildComponentPath: $(System.DefaultWorkingDirectory)/xamarin-android - ManifestDirPath: $(Build.StagingDirectory)/sbom-components - PackageName: .NET Android - Verbosity: Verbose - - - task: PublishBuildArtifacts@1 - displayName: publish components SBOM - condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real')) - inputs: - artifactName: sbom-components-macos - pathToPublish: $(Build.StagingDirectory)/sbom-components - - - script: > - mkdir -p $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb && - cd $(System.DefaultWorkingDirectory)/xamarin-android/bin/$(XA.Build.Configuration)/lib/packs/Microsoft.Android.Sdk.Darwin/*/tools/binutils/windows-toolchain-pdb && - zip -r $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb/windows-toolchain-pdb.zip . - workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android - displayName: zip Windows toolchain pdb files - - - task: PublishPipelineArtifact@1 - displayName: upload Windows toolchain pdb files - inputs: - artifactName: ${{ parameters.windowsToolchainPdbArtifactName }} - targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb - - - template: upload-results.yaml + - template: /build-tools/automation/yaml-templates/upload-results.yaml@self parameters: - xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android + xaSourcePath: ${{ parameters.xaSourcePath }} artifactName: ${{ parameters.buildResultArtifactName }} includeBuildResults: true + use1ESTemplate: ${{ parameters.use1ESTemplate }} diff --git a/build-tools/automation/yaml-templates/build-windows.yaml b/build-tools/automation/yaml-templates/build-windows.yaml index 389b67f8afb..a2ccbfc04d8 100644 --- a/build-tools/automation/yaml-templates/build-windows.yaml +++ b/build-tools/automation/yaml-templates/build-windows.yaml @@ -1,5 +1,4 @@ parameters: - buildPool: $(1ESWindowsPool) buildResultArtifactName: Build Results - Windows checkoutCommit: '' checkoutPath: '' @@ -20,11 +19,14 @@ stages: ${{ if and(ne(parameters.dependsOn, ''), ne(parameters.dependsOnResult, '')) }}: condition: eq(dependencies.${{ parameters.dependsOn }}.result, '${{ parameters.dependsOnResult }}') jobs: - # Check - "Xamarin.Android (Windows > Build & Smoke Test)" + # Check - "Xamarin.Android (Windows Windows > Build & Smoke Test)" - job: ${{ parameters.jobName }} displayName: ${{ parameters.jobDisplayName }} - pool: ${{ parameters.buildPool }} - timeoutInMinutes: 360 + pool: + name: MAUI-1ESPT + image: $(WindowsPoolImage1ESPT) + os: windows + timeoutInMinutes: 240 steps: - template: sdk-unified/steps/checkout/v1.yml@yaml-templates parameters: @@ -33,15 +35,15 @@ stages: path: ${{ parameters.checkoutPath }} persistCredentials: ${{ parameters.checkoutPersistCredentials }} - - template: kill-processes.yaml + - template: /build-tools/automation/yaml-templates/kill-processes.yaml@self - - template: clean.yaml + - template: /build-tools/automation/yaml-templates/clean.yaml@self - script: | echo ##vso[task.setvariable variable=JI_JAVA_HOME]%JAVA_HOME_17_X64% displayName: set JI_JAVA_HOME to $(JAVA_HOME_17_X64) - - template: use-dot-net.yaml + - template: /build-tools/automation/yaml-templates/use-dot-net.yaml@self parameters: remove_dotnet: true @@ -77,7 +79,7 @@ stages: arguments: '-c $(XA.Build.Configuration) -t:Prepare --no-restore -p:AutoProvision=true -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-build-prepare.binlog' # Build, pack .nupkgs, and extract workload packs to dotnet preview test directory - - template: run-dotnet-preview.yaml + - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self parameters: project: Xamarin.Android.sln arguments: >- @@ -86,16 +88,15 @@ stages: displayName: Build Solution continueOnError: false - - template: install-global-tool.yaml + - template: /build-tools/automation/yaml-templates/install-dotnet-tool.yaml@self parameters: toolName: apkdiff version: $(ApkDiffToolVersion) - - template: run-nunit-tests.yaml + - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml@self parameters: testRunTitle: Smoke MSBuild Tests - Windows Dotnet Build testAssembly: $(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\$(DotNetStableTargetFramework)\Xamarin.Android.Build.Tests.dll - testResultsFile: TestResult-SmokeMSBuildTests-WinDotnetBuild-$(XA.Build.Configuration).xml dotNetTestExtraArgs: --filter "TestCategory = SmokeTests" - task: BatchScript@1 @@ -104,9 +105,9 @@ stages: filename: dotnet-local.cmd arguments: build samples\HelloWorld\HelloWorld\HelloWorld.DotNet.csproj - - template: upload-results.yaml + - template: /build-tools/automation/yaml-templates/upload-results.yaml@self parameters: artifactName: ${{ parameters.buildResultArtifactName }} includeBuildResults: true - - template: fail-on-issue.yaml + - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self diff --git a/build-tools/automation/yaml-templates/commercial-build.yaml b/build-tools/automation/yaml-templates/commercial-build.yaml index 59a2dd2f10b..ff6c996a1b5 100644 --- a/build-tools/automation/yaml-templates/commercial-build.yaml +++ b/build-tools/automation/yaml-templates/commercial-build.yaml @@ -4,12 +4,14 @@ parameters: makeMSBuildArgs: '' nugetArtifactName: $(NuGetArtifactName) testAssembliesArtifactName: $(TestAssembliesArtifactName) + windowsToolchainPdbArtifactName: $(WindowsToolchainPdbArtifactName) + use1ESTemplate: true steps: - script: echo "##vso[task.setvariable variable=JI_JAVA_HOME]$HOME/android-toolchain/jdk-17" displayName: set JI_JAVA_HOME -- template: use-dot-net.yaml +- template: /build-tools/automation/yaml-templates/use-dot-net.yaml@self parameters: remove_dotnet: true @@ -26,13 +28,6 @@ steps: # https://learn.microsoft.com/en-us/azure/devops/pipelines/repos/multi-repo-checkout?view=azure-devops#checkout-path - checkout: maui -- script: > - ls -l /Applications && - sudo xcode-select --switch /Applications/Xcode_14.2.app && - xcode-select --print-path - displayName: Use Xcode 14.2 - condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real')) - - ${{ if ne(variables['System.PullRequest.IsFork'], 'True') }}: # Clone 'monodroid' without submodules - checkout: monodroid @@ -71,7 +66,7 @@ steps: displayName: CodeQL 3000 Finalize condition: and(succeededOrFailed(), eq(variables['Codeql.Enabled'], 'true'), eq(variables['Build.SourceBranch'], 'refs/heads/main')) -- template: install-microbuild-tooling.yaml +- template: /build-tools/automation/yaml-templates/install-microbuild-tooling.yaml@self parameters: condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real')) @@ -120,7 +115,7 @@ steps: /p:MicroBuildOverridePluginDirectory=$(Build.StagingDirectory)/MicroBuild/Plugins /bl:${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/sign-bu-ex.binlog -- template: remove-microbuild-tooling.yaml +- template: /build-tools/automation/yaml-templates/remove-microbuild-tooling.yaml@self parameters: condition: and(succeededOrFailed(), eq(variables['MicroBuildSignType'], 'Real')) @@ -128,20 +123,34 @@ steps: workingDirectory: ${{ parameters.xaSourcePath }} displayName: make create-installers -- task: PublishPipelineArtifact@1 - displayName: upload nupkgs - inputs: - artifactName: ${{ parameters.nugetArtifactName }} - targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned - -- task: PublishPipelineArtifact@1 - displayName: upload test assemblies - inputs: - artifactName: ${{ parameters.testAssembliesArtifactName }} - targetPath: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration) - -- task: PublishPipelineArtifact@1 - displayName: upload build tools inventory - inputs: - artifactName: AndroidBuildToolsInventory - targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/buildtoolsinventory.csv +- script: > + mkdir -p ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb && + cd ${{ parameters.xaSourcePath }}/bin/$(XA.Build.Configuration)/lib/packs/Microsoft.Android.Sdk.Darwin/*/tools/binutils/windows-toolchain-pdb && + zip -r ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb/windows-toolchain-pdb.zip . + workingDirectory: ${{ parameters.xaSourcePath }} + displayName: zip Windows toolchain pdb files + +- ${{ if ne(parameters.use1ESTemplate, true) }}: + - task: PublishPipelineArtifact@1 + displayName: upload nupkgs + inputs: + artifactName: ${{ parameters.nugetArtifactName }} + targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned + + - task: PublishPipelineArtifact@1 + displayName: upload test assemblies + inputs: + artifactName: ${{ parameters.testAssembliesArtifactName }} + targetPath: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration) + + - task: PublishPipelineArtifact@1 + displayName: upload Windows toolchain pdb files + inputs: + artifactName: ${{ parameters.windowsToolchainPdbArtifactName }} + targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb + + - task: PublishPipelineArtifact@1 + displayName: upload build tools inventory + inputs: + artifactName: AndroidBuildToolsInventory + targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/buildtoolsinventory.csv diff --git a/build-tools/automation/yaml-templates/install-global-tool.yaml b/build-tools/automation/yaml-templates/install-dotnet-tool.yaml similarity index 75% rename from build-tools/automation/yaml-templates/install-global-tool.yaml rename to build-tools/automation/yaml-templates/install-dotnet-tool.yaml index 69ac8c28583..65e9cf02243 100644 --- a/build-tools/automation/yaml-templates/install-global-tool.yaml +++ b/build-tools/automation/yaml-templates/install-dotnet-tool.yaml @@ -18,6 +18,10 @@ steps: command: custom custom: tool arguments: >- - update ${{ parameters.toolName }} -g + update ${{ parameters.toolName }} -v:diag + --tool-path $(Agent.ToolsDirectory) --version ${{ parameters.version }} --add-source "https://api.nuget.org/v3/index.json" + +- script: echo "##vso[task.prependpath]$(Agent.ToolsDirectory)" + displayName: add $(Agent.ToolsDirectory) to path diff --git a/build-tools/automation/yaml-templates/plots-to-appinsights.yaml b/build-tools/automation/yaml-templates/plots-to-appinsights.yaml deleted file mode 100644 index b141919bc1a..00000000000 --- a/build-tools/automation/yaml-templates/plots-to-appinsights.yaml +++ /dev/null @@ -1,62 +0,0 @@ -parameters: - configuration: '' - environment: Production - buildSystem: Azure DevOps - buildRepo: $(Build.Repository.Name) - buildReason: $(Build.Reason) - buildPipelineName: $(Build.DefinitionName) - buildId: $(Build.BuildId) - buildNumber: $(Build.BuildNumber) - buildUrl: $(Build.BuildUri) - buildCommit: $(Build.SourceVersion) - plotGroup: '' - plotTitle: '' - plotPathAndFilename: '' - appInsightsTelemetryKey: $(XA.Plots.AppInsightsTelemetryKey) # Defined as a hidden variable on the Xamarin.Android CI build definition: https://devdiv.visualstudio.com/DevDiv/_apps/hub/ms.vss-ciworkflow.build-ci-hub?_a=edit-build-definition&id=11410&view=Tab_Variables - condition: succeeded() - -steps: -- powershell: | - Write-Host "Current directory" - Get-Location - - Write-Host "Input parameters:" - Write-Host " configuration ${{ parameters.configuration }}" - Write-Host " environment ${{ parameters.environment }}" - Write-Host " buildSystem ${{ parameters.buildSystem }}" - Write-Host " buildRepo ${{ parameters.buildRepo }}" - Write-Host " buildReason ${{ parameters.buildReason }}" - Write-Host " buildPipelineName ${{ parameters.buildPipelineName }}" - Write-Host " buildId ${{ parameters.buildId }}" - Write-Host " buildNumber ${{ parameters.buildNumber }}" - Write-Host " buildUrl ${{ parameters.buildUrl }}" - Write-Host " buildCommit ${{ parameters.buildCommit }}" - Write-Host " plotGroup ${{ parameters.plotGroup }}" - Write-Host " plotTitle ${{ parameters.plotTitle }}" - Write-Host " plotPathAndFilename ${{ parameters.plotPathAndFilename }}" - - $buildReason = "${{ parameters.buildReason }}" - - # https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml#build-variables - $buildType = [string]::Empty - switch ($buildReason) { - 'Manual' { $buildType = 'Manual' } - 'IndividualCI' { $buildType = 'CI' } - 'PullRequest' { $buildType = 'PR' } - default { $buildType = 'Unknown' } - } - - if ($buildType -eq 'CI' -Or $buildType -eq 'Manual') { - $azureTimestampFormatUtc = 'yyyy-MM-ddTHH:mm:ss.fffffffZ' - $buildTime = [DateTime]::UtcNow.ToString($azureTimestampFormatUtc) - Write-Host $buildTime - Write-Host "Sending plot telemtry" - mono "$(System.DefaultWorkingDirectory)/build-tools/plots-to-appinsights/bin/${{ parameters.configuration }}/ProcessPlotCSVFile.exe" -d:"${buildTime}" -e:"${{ parameters.environment }}" -r:"${{ parameters.buildRepo }}" -t:"${buildType}" -p:"${{ parameters.buildPipelineName }}" -c:${{ parameters.buildCommit }} -i:${{ parameters.buildId }} -n:"${{ parameters.buildNumber }}" -u:"${{ parameters.buildUrl }}" -pg:"${{ parameters.plotGroup }}" -pt:"${{ parameters.plotTitle }}" -k:"${{ parameters.appInsightsTelemetryKey }}" "${{ parameters.plotPathAndFilename }}" - } else { - Write-Host "WARNING: Plot telmemetry not sent. Plot telemetry is only sent for continuous integration (CI) or manual builds. buildType: ${buildType}" - } - errorActionPreference: silentlyContinue - continueOnError: true - ignoreLASTEXITCODE: true - displayName: 'Plots to AppInsights: ${{ parameters.plotTitle }}' - condition: ${{ parameters.condition }} \ No newline at end of file diff --git a/build-tools/automation/yaml-templates/publish-artifact.yaml b/build-tools/automation/yaml-templates/publish-artifact.yaml index 5bfb098624e..50c7824282d 100644 --- a/build-tools/automation/yaml-templates/publish-artifact.yaml +++ b/build-tools/automation/yaml-templates/publish-artifact.yaml @@ -3,6 +3,7 @@ parameters: artifactName: artifact targetPath: $(Build.ArtifactStagingDirectory) condition: always() + use1ESTemplate: true steps: # Add the "(Attempt X)" for retries, but leave the initial run blank @@ -12,9 +13,17 @@ steps: displayName: Set upload artifact name condition: ${{ parameters.condition }} -- task: PublishPipelineArtifact@1 - displayName: ${{ parameters.displayName }} - inputs: - artifactName: ${{ parameters.artifactName }} $(UploadAttemptSuffix) - targetPath: ${{ parameters.targetPath }} - condition: ${{ parameters.condition }} +- ${{ if eq(parameters.use1ESTemplate, true) }}: + - task: 1ES.PublishPipelineArtifact@1 + displayName: ${{ parameters.displayName }} + inputs: + artifactName: ${{ parameters.artifactName }} $(UploadAttemptSuffix) + targetPath: ${{ parameters.targetPath }} + condition: ${{ parameters.condition }} +- ${{ else }}: + - task: PublishPipelineArtifact@1 + displayName: ${{ parameters.displayName }} + inputs: + artifactName: ${{ parameters.artifactName }} $(UploadAttemptSuffix) + targetPath: ${{ parameters.targetPath }} + condition: ${{ parameters.condition }} diff --git a/build-tools/automation/yaml-templates/run-designer-tests.yml b/build-tools/automation/yaml-templates/run-designer-tests.yml deleted file mode 100644 index f6a63f5adc6..00000000000 --- a/build-tools/automation/yaml-templates/run-designer-tests.yml +++ /dev/null @@ -1,79 +0,0 @@ -parameters: - designerSourcePath: $(System.DefaultWorkingDirectory) - nunitConsoleVersion: '3.9.0' - runAddinTests: true - testResultArtifactName: Test Results - Designer - Windows - -steps: -- task: DeleteFiles@1 - displayName: Delete Test Outputs - inputs: - SourceFolder: ${{ parameters.designerSourcePath }}/Xamarin.Designer.Android/Xamarin.AndroidDesigner.Tests - Contents: | - CustomControlsOutput - AndroidCustomControlsClass/obj - AndroidCustomControlsBinding/obj - AndroidCustomControls/obj - AndroidCustomControlsClass/bin - AndroidCustomControlsBinding/bin - AndroidCustomControls/bin - -- task: NuGetCommand@2 - displayName: Install NUnit.Console ${{ parameters.nunitConsoleVersion }} - inputs: - command: custom - arguments: install NUnit.Console -version ${{ parameters.nunitConsoleVersion }} -OutputDirectory ${{ parameters.designerSourcePath }}/packages - -- powershell: | - $nunitConsole = [IO.Path]::Combine("${{ parameters.designerSourcePath }}", "packages", "NUnit.ConsoleRunner.${{ parameters.nunitConsoleVersion }}", "tools", "nunit3-console.exe") - if ([Environment]::OSVersion.Platform -eq "Unix") - { - mono64 "$nunitConsole" "-labels=All" "-result=TestResult_AndroidDesignerUnitTests.xml" "Xamarin.AndroidDesigner.UnitTests.dll" - } - else - { - ."$nunitConsole" "-labels=All" "-result=TestResult_AndroidDesignerUnitTests.xml" "Xamarin.AndroidDesigner.UnitTests.dll" - } - displayName: Run Unit Tests - workingDirectory: ${{ parameters.designerSourcePath }}/Xamarin.Designer.Android/Xamarin.AndroidDesigner.Tests/bin-tests/Debug - -- powershell: | - if ([Environment]::OSVersion.Platform -eq "Unix") - { - mono64 "--debug" "GuiUnit.exe" "-labels=All" "-result=TestResult_AndroidDesigner.xml" "Xamarin.AndroidDesigner.Tests.dll" - } - else - { - .\GuiUnit.exe "-labels=All" "-result=TestResult_AndroidDesigner.xml" "Xamarin.AndroidDesigner.Tests.dll" - } - displayName: Run GUI Tests - workingDirectory: ${{ parameters.designerSourcePath }}/Xamarin.Designer.Android/Xamarin.AndroidDesigner.Tests/bin/Debug - condition: false # https://dev.azure.com/devdiv/DevDiv/_workitems/edit/1583237 - -- task: PublishTestResults@2 - displayName: Publish Core Unit Test Results - inputs: - testResultsFormat: NUnit - testResultsFiles: ${{ parameters.designerSourcePath }}/Xamarin.Designer.Android/Xamarin.AndroidDesigner.Tests/**/TestResult_*.xml - testRunTitle: Xamarin.AndroidDesigner.Tests - condition: succeededOrFailed() - -- task: CopyFiles@2 - displayName: 'Copy binlogs' - inputs: - sourceFolder: ${{ parameters.designerSourcePath }}/Xamarin.Designer.Android - contents: | - **/*.binlog - **/hs*.log - **/hs*.mdmp - targetFolder: $(Build.ArtifactStagingDirectory)/designer-binlogs - overWrite: true - flattenFolders: true - condition: ne(variables['Agent.JobStatus'], 'Succeeded') - -- template: publish-artifact.yaml - parameters: - displayName: upload designer binlogs - artifactName: ${{ parameters.testResultArtifactName }} - targetPath: $(Build.ArtifactStagingDirectory)/designer-binlogs - condition: ne(variables['Agent.JobStatus'], 'Succeeded') diff --git a/build-tools/automation/yaml-templates/run-emulator-tests.yaml b/build-tools/automation/yaml-templates/run-emulator-tests.yaml index e3484dd5c5b..bbf7e212943 100644 --- a/build-tools/automation/yaml-templates/run-emulator-tests.yaml +++ b/build-tools/automation/yaml-templates/run-emulator-tests.yaml @@ -6,6 +6,7 @@ parameters: jobTimeout: 360 jdkTestFolder: $(JAVA_HOME_17_X64) testSteps: [] + use1ESTemplate: true jobs: - job: mac_${{ parameters.jobName }}_tests @@ -25,11 +26,8 @@ jobs: echo "##vso[task.setvariable variable=JAVA_HOME]${{ parameters.jdkTestFolder }}" displayName: set JAVA_HOME to ${{ parameters.jdkTestFolder }} - - template: setup-test-environment.yaml + - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml@self parameters: - installLegacyDotNet: false - restoreNUnitConsole: false - updateMono: false xaprepareScenario: EmulatorTestDependencies jdkTestFolder: ${{ parameters.jdkTestFolder }} @@ -38,14 +36,15 @@ jobs: artifactName: $(TestAssembliesArtifactName) downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) - - template: start-stop-emulator.yaml + - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml@self parameters: emulatorMSBuildArgs: ${{ parameters.emulatorMSBuildArgs }} - ${{ parameters.testSteps }} - - template: upload-results.yaml + - template: /build-tools/automation/yaml-templates/upload-results.yaml@self parameters: artifactName: Test Results - ${{ parameters.jobName }} With Emulator - macOS + use1ESTemplate: ${{ parameters.use1ESTemplate }} - - template: fail-on-issue.yaml + - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self diff --git a/build-tools/automation/yaml-templates/run-installer.yaml b/build-tools/automation/yaml-templates/run-installer.yaml deleted file mode 100644 index b66b0209ada..00000000000 --- a/build-tools/automation/yaml-templates/run-installer.yaml +++ /dev/null @@ -1,40 +0,0 @@ -parameters: - provisionExtraArgs: -vv -f - -steps: -- task: DownloadPipelineArtifact@2 - inputs: - artifactName: $(InstallerArtifactName) - downloadPath: $(System.DefaultWorkingDirectory) - patterns: xamarin.android*.pkg - condition: and(succeeded(), eq(variables['agent.os'], 'Darwin')) - -- task: DownloadPipelineArtifact@2 - inputs: - artifactName: $(InstallerArtifactName) - downloadPath: $(System.DefaultWorkingDirectory) - patterns: Xamarin.Android*.vsix - condition: and(succeeded(), eq(variables['agent.os'], 'Windows_NT')) - -- powershell: | - $itemPattern = "*.vsix" - if ([Environment]::OSVersion.Platform -eq "Unix") { - $itemPattern = "*.pkg" - } - $searchDir = [System.IO.Path]::Combine("$(System.DefaultWorkingDirectory)", "*") - $installer = Get-ChildItem -Path "$searchDir" -Include "$itemPattern" -File - if (![System.IO.File]::Exists($installer)) { - throw [System.IO.FileNotFoundException] "Installer not found in $artifactDirectory." - } - Write-Host "##vso[task.setvariable variable=XA.Provisionator.Args]$installer" - displayName: find installer and set provisionator variable - condition: and(succeeded(), ne(variables['agent.os'], 'Linux')) - -- task: provisionator@2 - inputs: - provisionator_uri: $(provisionator-uri) - github_token: $(GitHub.Token) - provisioning_script: $(XA.Provisionator.Args) - provisioning_extra_args: ${{ parameters.provisionExtraArgs }} - # Disabled on Windows on .NET release branches - condition: and(succeeded(), ne(variables['System.PullRequest.IsFork'], 'True'), ne(variables['agent.os'], 'Linux'), or(eq(variables.IsRelOrTargetingRel, 'False'), eq(variables['agent.os'], 'Darwin'))) diff --git a/build-tools/automation/yaml-templates/run-msbuild-tests.yaml b/build-tools/automation/yaml-templates/run-msbuild-tests.yaml index 6d5193a5f87..62be739a9a9 100644 --- a/build-tools/automation/yaml-templates/run-msbuild-tests.yaml +++ b/build-tools/automation/yaml-templates/run-msbuild-tests.yaml @@ -15,27 +15,29 @@ jobs: parallel: ${{ parameters.agentCount }} displayName: ${{ parameters.jobDisplayName }} ${{ if eq(parameters.testOS, 'Windows') }}: - pool: $(1ESWindowsPool) + pool: + name: MAUI-1ESPT + image: $(WindowsPoolImage1ESPT) + os: windows ${{ if eq(parameters.testOS, 'macOS') }}: pool: + name: Azure Pipelines vmImage: $(HostedMacImage) - timeoutInMinutes: 180 + os: macOS + timeoutInMinutes: 240 cancelTimeoutInMinutes: 5 steps: - ${{ if eq(parameters.testOS, 'Windows') }}: - script: netsh int ipv4 set global sourceroutingbehavior=drop - - template: kill-processes.yaml + - template: /build-tools/automation/yaml-templates/kill-processes.yaml@self - - template: clean.yaml + - template: /build-tools/automation/yaml-templates/clean.yaml@self - - template: setup-test-environment.yaml + - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml@self parameters: installTestSlicer: true - installLegacyDotNet: false installLegacyXamarinAndroid: true - restoreNUnitConsole: false - updateMono: false xaSourcePath: ${{ parameters.xaSourcePath }} repositoryAlias: ${{ parameters.repositoryAlias }} commit: ${{ parameters.commit }} @@ -45,7 +47,7 @@ jobs: artifactName: $(TestAssembliesArtifactName) downloadPath: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration) - - template: run-sliced-nunit-tests.yaml + - template: /build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml@self parameters: testAssembly: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll testFilter: ${{ parameters.testFilter }} @@ -53,11 +55,11 @@ jobs: retryFailedTests: false xaSourcePath: ${{ parameters.xaSourcePath }} - - template: upload-results.yaml + - template: /build-tools/automation/yaml-templates/upload-results.yaml@self parameters: artifactName: Test Results - MSBuild - ${{ parameters.testOS }}-$(System.JobPositionInPhase) xaSourcePath: ${{ parameters.xaSourcePath }} - - template: fail-on-issue.yaml + - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self parameters: condition: ${{ parameters.shouldFailOnIssue }} diff --git a/build-tools/automation/yaml-templates/run-nunit-tests.yaml b/build-tools/automation/yaml-templates/run-nunit-tests.yaml index 95d49d08506..709a503e477 100644 --- a/build-tools/automation/yaml-templates/run-nunit-tests.yaml +++ b/build-tools/automation/yaml-templates/run-nunit-tests.yaml @@ -1,71 +1,25 @@ parameters: - configuration: $(XA.Build.Configuration) - xaSourcePath: $(System.DefaultWorkingDirectory) testRunTitle: Xamarin Android Tests testAssembly: '' - testResultsFile: TestResult.xml - nunitConsoleExtraArgs: '' dotNetTestExtraArgs: '' - useDotNet: true - useDotNetPreview: false workers: $(NUnit.NumberOfTestWorkers) condition: succeeded() - timeoutInMinutes: 0 + timeoutInMinutes: 180 retryCountOnTaskFailure: 0 steps: -- ${{ if and(eq(parameters.useDotNet, false), eq(parameters.useDotNetPreview, false)) }}: - - powershell: | - Write-Host '##vso[task.setvariable variable=TestResultsFormat]NUnit' - if ([Environment]::OSVersion.Platform -eq "Unix") { - & ${{ parameters.xaSourcePath }}/build-tools/scripts/nunit3-console ${{ parameters.testAssembly }} --result ${{ parameters.testResultsFile }} --workers=${{ parameters.workers }} ${{ parameters.nunitConsoleExtraArgs }} - } else { - & cmd /c '${{ parameters.xaSourcePath }}\build-tools\scripts\nunit3-console.cmd' ${{ parameters.testAssembly }} --result ${{ parameters.testResultsFile }} --workers=${{ parameters.workers }} ${{ parameters.nunitConsoleExtraArgs }} - } - if ($LASTEXITCODE -ne 0) { - Write-Host "##vso[task.logissue type=error]Test suite had $LASTEXITCODE failure(s)." - Write-Host "##vso[task.complete result=Failed;]" - exit 0 - } - displayName: run ${{ parameters.testRunTitle }} - condition: ${{ parameters.condition }} - continueOnError: true - -- ${{ if and(eq(parameters.useDotNet, true), eq(parameters.useDotNetPreview, true)) }}: - - powershell: Write-Host '##vso[task.setvariable variable=TestResultsFormat]VSTest' - - template: run-dotnet-preview.yaml - parameters: - configuration: ${{ parameters.configuration }} - xaSourcePath: ${{ parameters.xaSourcePath }} - command: test - project: ${{ parameters.testAssembly }} - useExitCodeForErrors: true - arguments: >- - --results-directory . --logger "trx;LogFileName=${{ parameters.testResultsFile }}" - ${{ parameters.dotNetTestExtraArgs }} -- NUnit.NumberOfTestWorkers=${{ parameters.workers }} - displayName: run ${{ parameters.testRunTitle }} - condition: ${{ parameters.condition }} - -- ${{ if and(eq(parameters.useDotNet, true), eq(parameters.useDotNetPreview, false)) }}: - - task: DotNetCoreCLI@2 - inputs: - command: test - projects: ${{ parameters.testAssembly }} - arguments: >- - ${{ parameters.dotNetTestExtraArgs }} -- NUnit.NumberOfTestWorkers=${{ parameters.workers }} - publishTestResults: true - testRunTitle: ${{ parameters.testRunTitle }} - displayName: run ${{ parameters.testRunTitle }} - condition: ${{ parameters.condition }} - continueOnError: true - timeoutInMinutes: ${{ parameters.timeoutInMinutes }} - retryCountOnTaskFailure: ${{ parameters.retryCountOnTaskFailure }} - -- template: kill-processes.yaml - -- task: PublishTestResults@2 +- task: DotNetCoreCLI@2 inputs: - testResultsFormat: $(TestResultsFormat) - testResultsFiles: ${{ parameters.testResultsFile }} + command: test + projects: ${{ parameters.testAssembly }} + arguments: >- + ${{ parameters.dotNetTestExtraArgs }} -- NUnit.NumberOfTestWorkers=${{ parameters.workers }} + publishTestResults: true testRunTitle: ${{ parameters.testRunTitle }} - condition: and(${{ parameters.condition }}, or(ne('${{ parameters.useDotNet }}', 'true'), eq('${{ parameters.useDotNetPreview }}', 'true'))) + displayName: run ${{ parameters.testRunTitle }} + condition: ${{ parameters.condition }} + continueOnError: true + timeoutInMinutes: ${{ parameters.timeoutInMinutes }} + retryCountOnTaskFailure: ${{ parameters.retryCountOnTaskFailure }} + +- template: /build-tools/automation/yaml-templates/kill-processes.yaml@self diff --git a/build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml b/build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml index 5e44373d5dd..b81af9b0943 100644 --- a/build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml +++ b/build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml @@ -8,7 +8,7 @@ parameters: steps: - ${{if parameters.testFilter}}: - pwsh: >- - dotnet-test-slicer slice + $(Agent.ToolsDirectory)/dotnet-test-slicer slice --test-assembly="${{ parameters.testAssembly }}" --test-filter="${{ parameters.testFilter }}" --slice-number=$(System.JobPositionInPhase) @@ -18,7 +18,7 @@ steps: failOnStderr: true - ${{ else }}: - pwsh: >- - dotnet-test-slicer slice + $(Agent.ToolsDirectory)/dotnet-test-slicer slice --test-assembly="${{ parameters.testAssembly }}" --slice-number=$(System.JobPositionInPhase) --total-slices=$(System.TotalJobsInPhase) @@ -28,7 +28,7 @@ steps: - ${{ if eq(parameters.retryFailedTests, 'false') }}: # If we aren't using auto-retry logic, then this is just a simple template call - - template: run-nunit-tests.yaml + - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml@self parameters: testRunTitle: ${{ parameters.testRunTitle }}-$(System.JobPositionInPhase) testAssembly: ${{ parameters.testAssembly }} @@ -49,7 +49,7 @@ steps: workingDirectory: ${{ parameters.xaSourcePath }} - pwsh: | - dotnet-test-slicer ` + $(Agent.ToolsDirectory)/dotnet-test-slicer ` retry ` --trx="$(Agent.TempDirectory)" ` --outfile="${{ parameters.testAssembly }}.runsettings" @@ -70,7 +70,7 @@ steps: custom: build-server arguments: shutdown - - template: run-nunit-tests.yaml + - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml@self parameters: testRunTitle: ${{ parameters.testRunTitle }}-$(System.JobPositionInPhase) (Auto-Retry) testAssembly: ${{ parameters.testAssembly }} diff --git a/build-tools/automation/yaml-templates/run-xaprepare.yaml b/build-tools/automation/yaml-templates/run-xaprepare.yaml index 1136cbec6e1..209aab8219d 100644 --- a/build-tools/automation/yaml-templates/run-xaprepare.yaml +++ b/build-tools/automation/yaml-templates/run-xaprepare.yaml @@ -3,7 +3,6 @@ parameters: name: configuration: $(XA.Build.Configuration) xaSourcePath: $(System.DefaultWorkingDirectory) - framework: $(DotNetStableTargetFramework) condition: succeeded() arguments: @@ -15,4 +14,4 @@ steps: inputs: command: run projects: ${{ parameters.xaSourcePath }}/build-tools/xaprepare/xaprepare/xaprepare.csproj - arguments: -f ${{ parameters.framework }} -c ${{ parameters.configuration }} -- ${{ parameters.arguments }} --no-emoji --run-mode=CI + arguments: -f $(DotNetStableTargetFramework) -c ${{ parameters.configuration }} -- ${{ parameters.arguments }} --no-emoji --run-mode=CI diff --git a/build-tools/automation/yaml-templates/setup-test-environment.yaml b/build-tools/automation/yaml-templates/setup-test-environment.yaml index bcd91d29145..45901d9770a 100644 --- a/build-tools/automation/yaml-templates/setup-test-environment.yaml +++ b/build-tools/automation/yaml-templates/setup-test-environment.yaml @@ -5,17 +5,15 @@ parameters: remove_dotnet: false installTestSlicer: false installApkDiff: true - installLegacyDotNet: true + installLegacyDotNet: false installLegacyXamarinAndroid: false - restoreNUnitConsole: true - updateMono: true + updateMono: false androidSdkPlatforms: $(DefaultTestSdkPlatforms) repositoryAlias: 'self' commit: '' xaprepareScenario: AndroidTestDependencies # Use 'EmulatorTestDependencies' for agents that need the emulator installed steps: - - template: sdk-unified/steps/checkout/v1.yml@yaml-templates parameters: resource: ${{ parameters.repositoryAlias }} @@ -37,14 +35,14 @@ steps: # Install .NET 6 for legacy tests - ${{ if eq(parameters.installLegacyDotNet, true) }}: - - template: use-dot-net.yaml + - template: /build-tools/automation/yaml-templates/use-dot-net.yaml@self parameters: version: 6.0 quality: GA remove_dotnet: ${{ parameters.remove_dotnet }} # Install latest .NET -- template: use-dot-net.yaml +- template: /build-tools/automation/yaml-templates/use-dot-net.yaml@self - task: DotNetCoreCLI@2 displayName: shut down existing build daemons @@ -54,7 +52,7 @@ steps: arguments: shutdown - ${{ if eq(parameters.updateMono, true) }}: - - template: run-xaprepare.yaml + - template: /build-tools/automation/yaml-templates/run-xaprepare.yaml@self parameters: displayName: run xaprepare-UpdateMono arguments: --s=UpdateMono --auto-provision=yes --auto-provision-uses-sudo=yes @@ -62,29 +60,19 @@ steps: xaSourcePath: ${{ parameters.xaSourcePath }} - ${{ if eq(parameters.installLegacyXamarinAndroid, true) }}: - - template: install-global-tool.yaml + - template: /build-tools/automation/yaml-templates/install-dotnet-tool.yaml@self parameters: toolName: boots version: $(BootsToolVersion) continueOnError: false - - powershell: boots --stable Xamarin.Android + - pwsh: $(Agent.ToolsDirectory)/boots --stable Xamarin.Android displayName: install Xamarin.Android stable -- template: run-xaprepare.yaml +- template: /build-tools/automation/yaml-templates/run-xaprepare.yaml@self parameters: arguments: --s=${{ parameters.xaprepareScenario }} --android-sdk-platforms="${{ parameters.androidSdkPlatforms }}" xaSourcePath: ${{ parameters.xaSourcePath }} -- ${{ if eq(parameters.restoreNUnitConsole, true) }}: - - task: DotNetCoreCLI@2 - displayName: restore NUnit.Console - inputs: - command: restore - projects: ${{ parameters.xaSourcePath }}/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Xamarin.ProjectTools.csproj - restoreArguments: -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/restore-Xamarin.ProjectTools.binlog - nugetConfigPath: ${{ parameters.xaSourcePath }}/NuGet.config - feedsToUse: config - - task: DotNetCoreCLI@2 displayName: build Xamarin.Android.Tools.BootstrapTasks.csproj inputs: @@ -110,13 +98,13 @@ steps: arguments: -t:ExtractWorkloadPacks -c ${{ parameters.configuration }} -v:n -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/extract-workloads.binlog - ${{ if eq(parameters.installApkDiff, true) }}: - - template: install-global-tool.yaml + - template: /build-tools/automation/yaml-templates/install-dotnet-tool.yaml@self parameters: toolName: apkdiff version: $(ApkDiffToolVersion) - ${{ if eq(parameters.installTestSlicer, true) }}: - - template: install-global-tool.yaml + - template: /build-tools/automation/yaml-templates/install-dotnet-tool.yaml@self parameters: toolName: dotnet-test-slicer version: $(TestSlicerToolVersion) diff --git a/build-tools/automation/yaml-templates/setup-ubuntu.yaml b/build-tools/automation/yaml-templates/setup-ubuntu.yaml deleted file mode 100644 index 4dd8d7062b5..00000000000 --- a/build-tools/automation/yaml-templates/setup-ubuntu.yaml +++ /dev/null @@ -1,23 +0,0 @@ -steps: - -- script: sudo rm /etc/apt/sources.list.d/treasure-data.list || true - displayName: remove invalid treasure-data source - -- script: echo "##vso[task.setvariable variable=XDG_CONFIG_HOME]$HOME/.config" - displayName: update XDG_CONFIG_HOME - -- script: > - sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF && - echo "deb https://download.mono-project.com/repo/ubuntu preview-focal main" | sudo tee /etc/apt/sources.list.d/mono-official-preview.list && - sudo apt update && - sudo apt install -y --no-install-recommends mono-complete nuget msbuild - displayName: install mono preview - -- template: use-dot-net.yaml - parameters: - remove_dotnet: true - -- task: NuGetToolInstaller@1 - displayName: Use NuGet 5.x - inputs: - versionSpec: 5.x diff --git a/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml b/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml index 88657721c3f..63bd8dddfd4 100644 --- a/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml +++ b/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml @@ -25,19 +25,19 @@ stages: parallel: ${{ parameters.agent_count }} displayName: "macOS > Tests > MSBuild+Emulator" pool: + name: Azure Pipelines vmImage: $(HostedMacImage) - timeoutInMinutes: 90 + os: macOS + timeoutInMinutes: 180 cancelTimeoutInMinutes: 5 workspace: clean: all steps: - - template: setup-test-environment.yaml + - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml@self parameters: installTestSlicer: true installApkDiff: false - installLegacyDotNet: false installLegacyXamarinAndroid: true - restoreNUnitConsole: false updateMono: true xaSourcePath: ${{ parameters.xaSourcePath }} repositoryAlias: ${{ parameters.repositoryAlias }} @@ -49,29 +49,29 @@ stages: artifactName: $(TestAssembliesArtifactName) downloadPath: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration) - - template: start-stop-emulator.yaml + - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml@self parameters: xaSourcePath: ${{ parameters.xaSourcePath }} startContinueOnError: ${{ parameters.emulatorStartContinueOnError }} - - template: run-sliced-nunit-tests.yaml + - template: /build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml@self parameters: testAssembly: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/$(DotNetStableTargetFramework)/MSBuildDeviceIntegration.dll testFilter: $(ExcludedNightlyNUnitCategories) testRunTitle: MSBuildDeviceIntegration On Device - macOS - ${{ if ne(parameters.usesCleanImages, true) }}: - - template: start-stop-emulator.yaml + - template: start-stop-emulator.yaml@self parameters: command: stop xaSourcePath: ${{ parameters.xaSourcePath }} - - template: upload-results.yaml + - template: /build-tools/automation/yaml-templates/upload-results.yaml@self parameters: artifactName: Test Results - MSBuild With Emulator - macOS-$(System.JobPositionInPhase) xaSourcePath: ${{ parameters.xaSourcePath }} - - template: fail-on-issue.yaml + - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self parameters: condition: ${{ parameters.shouldFailOnIssue }} @@ -88,17 +88,16 @@ stages: deviceName: wear_square androidSdkPlatforms: 33 pool: + name: Azure Pipelines vmImage: $(HostedMacImage) + os: macOS workspace: clean: all steps: - - template: setup-test-environment.yaml + - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml@self parameters: installTestSlicer: true installApkDiff: false - installLegacyDotNet: false - restoreNUnitConsole: false - updateMono: false xaSourcePath: ${{ parameters.xaSourcePath }} repositoryAlias: ${{ parameters.repositoryAlias }} commit: ${{ parameters.commit }} @@ -109,7 +108,7 @@ stages: artifactName: $(TestAssembliesArtifactName) downloadPath: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration) - - template: start-stop-emulator.yaml + - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml@self parameters: specificImage: true deviceName: $(deviceName) @@ -119,7 +118,7 @@ stages: xaSourcePath: ${{ parameters.xaSourcePath }} startContinueOnError: ${{ parameters.emulatorStartContinueOnError }} - - template: run-sliced-nunit-tests.yaml + - template: /build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml@self parameters: testRunTitle: WearOS On Device - macOS testAssembly: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/$(DotNetStableTargetFramework)/MSBuildDeviceIntegration.dll @@ -127,7 +126,7 @@ stages: xaSourcePath: ${{ parameters.xaSourcePath }} - ${{ if ne(parameters.usesCleanImages, true) }}: - - template: start-stop-emulator.yaml + - template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml@self parameters: command: stop specificImage: true @@ -137,12 +136,12 @@ stages: avdType: $(avdType) xaSourcePath: ${{ parameters.xaSourcePath }} - - template: upload-results.yaml + - template: /build-tools/automation/yaml-templates/upload-results.yaml@self parameters: configuration: $(XA.Build.Configuration) artifactName: Test Results - Emulator $(avdApiLevel)-$(avdAbi)-$(avdType) - macOS xaSourcePath: ${{ parameters.xaSourcePath }} - - template: fail-on-issue.yaml + - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self parameters: condition: ${{ parameters.shouldFailOnIssue }} diff --git a/build-tools/automation/yaml-templates/stage-msbuild-tests.yaml b/build-tools/automation/yaml-templates/stage-msbuild-tests.yaml index 9b4745c543c..a9eff7fb75a 100644 --- a/build-tools/automation/yaml-templates/stage-msbuild-tests.yaml +++ b/build-tools/automation/yaml-templates/stage-msbuild-tests.yaml @@ -16,7 +16,7 @@ stages: dependsOn: ${{ parameters.dependsOn }} condition: ${{ parameters.stageCondition }} jobs: - - template: run-msbuild-tests.yaml + - template: /build-tools/automation/yaml-templates/run-msbuild-tests.yaml@self parameters: testOS: macOS jobName: mac_msbuild_tests @@ -27,7 +27,7 @@ stages: commit: ${{ parameters.commit }} shouldFailOnIssue: ${{ parameters.shouldFailOnIssue }} - - template: run-msbuild-tests.yaml + - template: /build-tools/automation/yaml-templates/run-msbuild-tests.yaml@self parameters: testOS: Windows jobName: win_msbuild_tests diff --git a/build-tools/automation/yaml-templates/upload-results.yaml b/build-tools/automation/yaml-templates/upload-results.yaml index ed782a58d4d..40ce61a07cd 100644 --- a/build-tools/automation/yaml-templates/upload-results.yaml +++ b/build-tools/automation/yaml-templates/upload-results.yaml @@ -4,9 +4,10 @@ parameters: artifactName: results includeBuildResults: false condition: or(ne(variables['Agent.JobStatus'], 'Succeeded'), eq(variables['XA.PublishAllLogs'], 'true')) + use1ESTemplate: true steps: -- template: run-xaprepare.yaml +- template: /build-tools/automation/yaml-templates/run-xaprepare.yaml@self parameters: configuration: ${{ parameters.configuration }} arguments: --s=CopyExtraResultFilesForCI --verbosity v @@ -15,12 +16,13 @@ steps: condition: ${{ parameters.condition }} - ${{ if eq(parameters.includeBuildResults, false) }}: - - template: publish-artifact.yaml + - template: /build-tools/automation/yaml-templates/publish-artifact.yaml@self parameters: displayName: upload test results artifactName: ${{ parameters.artifactName }} targetPath: $(Build.StagingDirectory)/Test${{ parameters.configuration }} condition: ${{ parameters.condition }} + use1ESTemplate: ${{ parameters.use1ESTemplate }} # Copy Build$(Configuration) folder into test result root and upload single artifact - ${{ if eq(parameters.includeBuildResults, true) }}: @@ -30,9 +32,10 @@ steps: targetFolder: $(Build.StagingDirectory)/Test${{ parameters.configuration }}/Build${{ parameters.configuration }} condition: ${{ parameters.condition }} - - template: publish-artifact.yaml + - template: /build-tools/automation/yaml-templates/publish-artifact.yaml@self parameters: displayName: upload build and test results artifactName: ${{ parameters.artifactName }} targetPath: $(Build.StagingDirectory)/Test${{ parameters.configuration }} condition: ${{ parameters.condition }} + use1ESTemplate: ${{ parameters.use1ESTemplate }} diff --git a/build-tools/automation/yaml-templates/use-dot-net.yaml b/build-tools/automation/yaml-templates/use-dot-net.yaml index 41fdfad874a..7480ddc8176 100644 --- a/build-tools/automation/yaml-templates/use-dot-net.yaml +++ b/build-tools/automation/yaml-templates/use-dot-net.yaml @@ -8,7 +8,6 @@ parameters: retryCountOnTaskFailure: 3 steps: - - pwsh: | $ErrorActionPreference = 'Stop' $ProgressPreference = 'SilentlyContinue' diff --git a/build-tools/automation/yaml-templates/variables.yaml b/build-tools/automation/yaml-templates/variables.yaml index ad1ff2cd733..e9908323d5d 100644 --- a/build-tools/automation/yaml-templates/variables.yaml +++ b/build-tools/automation/yaml-templates/variables.yaml @@ -33,8 +33,10 @@ variables: value: macOS-13 - name: HostedWinImage value: windows-2022 -- name: 1ESWindowsPool - value: android-win-2022 +- name: WindowsPoolImage1ESPT + value: 1ESPT-Windows2022 +- name: LinuxPoolImage1ESPT + value: 1ESPT-Ubuntu22.04 - name: VSEngMicroBuildPool value: VSEngSS-MicroBuild2022-1ES - name: TeamName diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs index 29c00189e8e..06da0feeb21 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs @@ -115,10 +115,16 @@ protected static (int code, string stdOutput, string stdError) RunApkDiffCommand try { return RunProcessWithExitCode ("apkdiff" + ext, args); } catch (System.ComponentModel.Win32Exception) { - // apkdiff's location might not be in the $PATH, try known location + // apkdiff's location might not be in the $PATH, try known locations var profileDir = Environment.GetFolderPath (Environment.SpecialFolder.UserProfile); - - return RunProcessWithExitCode (Path.Combine (profileDir, ".dotnet", "tools", "apkdiff" + ext), args); + var apkdiffPath = Path.Combine (profileDir, ".dotnet", "tools", "apkdiff" + ext); + if (!File.Exists (apkdiffPath)) { + var agentToolsDir = Environment.GetEnvironmentVariable ("AGENT_TOOLSDIRECTORY"); + if (Directory.Exists (agentToolsDir)) { + apkdiffPath = Path.Combine (agentToolsDir, "apkdiff" + ext); + } + } + return RunProcessWithExitCode (apkdiffPath, args); } } From be72b06d6edb16954893f03cdbba3843e7c53e2b Mon Sep 17 00:00:00 2001 From: Peter Collins Date: Mon, 4 Mar 2024 12:54:06 -0800 Subject: [PATCH 2/4] [ci] Add 1ESPT override to MSBuild test stages (#8784) The mega pipeline extends our msbuild stages and does not yet support using the 1ES pipeline template. --- build-tools/automation/yaml-templates/run-msbuild-tests.yaml | 2 ++ .../yaml-templates/stage-msbuild-emulator-tests.yaml | 3 +++ build-tools/automation/yaml-templates/stage-msbuild-tests.yaml | 3 +++ 3 files changed, 8 insertions(+) diff --git a/build-tools/automation/yaml-templates/run-msbuild-tests.yaml b/build-tools/automation/yaml-templates/run-msbuild-tests.yaml index 62be739a9a9..9b96227b118 100644 --- a/build-tools/automation/yaml-templates/run-msbuild-tests.yaml +++ b/build-tools/automation/yaml-templates/run-msbuild-tests.yaml @@ -8,6 +8,7 @@ parameters: repositoryAlias: 'self' commit: '' shouldFailOnIssue: true + use1ESTemplate: true jobs: - job: ${{ parameters.jobName }} @@ -59,6 +60,7 @@ jobs: parameters: artifactName: Test Results - MSBuild - ${{ parameters.testOS }}-$(System.JobPositionInPhase) xaSourcePath: ${{ parameters.xaSourcePath }} + use1ESTemplate: ${{ parameters.use1ESTemplate }} - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self parameters: diff --git a/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml b/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml index 63bd8dddfd4..b61b495467e 100644 --- a/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml +++ b/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml @@ -13,6 +13,7 @@ parameters: usesCleanImages: true shouldFailOnIssue: true emulatorStartContinueOnError: false + use1ESTemplate: true stages: - stage: ${{ parameters.stageName }} @@ -70,6 +71,7 @@ stages: parameters: artifactName: Test Results - MSBuild With Emulator - macOS-$(System.JobPositionInPhase) xaSourcePath: ${{ parameters.xaSourcePath }} + use1ESTemplate: ${{ parameters.use1ESTemplate }} - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self parameters: @@ -141,6 +143,7 @@ stages: configuration: $(XA.Build.Configuration) artifactName: Test Results - Emulator $(avdApiLevel)-$(avdAbi)-$(avdType) - macOS xaSourcePath: ${{ parameters.xaSourcePath }} + use1ESTemplate: ${{ parameters.use1ESTemplate }} - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml@self parameters: diff --git a/build-tools/automation/yaml-templates/stage-msbuild-tests.yaml b/build-tools/automation/yaml-templates/stage-msbuild-tests.yaml index a9eff7fb75a..a00eb91295e 100644 --- a/build-tools/automation/yaml-templates/stage-msbuild-tests.yaml +++ b/build-tools/automation/yaml-templates/stage-msbuild-tests.yaml @@ -9,6 +9,7 @@ parameters: repositoryAlias: 'self' commit: '' shouldFailOnIssue: true + use1ESTemplate: true stages: - stage: ${{ parameters.stageName }} @@ -26,6 +27,7 @@ stages: repositoryAlias: ${{ parameters.repositoryAlias }} commit: ${{ parameters.commit }} shouldFailOnIssue: ${{ parameters.shouldFailOnIssue }} + use1ESTemplate: ${{ parameters.use1ESTemplate }} - template: /build-tools/automation/yaml-templates/run-msbuild-tests.yaml@self parameters: @@ -37,3 +39,4 @@ stages: repositoryAlias: ${{ parameters.repositoryAlias }} commit: ${{ parameters.commit }} shouldFailOnIssue: ${{ parameters.shouldFailOnIssue }} + use1ESTemplate: ${{ parameters.use1ESTemplate }} From fd76d80a18286c981127d767b86d54e2e3ec1471 Mon Sep 17 00:00:00 2001 From: Peter Collins Date: Mon, 15 Apr 2024 09:24:15 -0700 Subject: [PATCH 3/4] Remove setup-ubuntu ref --- build-tools/automation/yaml-templates/build-linux.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/build-tools/automation/yaml-templates/build-linux.yaml b/build-tools/automation/yaml-templates/build-linux.yaml index 1d7c9288391..ae1b454c38f 100644 --- a/build-tools/automation/yaml-templates/build-linux.yaml +++ b/build-tools/automation/yaml-templates/build-linux.yaml @@ -67,8 +67,6 @@ stages: workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android displayName: make prepare-external-git-dependencies - - template: setup-ubuntu.yaml - - task: NuGetAuthenticate@0 displayName: authenticate with azure artifacts inputs: From 132c1fa3682ceda789c9d2ea0a5902e4c1ed319a Mon Sep 17 00:00:00 2001 From: Peter Collins Date: Mon, 15 Apr 2024 09:41:21 -0700 Subject: [PATCH 4/4] Update policheck gdn --- .gdn/policheck/source.gdnsuppress | 35 ++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/.gdn/policheck/source.gdnsuppress b/.gdn/policheck/source.gdnsuppress index f73824769dc..f9f56338a57 100644 --- a/.gdn/policheck/source.gdnsuppress +++ b/.gdn/policheck/source.gdnsuppress @@ -9,10 +9,32 @@ "default": { "name": "default", "createdDate": "2023-02-22 23:55:29Z", - "lastUpdatedDate": "2024-02-22 21:40:38Z" + "lastUpdatedDate": "2024-04-15 16:33:16Z" } }, "results": { + "5a0a8690d8a06dfdbf6002c67fa64a60a94f3fc77a594034cce20382e88002aa": { + "signature": "5a0a8690d8a06dfdbf6002c67fa64a60a94f3fc77a594034cce20382e88002aa", + "alternativeSignatures": [ + "5c6188b6cec9a19a5e3b1c6b4a25fe79f1650edad0b9967c08983a33b57cdc2d" + ], + "memberOf": [ + "default" + ], + "justification": "Exclusion list includeded in external sources.", + "createdDate": "2024-04-15 16:33:16Z" + }, + "1b319055b8e507b220d0dab341e67e20f49632fd1844a08a4fcc6d4493930ac5": { + "signature": "1b319055b8e507b220d0dab341e67e20f49632fd1844a08a4fcc6d4493930ac5", + "alternativeSignatures": [ + "5c6188b6cec9a19a5e3b1c6b4a25fe79f1650edad0b9967c08983a33b57cdc2d" + ], + "memberOf": [ + "default" + ], + "justification": "Exclusion list includeded in external sources.", + "createdDate": "2024-04-15 16:33:16Z" + }, "6789cab1bdc97b0cc3ad057b7fdd21d63cdf8bc2679391923803fa240ef81292": { "signature": "6789cab1bdc97b0cc3ad057b7fdd21d63cdf8bc2679391923803fa240ef81292", "alternativeSignatures": [ @@ -156,6 +178,17 @@ "justification": "Reference to output from an external tool.", "createdDate": "2023-02-22 23:55:29Z" }, + "75474fa652dbbf8f96826100a5fe37ba686a032ca07d61ef68a79c8e4412c150": { + "signature": "75474fa652dbbf8f96826100a5fe37ba686a032ca07d61ef68a79c8e4412c150", + "alternativeSignatures": [ + "c78c3f8e456228997085b6409a12dce8b11eb5454a5588652225bc48a77d4662" + ], + "memberOf": [ + "default" + ], + "justification": "Exclusion list includeded in external sources.", + "createdDate": "2024-04-15 16:33:16Z" + }, "243e199c7aec22377e0363bdca82384278cc36b0674f35697935fde6c45cfd0e": { "signature": "243e199c7aec22377e0363bdca82384278cc36b0674f35697935fde6c45cfd0e", "alternativeSignatures": [