diff --git a/.vscode/settings.json b/.vscode/settings.json index 32396765d..eb0574154 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,6 @@ { - "dotnet.defaultSolution": "Uno.Gallery.sln" -} \ No newline at end of file + "dotnet.defaultSolution": "Uno.Gallery.csproj", + "[yaml]": { + "editor.formatOnSave": false + } +} diff --git a/build/scripts/collect-metrics-build.sh b/build/scripts/collect-metrics-build.sh new file mode 100644 index 000000000..cf7c758e7 --- /dev/null +++ b/build/scripts/collect-metrics-build.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +if [ -z "$1" ]; then + echo "Usage: $0 " + exit 1 +fi + +if [ -z "$2" ]; then + echo "Usage: $0 " + exit 1 +fi + +if [ -z "$3" ]; then + echo "Usage: $0 " + exit 1 +fi + +ARTIFACT_DIRECTORY="$1" +PACKAGE_FOLDER="$2" +PLATFORM="$3" +METRICS_FOLDER="$ARTIFACT_DIRECTORY/metrics" + + +mkdir -p "$METRICS_FOLDER" + +echo "[] Target folder: $ARTIFACT_DIRECTORY exists" +echo "[] Measuring package size..." + +size_bytes=$(du -sb "$PACKAGE_FOLDER" | cut -f1) +size_mib=$((size_bytes / 1024 / 1024)) + +timestamp=$(date '+%d/%m/%Y %H:%M:%S') + +echo "[] Writing output to metrics.json in $METRICS_FOLDER" + +cat < "$METRICS_FOLDER/metrics.json" +{ + "app": "Uno.Gallery", + "platform": "${PLATFORM: -unknown}", + "buildId": "${BUILD_ID:-unknown}", + "commit": "${SOURCE_VERSION:-unknown}", + "size": "${size_mib}", + "isTrimmed": false, + "timeStamp": "${timestamp}" +} +EOF diff --git a/build/stage-build-android-mobile.yml b/build/stage-build-android-mobile.yml index b7fa3a31c..d244719fb 100644 --- a/build/stage-build-android-mobile.yml +++ b/build/stage-build-android-mobile.yml @@ -43,9 +43,22 @@ steps: OverWrite: false flattenFolders: false - - task: PublishBuildArtifacts@1 retryCountOnTaskFailure: 3 condition: always() inputs: ArtifactName: android-mobile-$(VariantName) + +- template: templates/performance/collect-performance-metrics.yml + parameters: + ArtifactDirectory: $(Build.ArtifactStagingDirectory)/ + PackageFolder: $(Build.sourcesdirectory)/Uno.Gallery/bin/Release/net9.0-android + ScriptPath: $(build.sourcesdirectory)/build/scripts/collect-metrics-build.sh + Platform: android-mobile + +- task: PublishBuildArtifacts@1 + displayName: Publish build metrics + inputs: + pathToPublish: $(Build.ArtifactStagingDirectory)/metrics + ArtifactName: build-metrics-android-mobile + condition: succeededOrFailed() diff --git a/build/stage-build-mobile.yml b/build/stage-build-mobile.yml index 70ea7a8de..8dab54896 100644 --- a/build/stage-build-mobile.yml +++ b/build/stage-build-mobile.yml @@ -57,3 +57,17 @@ steps: condition: always() inputs: ArtifactName: $(ArtifactName)-$(VariantName)-logs + +- template: templates/performance/collect-performance-metrics.yml + parameters: + ArtifactDirectory: $(Build.ArtifactStagingDirectory)/ + PackageFolder: $(Build.ArtifactStagingDirectory)/com.nventive.uno.ui.demo-Signed.apk + ScriptPath: $(build.sourcesdirectory)/build/scripts/collect-metrics-build.sh + Platform: mobile + +- task: PublishBuildArtifacts@1 + displayName: Publish build metrics + inputs: + pathToPublish: $(Build.ArtifactStagingDirectory)/metrics + ArtifactName: build-metrics-mobile + condition: succeededOrFailed() \ No newline at end of file diff --git a/build/stage-build-skia-desktop.yml b/build/stage-build-skia-desktop.yml index 4187d99be..e7ffb4218 100644 --- a/build/stage-build-skia-desktop.yml +++ b/build/stage-build-skia-desktop.yml @@ -9,7 +9,11 @@ steps: - template: templates/canary-updater.yml - bash: | - dotnet build Uno.Gallery/Uno.Gallery.csproj -p:TargetFrameworkOverride=net9.0-desktop -c Release -p:InformationalVersion=$(NBGV_InformationalVersion) -bl:$(build.artifactstagingdirectory)/build.binlog + dotnet build Uno.Gallery/Uno.Gallery.csproj \ + -p:TargetFrameworkOverride=net9.0-desktop \ + -c Release \ + -p:InformationalVersion=$(NBGV_InformationalVersion) \ + -bl:$(Build.ArtifactStagingDirectory)/build.binlog - task: CopyFiles@2 displayName: Copy Skia output @@ -19,6 +23,65 @@ steps: TargetFolder: $(Build.ArtifactStagingDirectory)/bin - task: PublishBuildArtifacts@1 + displayName: Publish desktop artifacts retryCountOnTaskFailure: 3 inputs: + pathToPublish: $(Build.ArtifactStagingDirectory)/bin ArtifactName: desktop + +- template: templates/performance/collect-performance-metrics.yml + parameters: + ArtifactDirectory: $(Build.ArtifactStagingDirectory)/ + PackageFolder: $(Build.sourcesdirectory)/Uno.Gallery/bin/Release/net9.0-desktop + ScriptPath: $(build.sourcesdirectory)/build/scripts/collect-metrics-build.sh + Platform: skia-desktop + +# - task: PublishBuildArtifacts@1 +# displayName: Publish build metrics +# inputs: +# pathToPublish: $(Build.ArtifactStagingDirectory)/metrics +# ArtifactName: build-metrics-skia-desktop +# condition: succeededOrFailed() + +- download: none + +- bash: | + dotnet tool install --global dotnet-counters + export PATH="$PATH:~/.dotnet/tools" + displayName: Install dotnet-counters + +- task: DownloadPipelineArtifact@2 + inputs: + artifactName: 'desktop' + targetPath: '$(Pipeline.Workspace)/drop' + displayName: Download artifact + +- bash: | + export PATH="$PATH:~/.dotnet/tools" + APP_PATH="$(Pipeline.Workspace)/drop/Uno.Gallery.exe" + + chmod +x "$APP_PATH" + + # Run app in background + "$APP_PATH" & + APP_PID=$! + + echo "App started with PID $APP_PID" + sleep 5 + + # Run dotnet-counters + dotnet-counters collect \ + -p $APP_PID \ + --duration 10 \ + --output "$(Build.ArtifactStagingDirectory)/metrics" + + # Kill the app after profiling + kill $APP_PID + displayName: Run and profile app + +- task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)/metrics + ArtifactName: 'performance-counters' + publishLocation: 'Container' + displayName: Publish performance counters \ No newline at end of file diff --git a/build/stage-build-wasm.yml b/build/stage-build-wasm.yml index f1611b586..391d266f0 100644 --- a/build/stage-build-wasm.yml +++ b/build/stage-build-wasm.yml @@ -24,3 +24,17 @@ inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: $(ArtifactName)-logs + +- template: templates/performance/collect-performance-metrics.yml + parameters: + ArtifactDirectory: $(Agent.TempDirectory)/ + PackageFolder: $(Agent.TempDirectory)/wasm-publish/wwwroot/ + ScriptPath: $(build.sourcesdirectory)/build/scripts/collect-metrics-build.sh + Platform: browserwasm + +- task: PublishBuildArtifacts@1 + displayName: Publish build metrics + inputs: + pathToPublish: $(Agent.TempDirectory)/metrics + ArtifactName: build-metrics-wasm + condition: succeededOrFailed() \ No newline at end of file diff --git a/build/stage-build-windows.yml b/build/stage-build-windows.yml index 8945c1615..f95c27e1c 100644 --- a/build/stage-build-windows.yml +++ b/build/stage-build-windows.yml @@ -38,3 +38,18 @@ steps: retryCountOnTaskFailure: 3 inputs: ArtifactName: windows + +- template: templates/performance/collect-performance-metrics.yml + parameters: + ArtifactDirectory: $(Build.ArtifactStagingDirectory)/ + PackageFolder: $(build.sourcesdirectory)/Uno.Gallery/Packages/ + ScriptPath: $(build.sourcesdirectory)/build/scripts/collect-metrics-build.sh + Platform: windows + +- task: PublishBuildArtifacts@1 + displayName: Publish build metrics + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)/metrics + ArtifactName: build-metrics-windows + condition: succeededOrFailed() + diff --git a/build/stage-diagnostic-skia-desktop-canary.yml b/build/stage-diagnostic-skia-desktop-canary.yml new file mode 100644 index 000000000..eec674459 --- /dev/null +++ b/build/stage-diagnostic-skia-desktop-canary.yml @@ -0,0 +1,48 @@ +steps: +- checkout: self + clean: true + fetchDepth: 0 + persistCredentials: true + +- download: none + +- script: | + dotnet tool install --global dotnet-counters + export PATH="$PATH:~/.dotnet/tools" + displayName: Install dotnet-counters + + +- task: DownloadPipelineArtifact@2 + inputs: + artifactName: 'desktop' + targetPath: '$(Pipeline.Workspace)/drop' + displayName: Download artifact +- script: | + export PATH="$PATH:~/.dotnet/tools" + APP_PATH="$(Pipeline.Workspace)/drop/desktop/bin/Uno.Gallery.exe" + + chmod +x "$APP_PATH" + + # Run app in background + "$APP_PATH" & + APP_PID=$! + + echo "App started with PID $APP_PID" + sleep 5 + + # Run dotnet-counters + dotnet-counters collect \ + -p $APP_PID \ + --duration 10 \ + --output $(Pipeline.Workspace)/counters.csv + + # Kill the app after profiling + kill $APP_PID + displayName: Run and profile app + +- task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: '$(Pipeline.Workspace)/counters.csv' + ArtifactName: 'performance-counters' + publishLocation: 'Container' + displayName: Publish performance counters \ No newline at end of file diff --git a/build/stage-uitests-android.yml b/build/stage-uitests-android.yml index c8949bbcd..20e0d16de 100644 --- a/build/stage-uitests-android.yml +++ b/build/stage-uitests-android.yml @@ -94,3 +94,4 @@ PathtoPublish: $(build.artifactstagingdirectory) ArtifactName: uno-uitest-tests ArtifactType: Container + diff --git a/build/templates/canary-publish/stage-publish-android-canary.yml b/build/templates/canary-publish/stage-publish-android-canary.yml index b17c3af39..d3b1c3611 100644 --- a/build/templates/canary-publish/stage-publish-android-canary.yml +++ b/build/templates/canary-publish/stage-publish-android-canary.yml @@ -1,6 +1,6 @@ stages: - stage: Android_Publish - displayName: 'Android Publish' + displayName: 'Android Publish (Canary)' dependsOn: Android jobs: @@ -26,8 +26,8 @@ displayName: 'Play Store Publish' inputs: serviceConnection: 'Uno Platform Google Play' - applicationId: 'uno.platform.gallery.native_canary' - bundleFile: '$(Pipeline.Workspace)/drop/publish/uno.platform.gallery.skia_canary-Signed.aab' + applicationId: 'uno.platform.gallery_native_canary' + bundleFile: '$(Pipeline.Workspace)/drop/publish/uno.platform.gallery_native_canary-Signed.aab' track: 'alpha' - deployment: 'Android_Publish_Skia' diff --git a/build/templates/canary-publish/stage-publish-catalyst-canary.yml b/build/templates/canary-publish/stage-publish-catalyst-canary.yml index 29f706064..6cf734259 100644 --- a/build/templates/canary-publish/stage-publish-catalyst-canary.yml +++ b/build/templates/canary-publish/stage-publish-catalyst-canary.yml @@ -1,6 +1,6 @@ stages: - stage: Catalyst_Publish - displayName: 'Catalyst Publish' + displayName: 'Catalyst Publish (Canary)' dependsOn: Apple jobs: diff --git a/build/templates/canary-publish/stage-publish-ios-canary.yml b/build/templates/canary-publish/stage-publish-ios-canary.yml index c8e4cce64..2ccb9fed3 100644 --- a/build/templates/canary-publish/stage-publish-ios-canary.yml +++ b/build/templates/canary-publish/stage-publish-ios-canary.yml @@ -1,6 +1,6 @@ stages: - stage: iOS_Publish - displayName: 'iOS Publish' + displayName: 'iOS Publish (Canary)' dependsOn: Apple jobs: diff --git a/build/templates/canary-publish/stage-publish-wasm-canary.yml b/build/templates/canary-publish/stage-publish-wasm-canary.yml index dfd1e3b91..e928f614e 100644 --- a/build/templates/canary-publish/stage-publish-wasm-canary.yml +++ b/build/templates/canary-publish/stage-publish-wasm-canary.yml @@ -1,6 +1,6 @@ stages: - stage: WebAssembly_Publish - displayName: 'WebAssembly' + displayName: 'WebAssembly (Canary)' dependsOn: WebAssembly jobs: @@ -30,7 +30,7 @@ skip_api_build: true is_static_export: false verbose: false - azure_static_web_apps_api_token: '$(PROD_SWA_TOKEN)' + azure_static_web_apps_api_token: '$(DEV_SWA_TOKEN)' deployment_environment: 'canary-dom' - deployment: 'WebAssembly_Publish_SKIA' @@ -59,5 +59,5 @@ skip_api_build: true is_static_export: false verbose: false - azure_static_web_apps_api_token: '$(PROD_SWA_TOKEN)' + azure_static_web_apps_api_token: '$(DEV_SWA_TOKEN)' deployment_environment: 'canary-skia' diff --git a/build/templates/canary-updater.yml b/build/templates/canary-updater.yml index 607a5e12a..342d7e704 100644 --- a/build/templates/canary-updater.yml +++ b/build/templates/canary-updater.yml @@ -13,22 +13,6 @@ steps: packageAuthor: 'nventive,uno platform' summaryFile: '$(Build.ArtifactStagingDirectory)/Canary.md' - - task: unoplatformCanaryUpdater@1 - displayName: 'Canary Update (skia-everywhere)' - condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries/skia-everywhere') - inputs: - solution: '$(build.sourcesdirectory)' - usePrivateFeed: false - useNuGetOrg: true - mergeBranch: true - branchToMerge: master - nugetUpdaterVersion: '1.2.10' - nugetVersion: dev - packageAuthor: 'nventive,unoplatform,uno platform' - summaryFile: '$(Build.ArtifactStagingDirectory)/Summary.md' - resultFile: '$(Build.ArtifactStagingDirectory)/Results.json' - # additionalPublicSources: 'https://pkgs.dev.azure.com/uno-platform/1dd81cbd-cb35-41de-a570-b0df3571a196/_packaging/Features/nuget/v3/index.json' - #- pwsh: | # cd $(build.sourcesdirectory) # dotnet nuget add source https://pkgs.dev.azure.com/uno-platform/1dd81cbd-cb35-41de-a570-b0df3571a196/_packaging/Features/nuget/v3/index.json -n unofeatures @@ -51,25 +35,33 @@ steps: gci -r -include "Uno.Gallery.csproj" | foreach-object { $a = $_.fullname; ( get-content $a ) | - foreach-object { $_ -replace "uno.platform.gallery.skia","uno.platform.gallery.skia-canary" } | + foreach-object { $_ -replace "uno\.platform\.gallery\.native","uno.platform.gallery.native-canary" } | + set-content $a } + displayName: 'Adjust App ID (skia)' + condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries') + - pwsh: | + gci -r -include "Uno.Gallery.csproj" | + foreach-object { + $a = $_.fullname; ( get-content $a ) | + foreach-object { $_ -replace "uno\.platform\.gallery_native","uno.platform.gallery_native-canary" } | set-content $a } - displayName: 'Adjust info.plist bundle name (skia)' + displayName: 'Adjust App ID (Android Native)' condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries') - pwsh: | gci -r -include "Uno.Gallery.csproj" | foreach-object { $a = $_.fullname; ( get-content $a ) | - foreach-object { $_ -replace "com.nventive.uno.ui.demo","com.nventive.uno.ui.demo.canary" } | + foreach-object { $_ -replace "com\.nventive\.uno\.ui\.demo","com.nventive.uno.ui.demo.canary" } | set-content $a } - displayName: 'Adjust info.plist bundle name (Android)' + displayName: 'Adjust App ID (Android Skia)' condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries') - pwsh: | gci -r -include "Uno.Gallery.csproj" | foreach-object { $a = $_.fullname; ( get-content $a ) | - foreach-object { $_ -replace "com.nventive.uno.gallery","com.nventive.uno.gallery-canary" } | + foreach-object { $_ -replace "com\.nventive\.uno\.gallery","com.nventive.uno.gallery-canary" } | set-content $a } - displayName: 'Adjust info.plist bundle name (Catalyst)' + displayName: 'Adjust App ID (Catalyst)' condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries') diff --git a/build/templates/performance/collect-performance-metrics.yml b/build/templates/performance/collect-performance-metrics.yml new file mode 100644 index 000000000..d77b04e87 --- /dev/null +++ b/build/templates/performance/collect-performance-metrics.yml @@ -0,0 +1,23 @@ +parameters: + ArtifactDirectory: '' + PackageFolder: '' + ScriptPath: '' + Platform: '' + +steps: +- bash: | + chmod +x "${{ parameters.ScriptPath }}" + BUILD_ID=$(Build.BuildId) + SOURCE_VERSION=$(Build.SourceVersion) + "${{ parameters.ScriptPath }}" "${{ parameters.ArtifactDirectory }}" "${{ parameters.PackageFolder }}" "${{ parameters.Platform }}" + displayName: Generate metrics JSON + env: + BUILD_ID: $(Build.BuildId) + SOURCE_VERSION: $(Build.SourceVersion) + +- bash: | + curl -X POST -H "Content-Type: application/json" \ + -d "@${{ parameters.ArtifactDirectory }}/metrics/metrics.json" \ + https://657b-148-113-220-6.ngrok-free.app/publish-metrics + displayName: Send metrics to node server +