mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-08-29 10:09:43 +02:00
## Summary - Publish scheduled `main` builds as GitHub prereleases while keeping manual `main` runs as preview validation builds. - Add an opt-in Settings switch for prerelease update checks; stable updates remain the default. - Use one MSI-safe version across bundles, MSI packages, binaries, symbols, and package manifests. - Prevent preview releases from triggering Microsoft Store, WinGet, or public-symbol publication. - Label preview builds explicitly in Settings, update notifications, and What's New. ## Build intent | Source | Trigger | Intent | | --- | --- | --- | | `main` | Scheduled | Publish a preview release | | `main` | Manual | Validate a preview build without publishing | | `stable` | Manual | Produce a stable release | | Other branches | Any supported trigger | Produce a private validation build | ## MSI-safe release versioning Windows Installer compares only `major.minor.build` and ignores the fourth version component. Preview and stable release builds therefore use: ```text major.minor.YDDDB.0 ``` - `Y`: zero-based number of calendar years since `ReleaseTrainEpoch`. - `DDD`: three-position calendar day of year. - `B`: daily release sequence `1-9`. - The fourth component is always `0`. With `ReleaseTrainVersion=0.100` and `ReleaseTrainEpoch=2026-01-01`: ```text 0.100.2111.0 = July 30, 2026, release build 1 0.100.3659.0 = December 31, 2026, release build 9 0.100.10011.0 = January 1, 2027, release build 1 ``` The allocator formats `DDD` as exactly three digits before converting the MSI component to its numeric representation. Leading zeros may not be displayed because Windows version components are numeric; decoding remains positional: ```text B = component % 10 DDD = (component / 10) % 1000 Y = component / 10000 ``` `ReleaseTrainVersion` and `ReleaseTrainEpoch` are checked in under `src/Version.props`. The epoch remains January 1 of the active epoch year and advances on the first release-train minor change in a new year. ## Daily release counter Azure DevOps persists the daily sequence server-side using a counter keyed as `release-YYYYMMDD`. - `main` and `stable` share the same daily counter. - Other branches do not evaluate or consume the release counter. - Failed or canceled `main`/`stable` runs may leave gaps. - The build fails when the daily sequence exceeds `9`. - The counter date and encoded `YDDD` date both use `pipeline.startTime`. Private branches retain independent `0.0.<extended-day><NN>.0` validation versions. ## Update behavior - Stable users continue to query GitHub's stable latest-release path. - Users who explicitly enable preview updates can select newer GitHub prereleases. - Preview releases and notifications are labeled as PowerToys Preview. - What's New separates preview entries from stable release history and hides previews by default. ## Validation - 17 Pester tests cover `main`, `stable`, private branches, year rollover, epoch reset, monotonicity, override validation, sequence limits, and date alignment. - Version propagation verified `0.100.2111.0` in `Version.props` and all affected AppX/MSIX manifests. - Azure DevOps pipeline dry-runs succeeded for both `refs/heads/main` and `refs/heads/stable`. - The affected native version project builds successfully. - PR CI is green for x64, ARM64, Command Palette SDK, dependency review, telemetry detection, and CLA. ## Remaining end-to-end checks - Install two locally or officially produced installers with consecutive MSI-visible `YDDDB` versions and verify the upgrade preserves binaries, package registrations, hardlinks, and shell integrations. - On the first natural post-merge `main` or `stable` run, verify the production counter value and resolved version in the release logs. ## Local GPO verification Validated locally with the signed `v0.100.2171` build from Azure DevOps build [153961073](https://microsoft.visualstudio.com/Dart/_build/results?buildId=153961073). These checks cover the administrative-template integration and Settings behavior. ### Policy enabled: preview updates are disabled With `PreviewUpdatesDisabled=1`, **Include prerelease updates** is forced off and locked, and Settings displays the managed-by-your-organization notice.  ### Policy removed: the user preference is preserved After removing `PreviewUpdatesDisabled` and restarting PowerToys, the previously selected preview-update preference is restored and editable. The policy suppresses the preference without overwriting it.  ### Group Policy Editor After importing the updated ADMX/ADML templates, **Disable preview build updates** appears under **Microsoft PowerToys > Installer and Updates**. The policy dialog documents that **Enabled** blocks preview updates, while **Disabled** or **Not Configured** leaves the choice available to the user.  --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ad8b7909-0472-4464-bdee-deaeca726f94 Copilot-Session: 8e04a72e-3b0f-4ac4-8156-d04ea9b8bb85
184 lines
10 KiB
XML
184 lines
10 KiB
XML
<Project Sdk="WixToolset.Sdk/5.0.2">
|
|
<Import Project="..\..\src\CmdPalVersion.props" Condition="Exists('..\..\src\CmdPalVersion.props')" />
|
|
<PropertyGroup>
|
|
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
|
|
</PropertyGroup>
|
|
<PropertyGroup>
|
|
<DscModuleVersionSuffix Condition="$([System.Text.RegularExpressions.Regex]::IsMatch('$(Version)', '^\d+\.\d+\.\d+$'))">.0</DscModuleVersionSuffix>
|
|
<DscModuleVersionSuffix Condition="'$(DscModuleVersionSuffix)' == ''"></DscModuleVersionSuffix>
|
|
<DscModuleVersion>$(Version)$(DscModuleVersionSuffix)</DscModuleVersion>
|
|
</PropertyGroup>
|
|
<PropertyGroup Condition="'$(Platform)' == 'x64'">
|
|
<DefineConstants>Version=$(Version);DscModuleVersion=$(DscModuleVersion);MonacoSRCHarvestPath=$(ProjectDir)..\..\x64\$(Configuration)\Assets\Monaco\monacoSRC;CmdPalVersion=$(CmdPalVersion)</DefineConstants> <!-- THIS IS AN INNER LOOP OPTIMIZATION
|
|
The build pipeline builds the Settings and Launcher projects for Publication
|
|
using a specific profile. If you're doing local installer builds, this will
|
|
simulate the build pipeline doing that for you. -->
|
|
<PreBuildEvent>IF NOT DEFINED IsPipeline (
|
|
call "$([MSBuild]::GetVsInstallRoot())\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 -winsdk=10.0.19041.0 -vcvars_ver=$(VCToolsVersion)
|
|
SET PTRoot=$(SolutionDir)\..
|
|
call "..\..\..\publish.cmd" x64
|
|
)
|
|
call powershell.exe -NonInteractive -executionpolicy Unrestricted -File $(MSBuildThisFileDirectory)\generateMonacoWxs.ps1 -monacoWxsFile "$(MSBuildThisFileDirectory)\MonacoSRC.wxs" -Platform "$(Platform)" -nugetHeatPath "$(NUGET_PACKAGES)\wixtoolset.heat\5.0.2"
|
|
</PreBuildEvent>
|
|
</PropertyGroup>
|
|
<PropertyGroup Condition="'$(Platform)' != 'x64'">
|
|
<DefineConstants>Version=$(Version);DscModuleVersion=$(DscModuleVersion);MonacoSRCHarvestPath=$(ProjectDir)..\..\ARM64\$(Configuration)\Assets\Monaco\monacoSRC;CmdPalVersion=$(CmdPalVersion)</DefineConstants>
|
|
<PreBuildEvent>IF NOT DEFINED IsPipeline (
|
|
call "$([MSBuild]::GetVsInstallRoot())\Common7\Tools\VsDevCmd.bat" -arch=arm64 -host_arch=amd64 -winsdk=10.0.19041.0 -vcvars_ver=$(VCToolsVersion)
|
|
SET PTRoot=$(SolutionDir)\..
|
|
call "..\..\..\publish.cmd" arm64
|
|
)
|
|
call powershell.exe -NonInteractive -executionpolicy Unrestricted -File $(MSBuildThisFileDirectory)\generateMonacoWxs.ps1 -monacoWxsFile "$(MSBuildThisFileDirectory)\MonacoSRC.wxs" -Platform "$(Platform)" -nugetHeatPath "$(NUGET_PACKAGES)\wixtoolset.heat\5.0.2"
|
|
</PreBuildEvent>
|
|
</PropertyGroup>
|
|
<PropertyGroup>
|
|
<RunPostBuildEvent>Always</RunPostBuildEvent>
|
|
<PostBuildEvent>
|
|
call move /Y ..\..\..\AdvancedPaste.wxs.bk ..\..\..\AdvancedPaste.wxs
|
|
call move /Y ..\..\..\Awake.wxs.bk ..\..\..\Awake.wxs
|
|
call move /Y ..\..\..\BaseApplications.wxs.bk ..\..\..\BaseApplications.wxs
|
|
call move /Y ..\..\..\CmdPal.wxs.bk ..\..\..\CmdPal.wxs
|
|
call move /Y ..\..\..\ColorPicker.wxs.bk ..\..\..\ColorPicker.wxs
|
|
call move /Y ..\..\..\Core.wxs.bk ..\..\..\Core.wxs
|
|
call move /Y ..\..\..\DscResources.wxs.bk ..\..\..\DscResources.wxs
|
|
call move /Y ..\..\..\EnvironmentVariables.wxs.bk ..\..\..\EnvironmentVariables.wxs
|
|
call move /Y ..\..\..\FileExplorerPreview.wxs.bk ..\..\..\FileExplorerPreview.wxs
|
|
call move /Y ..\..\..\FileLocksmith.wxs.bk ..\..\..\FileLocksmith.wxs
|
|
call move /Y ..\..\..\Hosts.wxs.bk ..\..\..\Hosts.wxs
|
|
call move /Y ..\..\..\LightSwitch.wxs.bk ..\..\..\LightSwitch.wxs
|
|
call move /Y ..\..\..\ImageResizer.wxs.bk ..\..\..\ImageResizer.wxs
|
|
call move /Y ..\..\..\KeyboardManager.wxs.bk ..\..\..\KeyboardManager.wxs
|
|
call move /Y ..\..\..\MouseWithoutBorders.wxs.bk ..\..\..\MouseWithoutBorders.wxs
|
|
call move /Y ..\..\..\NewPlus.wxs.bk ..\..\..\NewPlus.wxs
|
|
call move /Y ..\..\..\Peek.wxs.bk ..\..\..\Peek.wxs
|
|
call move /Y ..\..\..\PowerRename.wxs.bk ..\..\..\PowerRename.wxs
|
|
call move /Y ..\..\..\PowerDisplay.wxs.bk ..\..\..\PowerDisplay.wxs
|
|
call move /Y ..\..\..\Product.wxs.bk ..\..\..\Product.wxs
|
|
call move /Y ..\..\..\RegistryPreview.wxs.bk ..\..\..\RegistryPreview.wxs
|
|
call move /Y ..\..\..\Resources.wxs.bk ..\..\..\Resources.wxs
|
|
call move /Y ..\..\..\Run.wxs.bk ..\..\..\Run.wxs
|
|
call move /Y ..\..\..\Settings.wxs.bk ..\..\..\Settings.wxs
|
|
call move /Y ..\..\..\ShortcutGuide.wxs.bk ..\..\..\ShortcutGuide.wxs
|
|
call move /Y ..\..\..\Tools.wxs.bk ..\..\..\Tools.wxs
|
|
call move /Y ..\..\..\WinAppSDK.wxs.bk ..\..\..\WinAppSDK.wxs
|
|
call move /Y ..\..\..\WinUI3Applications.wxs.bk ..\..\..\WinUI3Applications.wxs
|
|
call move /Y ..\..\..\Workspaces.wxs.bk ..\..\..\Workspaces.wxs
|
|
</PostBuildEvent>
|
|
</PropertyGroup>
|
|
<PropertyGroup Condition="'$(RunBuildEvents)'=='false'">
|
|
<PostBuildEvent></PostBuildEvent>
|
|
<RunPostBuildEvent></RunPostBuildEvent>
|
|
<PreBuildEventUseInBuild>false</PreBuildEventUseInBuild>
|
|
<PostBuildEventUseInBuild>false</PostBuildEventUseInBuild>
|
|
</PropertyGroup>
|
|
<PropertyGroup Label="UserMacros" Condition=" '$(PerUser)' == 'true' ">
|
|
<DefineConstants>$(DefineConstants);PerUser=true</DefineConstants>
|
|
</PropertyGroup>
|
|
<PropertyGroup Label="UserMacros" Condition=" '$(PerUser)' != 'true' ">
|
|
<DefineConstants>$(DefineConstants);PerUser=false</DefineConstants>
|
|
</PropertyGroup>
|
|
<PropertyGroup Label="UserMacros" Condition=" '$(CIBuild)' == 'true' ">
|
|
<DefineConstants>$(DefineConstants);CIBuild=true</DefineConstants>
|
|
</PropertyGroup>
|
|
<PropertyGroup Label="UserMacros" Condition=" '$(CIBuild)' != 'true' ">
|
|
<DefineConstants>$(DefineConstants);CIBuild=false</DefineConstants>
|
|
</PropertyGroup>
|
|
<PropertyGroup>
|
|
<Name>PowerToysVNextInstaller</Name>
|
|
<!-- We do not support debug installer builds -->
|
|
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
|
|
<Platform>$(Platform)</Platform>
|
|
<ProductVersion>3.10</ProductVersion>
|
|
<ProjectGuid>{b6e94700-df38-41f6-a3fd-18b69674ab1e}</ProjectGuid>
|
|
<SchemaVersion>2.0</SchemaVersion>
|
|
<OutputName Condition=" '$(PerUser)' != 'true' ">PowerToysSetup-$(Version)-$(Platform)</OutputName>
|
|
<OutputName Condition=" '$(PerUser)' == 'true' ">PowerToysUserSetup-$(Version)-$(Platform)</OutputName>
|
|
<OutputType>Package</OutputType>
|
|
<SuppressAclReset>True</SuppressAclReset>
|
|
<NuGetPackageImportStamp>
|
|
</NuGetPackageImportStamp>
|
|
<!-- 1076 and ICE91 - warning: using this configuration for perMachine install could cause problems. -->
|
|
<!-- 1026 - warning: file ID is too long -->
|
|
<SuppressIces>ICE91</SuppressIces>
|
|
<SuppressSpecificWarnings>1026;1076</SuppressSpecificWarnings>
|
|
</PropertyGroup>
|
|
<PropertyGroup>
|
|
<OutputPath Condition=" '$(PerUser)' != 'true' ">$(Platform)\$(Configuration)\MachineSetup</OutputPath>
|
|
<OutputPath Condition=" '$(PerUser)' == 'true' ">$(Platform)\$(Configuration)\UserSetup</OutputPath>
|
|
<IntermediateOutputPath Condition=" '$(PerUser)' != 'true' ">$(BaseIntermediateOutputPath)$(Platform)\$(Configuration)\MachineSetup</IntermediateOutputPath>
|
|
<IntermediateOutputPath Condition=" '$(PerUser)' == 'true' ">$(BaseIntermediateOutputPath)$(Platform)\$(Configuration)\UserSetup</IntermediateOutputPath>
|
|
<SuppressIces>ICE40</SuppressIces>
|
|
</PropertyGroup>
|
|
<ItemGroup>
|
|
<Compile Include="CustomDialogs\PTInstallDirDlg.wxs" />
|
|
<Compile Include="CustomDialogs\PTLicenseDlg.wxs" />
|
|
<Compile Include="CustomDialogs\WixUI_PTInstallDir.wxs" />
|
|
<Compile Include="NewPlus.wxs" />
|
|
<Compile Include="Product.wxs" />
|
|
<Compile Include="AdvancedPaste.wxs" />
|
|
<Compile Include="Awake.wxs" />
|
|
<Compile Include="BaseApplications.wxs" />
|
|
<Compile Include="CmdPal.wxs" />
|
|
<Compile Include="ColorPicker.wxs" />
|
|
<Compile Include="EnvironmentVariables.wxs" />
|
|
<Compile Include="FileExplorerPreview.wxs" />
|
|
<Compile Include="FileLocksmith.wxs" />
|
|
<Compile Include="Hosts.wxs" />
|
|
<Compile Include="ImageResizer.wxs" />
|
|
<Compile Include="LightSwitch.wxs" />
|
|
<Compile Include="KeyboardManager.wxs" />
|
|
<Compile Include="Peek.wxs" />
|
|
<Compile Include="PowerRename.wxs" />
|
|
<Compile Include="PowerDisplay.wxs" />
|
|
<Compile Include="DscResources.wxs" />
|
|
<Compile Include="RegistryPreview.wxs" />
|
|
<Compile Include="Run.wxs" />
|
|
<Compile Include="Settings.wxs" />
|
|
<Compile Include="ShortcutGuide.wxs" />
|
|
<Compile Include="Tools.wxs" />
|
|
<Compile Include="MouseWithoutBorders.wxs" />
|
|
<Compile Include="WinUI3Applications.wxs" />
|
|
<Compile Include="MonacoSRC.wxs" />
|
|
<Compile Include="Core.wxs" />
|
|
<Compile Include="Resources.wxs" />
|
|
<Compile Include="WinAppSDK.wxs" />
|
|
<Compile Include="Workspaces.wxs" />
|
|
</ItemGroup>
|
|
<ItemGroup>
|
|
<Folder Include="CustomDialogs" />
|
|
</ItemGroup>
|
|
<ItemGroup>
|
|
<PackageReference Include="WixToolset.Heat" />
|
|
<PackageReference Include="WixToolset.Firewall.wixext" />
|
|
<PackageReference Include="WixToolset.Util.wixext" />
|
|
<PackageReference Include="WixToolset.UI.wixext" />
|
|
<PackageReference Include="WixToolset.NetFx.wixext" />
|
|
<PackageReference Include="WixToolset.Bal.wixext" />
|
|
</ItemGroup>
|
|
<ItemGroup>
|
|
<ProjectReference Include="..\PowerToysSetupCustomActionsVNext\PowerToysSetupCustomActionsVNext.vcxproj">
|
|
<Name>PowerToysSetupCustomActionsVNext</Name>
|
|
<Project>{B3A354B0-1E54-4B55-A962-FB5AF9330C19}</Project>
|
|
<Private>True</Private>
|
|
<DoNotHarvest>True</DoNotHarvest>
|
|
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
|
|
<RefTargetDir>INSTALLFOLDER</RefTargetDir>
|
|
</ProjectReference>
|
|
</ItemGroup>
|
|
<ItemGroup>
|
|
<Content Include="packages.config" />
|
|
</ItemGroup>
|
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
|
<PropertyGroup>
|
|
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
|
</PropertyGroup>
|
|
</Target>
|
|
<!-- Prevents NU1503 -->
|
|
<Target Name="_IsProjectRestoreSupported" Returns="@(_ValidProjectsForRestore)">
|
|
<ItemGroup>
|
|
<_ValidProjectsForRestore Include="$(MSBuildProjectFullPath)" />
|
|
</ItemGroup>
|
|
</Target>
|
|
<Target Name="Restore" />
|
|
</Project>
|