From a866dc4d86de027a39abaed22563a2fd053321c8 Mon Sep 17 00:00:00 2001 From: Leilei Zhang Date: Tue, 8 Jul 2025 22:46:10 +0800 Subject: [PATCH] support installer --- .../v2/templates/job-build-ui-tests.yml | 97 ++++++------------- .../UITestAutomation/ModuleConfigData.cs | 2 +- src/common/UITestAutomation/SessionHelper.cs | 7 +- 3 files changed, 36 insertions(+), 70 deletions(-) diff --git a/.pipelines/v2/templates/job-build-ui-tests.yml b/.pipelines/v2/templates/job-build-ui-tests.yml index e2eaee6ec7..23bbea9a94 100644 --- a/.pipelines/v2/templates/job-build-ui-tests.yml +++ b/.pipelines/v2/templates/job-build-ui-tests.yml @@ -22,9 +22,15 @@ parameters: - name: variables type: object default: {} - - name: uiTestProjectPattern - type: string - default: '*UITest*.csproj' + - name: uiTestProjectsToBuild + type: object + default: + - 'src/modules/fancyzones/UITests-FancyZones/UITests-FancyZones.csproj' + - 'src/modules/fancyzones/UITests-FancyZonesEditor/UITests-FancyZonesEditor.csproj' + - 'src/modules/MouseUtils/MouseUtils.UITests/MouseUtils.UITests.csproj' + - 'src/modules/Workspaces/WorkspacesEditorUITest/WorkspacesEditorUITest.csproj' + - 'src/modules/imageresizer/tests/ImageResizerUITest.csproj' + - 'src/modules/Hosts/Hosts.UITests/Hosts.UITests.csproj' jobs: - job: BuildUITests @@ -42,7 +48,7 @@ jobs: variables: JobOutputDirectory: $(Build.ArtifactStagingDirectory) LogOutputDirectory: $(Build.ArtifactStagingDirectory)\logs - JobOutputArtifactName: build-uitests-$(BuildPlatform)-$(BuildConfiguration) + JobOutputArtifactName: build-$(BuildPlatform)-$(BuildConfiguration) NUGET_RESTORE_MSBUILD_ARGS: /p:Platform=$(BuildPlatform) ${{ insert }}: ${{ parameters.variables }} displayName: Build UI Tests Only @@ -77,70 +83,25 @@ jobs: restoreSolution: PowerToys.sln restoreDirectory: '$(Build.SourcesDirectory)\packages' - # Dynamically discover and build UI test projects - - pwsh: | - $uiTestProjects = @() - - # Search for UI test projects using the pattern - $projectFiles = Get-ChildItem -Path "$(Build.SourcesDirectory)" -Filter "${{ parameters.uiTestProjectPattern }}" -Recurse - - Write-Host "Found $($projectFiles.Count) UI test projects:" - foreach ($project in $projectFiles) { - $relativePath = $project.FullName.Replace("$(Build.SourcesDirectory)\", "").Replace("\", "/") - Write-Host " - $relativePath" - $uiTestProjects += $relativePath - } - - if ($uiTestProjects.Count -eq 0) { - Write-Host "##vso[task.logissue type=warning]No UI test projects found with pattern: ${{ parameters.uiTestProjectPattern }}" - exit 0 - } - - # Build each discovered project - foreach ($project in $uiTestProjects) { - Write-Host "Building project: $project" - - # Generate safe artifact name for logging - $artifactName = $project -replace '[/\\]', '_' -replace '\.csproj$', '' - - # Use VSBuild for consistency with the main build pipeline - $msbuildArgs = @( - "-restore", - "-graph", - "/p:RestorePackagesConfig=true", - "/p:BuildProjectReferences=true", - "/p:CIBuild=true", - "/bl:$(LogOutputDirectory)\build-$artifactName.binlog", - "$(NUGET_RESTORE_MSBUILD_ARGS)" - ) - - $arguments = @{ - 'FilePath' = 'dotnet' - 'ArgumentList' = @( - 'build', - $project, - '--configuration', '$(BuildConfiguration)', - '--verbosity', 'minimal' - ) + $msbuildArgs - 'WorkingDirectory' = '$(Build.SourcesDirectory)' - 'NoNewWindow' = $true - 'Wait' = $true - 'PassThru' = $true - } - - $process = Start-Process @arguments - - if ($process.ExitCode -ne 0) { - Write-Host "##vso[task.logissue type=error]Build failed for project: $project" - exit $process.ExitCode - } - - Write-Host "Successfully built: $project" - } - - Write-Host "All UI test projects built successfully!" - displayName: Discover and Build UI Test Projects - workingDirectory: $(Build.SourcesDirectory) + # Build only UI test projects + - ${{ each project in parameters.uiTestProjectsToBuild }}: + - task: VSBuild@1 + displayName: Build UI Test Project ${{ project }} + inputs: + solution: ${{ project }} + vsVersion: 17.0 + msbuildArgs: >- + -restore + -graph + /p:RestorePackagesConfig=true + /p:BuildProjectReferences=true + /p:CIBuild=true + /bl:$(LogOutputDirectory)\build-${{ join('_',split(project, '/')) }}.binlog + $(NUGET_RESTORE_MSBUILD_ARGS) + platform: $(BuildPlatform) + configuration: $(BuildConfiguration) + msbuildArchitecture: x64 + maximumCpuCount: true # Stage test project outputs with directory structure - task: CopyFiles@2 diff --git a/src/common/UITestAutomation/ModuleConfigData.cs b/src/common/UITestAutomation/ModuleConfigData.cs index 8008fa644a..e5098d21e7 100644 --- a/src/common/UITestAutomation/ModuleConfigData.cs +++ b/src/common/UITestAutomation/ModuleConfigData.cs @@ -137,7 +137,7 @@ namespace Microsoft.PowerToys.UITest { @"C:\Program Files\PowerToys", @"C:\Program Files (x86)\PowerToys", - Environment.ExpandEnvironmentVariables(@"%LocalAppData%\Microsoft\PowerToys"), + Environment.ExpandEnvironmentVariables(@"%LocalAppData%\PowerToys"), Environment.ExpandEnvironmentVariables(@"%ProgramFiles%\PowerToys"), }; diff --git a/src/common/UITestAutomation/SessionHelper.cs b/src/common/UITestAutomation/SessionHelper.cs index 44633f45c1..56736f1525 100644 --- a/src/common/UITestAutomation/SessionHelper.cs +++ b/src/common/UITestAutomation/SessionHelper.cs @@ -33,12 +33,17 @@ namespace Microsoft.PowerToys.UITest private PowerToysModule scope; + private bool UseInstallerForTest { get; } + [UnconditionalSuppressMessage("SingleFile", "IL3000:Avoid accessing Assembly file path when publishing as a single file", Justification = "")] public SessionHelper(PowerToysModule scope) { this.scope = scope; this.sessionPath = ModuleConfigData.Instance.GetModulePath(scope); - this.locationPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + string? useInstallerForTestEnv = + Environment.GetEnvironmentVariable("useInstallerForTest") ?? Environment.GetEnvironmentVariable("USEINSTALLERFORTEST"); + UseInstallerForTest = !string.IsNullOrEmpty(useInstallerForTestEnv) && bool.TryParse(useInstallerForTestEnv, out bool result) && result; + this.locationPath = UseInstallerForTest ? string.Empty : Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); CheckWinAppDriverAndRoot();