diff --git a/.pipelines/NonOfficial/PowerShell-Coordinated_Packages-NonOfficial.yml b/.pipelines/NonOfficial/PowerShell-Coordinated_Packages-NonOfficial.yml
index 55d4c4557d8..0b417df5c05 100644
--- a/.pipelines/NonOfficial/PowerShell-Coordinated_Packages-NonOfficial.yml
+++ b/.pipelines/NonOfficial/PowerShell-Coordinated_Packages-NonOfficial.yml
@@ -45,7 +45,7 @@ resources:
ref: refs/heads/main
variables:
- - template: ../templates/variables/PowerShell-Coordinated_Packages-Variables.yml
+ - template: ./pipelines/templates/variables/PowerShell-Coordinated_Packages-Variables.yml@self
parameters:
InternalSDKBlobURL: ${{ parameters.InternalSDKBlobURL }}
ReleaseTagVar: ${{ parameters.ReleaseTagVar }}
@@ -90,7 +90,7 @@ extends:
tsaOptionsFile: .config\tsaoptions.json
stages:
- - template: ../templates/stages/PowerShell-Coordinated_Packages-Stages.yml
+ - template: ./pipelines/templates/stages/PowerShell-Coordinated_Packages-Stages.yml@self
parameters:
RUN_WINDOWS: ${{ parameters.RUN_WINDOWS }}
RUN_TEST_AND_RELEASE: ${{ parameters.RUN_TEST_AND_RELEASE }}
diff --git a/.pipelines/NonOfficial/PowerShell-Packages-NonOfficial.yml b/.pipelines/NonOfficial/PowerShell-Packages-NonOfficial.yml
index 81f343a04a0..9419d3f29b5 100644
--- a/.pipelines/NonOfficial/PowerShell-Packages-NonOfficial.yml
+++ b/.pipelines/NonOfficial/PowerShell-Packages-NonOfficial.yml
@@ -31,7 +31,7 @@ parameters: # parameters are shown up in ADO UI in a build queue time
name: pkgs-$(BUILD.SOURCEBRANCHNAME)-nonofficial-$(Build.BuildId)
variables:
- - template: ../templates/variables/PowerShell-Packages-Variables.yml
+ - template: ./pipelines/templates/variables/PowerShell-Packages-Variables.yml@self
parameters:
debug: ${{ parameters.debug }}
ForceAzureBlobDelete: ${{ parameters.ForceAzureBlobDelete }}
@@ -92,6 +92,6 @@ extends:
enabled: false
tsaOptionsFile: .config\tsaoptions.json
stages:
- - template: ../templates/stages/PowerShell-Packages-Stages.yml
+ - template: ./pipelines/templates/stages/PowerShell-Packages-Stages.yml@self
parameters:
OfficialBuild: false
diff --git a/.pipelines/NonOfficial/PowerShell-Release-Azure-NonOfficial.yml b/.pipelines/NonOfficial/PowerShell-Release-Azure-NonOfficial.yml
index 681babb2220..b524cb0ff81 100644
--- a/.pipelines/NonOfficial/PowerShell-Release-Azure-NonOfficial.yml
+++ b/.pipelines/NonOfficial/PowerShell-Release-Azure-NonOfficial.yml
@@ -17,7 +17,7 @@ parameters: # parameters are shown up in ADO UI in a build queue time
name: ev2-$(BUILD.SOURCEBRANCHNAME)-nonofficial-$(Build.BuildId)
variables:
- - template: ../templates/variables/PowerShell-Release-Azure-Variables.yml
+ - template: ./pipelines/templates/variables/PowerShell-Release-Azure-Variables.yml@self
parameters:
debug: ${{ parameters.debug }}
diff --git a/.pipelines/NonOfficial/PowerShell-Release-NonOfficial.yml b/.pipelines/NonOfficial/PowerShell-Release-NonOfficial.yml
index ca5a6383f33..7864513fc2c 100644
--- a/.pipelines/NonOfficial/PowerShell-Release-NonOfficial.yml
+++ b/.pipelines/NonOfficial/PowerShell-Release-NonOfficial.yml
@@ -33,7 +33,7 @@ parameters: # parameters are shown up in ADO UI in a build queue time
name: release-$(BUILD.SOURCEBRANCHNAME)-nonofficial-$(Build.BuildId)
variables:
- - template: ../templates/variables/PowerShell-Release-Variables.yml
+ - template: ./pipelines/templates/variables/PowerShell-Release-Variables.yml@self
parameters:
debug: ${{ parameters.debug }}
ReleaseTagVar: ${{ parameters.ReleaseTagVar }}
@@ -98,7 +98,7 @@ extends:
tsaOptionsFile: .config\tsaoptions.json
stages:
- - template: ../templates/stages/PowerShell-Release-Stages.yml
+ - template: ./pipelines/templates/stages/PowerShell-Release-Stages.yml@self
parameters:
releaseEnvironment: Test
SkipPublish: ${{ parameters.SkipPublish }}
diff --git a/.pipelines/NonOfficial/PowerShell-vPack-NonOfficial.yml b/.pipelines/NonOfficial/PowerShell-vPack-NonOfficial.yml
index 642b169adaf..f1f4211ca8f 100644
--- a/.pipelines/NonOfficial/PowerShell-vPack-NonOfficial.yml
+++ b/.pipelines/NonOfficial/PowerShell-vPack-NonOfficial.yml
@@ -33,7 +33,7 @@ parameters: # parameters are shown up in ADO UI in a build queue time
name: vPack_$(Build.SourceBranchName)_NonOfficial_Create.${{ parameters.createVPack }}_Name.${{ parameters.vPackName}}_$(date:yyyyMMdd).$(rev:rr)
variables:
- - template: ../templates/variables/PowerShell-vPack-Variables.yml
+ - template: ./pipelines/templates/variables/PowerShell-vPack-Variables.yml@self
parameters:
debug: ${{ parameters.debug }}
ReleaseTagVar: ${{ parameters.ReleaseTagVar }}
@@ -82,7 +82,7 @@ extends:
enabled: false
tsaOptionsFile: .config/tsaoptions.json
stages:
- - template: ../templates/stages/PowerShell-vPack-Stages.yml
+ - template: ./pipelines/templates/stages/PowerShell-vPack-Stages.yml@self
parameters:
createVPack: ${{ parameters.createVPack }}
vPackName: ${{ parameters.vPackName }}
diff --git a/.pipelines/store/PDP/PDP-Media/en-US/Error.png b/.pipelines/store/PDP/PDP-Media/en-US/Error.png
deleted file mode 100644
index 48e96378055..00000000000
Binary files a/.pipelines/store/PDP/PDP-Media/en-US/Error.png and /dev/null differ
diff --git a/.pipelines/store/PDP/PDP-Media/en-US/Experimental_Features.png b/.pipelines/store/PDP/PDP-Media/en-US/Experimental_Features.png
deleted file mode 100644
index 90420254a8e..00000000000
Binary files a/.pipelines/store/PDP/PDP-Media/en-US/Experimental_Features.png and /dev/null differ
diff --git a/.pipelines/store/PDP/PDP-Media/en-US/Feedback_Provider.png b/.pipelines/store/PDP/PDP-Media/en-US/Feedback_Provider.png
deleted file mode 100644
index f4084360d5c..00000000000
Binary files a/.pipelines/store/PDP/PDP-Media/en-US/Feedback_Provider.png and /dev/null differ
diff --git a/.pipelines/store/PDP/PDP-Media/en-US/Predictor_Inline.png b/.pipelines/store/PDP/PDP-Media/en-US/Predictor_Inline.png
deleted file mode 100644
index 3b8d6228485..00000000000
Binary files a/.pipelines/store/PDP/PDP-Media/en-US/Predictor_Inline.png and /dev/null differ
diff --git a/.pipelines/store/PDP/PDP-Media/en-US/Predictor_ListView.png b/.pipelines/store/PDP/PDP-Media/en-US/Predictor_ListView.png
deleted file mode 100644
index 1fb9a6247c5..00000000000
Binary files a/.pipelines/store/PDP/PDP-Media/en-US/Predictor_ListView.png and /dev/null differ
diff --git a/.pipelines/store/PDP/PDP-Media/en-US/Prompt.png b/.pipelines/store/PDP/PDP-Media/en-US/Prompt.png
deleted file mode 100644
index a40d6fddfdc..00000000000
Binary files a/.pipelines/store/PDP/PDP-Media/en-US/Prompt.png and /dev/null differ
diff --git a/.pipelines/store/PDP/PDP-Media/en-US/Stable_Release.png b/.pipelines/store/PDP/PDP-Media/en-US/Stable_Release.png
deleted file mode 100644
index 2761a46a64f..00000000000
Binary files a/.pipelines/store/PDP/PDP-Media/en-US/Stable_Release.png and /dev/null differ
diff --git a/.pipelines/store/PDP/PDP-Media/en-US/pwshLogo.png b/.pipelines/store/PDP/PDP-Media/en-US/pwshLogo.png
deleted file mode 100644
index c531f719c85..00000000000
Binary files a/.pipelines/store/PDP/PDP-Media/en-US/pwshLogo.png and /dev/null differ
diff --git a/.pipelines/store/PDP/PDP/en-US/PDP.xml b/.pipelines/store/PDP/PDP/en-US/PDP.xml
index 15d0bdf5270..ce36a3677f7 100644
--- a/.pipelines/store/PDP/PDP/en-US/PDP.xml
+++ b/.pipelines/store/PDP/PDP/en-US/PDP.xml
@@ -55,33 +55,8 @@ PowerShell is Open Source. See https://github.com/powershell/powershell
-
-
- Prompt
-
-
-
- Inline Prediction
-
-
-
- Prediction List View
-
-
-
- Error Feedback Provider
-
-
-
- Feedback Provider
-
-
-
- Experimental Features
-
-
diff --git a/.pipelines/templates/package-create-msix.yml b/.pipelines/templates/package-create-msix.yml
index e461bb6efd9..97d2f4fc46a 100644
--- a/.pipelines/templates/package-create-msix.yml
+++ b/.pipelines/templates/package-create-msix.yml
@@ -12,7 +12,6 @@ jobs:
variables:
- group: msixTools
- group: 'Azure Blob variable group'
- - group: 'Store Publish Variables'
- name: ob_sdl_credscan_suppressionsFile
value: $(Build.SourcesDirectory)\PowerShell\.config\suppress.json
- name: ob_sdl_tsa_configFile
@@ -153,199 +152,3 @@ jobs:
Write-Verbose -Verbose "Uploaded Bundles:"
Get-ChildItem -Path $(ob_outputDirectory) | Write-Verbose -Verbose
displayName: Upload msixbundle to Artifacts
-
- - pwsh: |
- Write-Verbose -Verbose "Pipeline.Workspace: $(Pipeline.Workspace)"
- Get-ChildItem -Path $(Pipeline.Workspace) -Recurse | Select-Object -ExpandProperty FullName
- Write-Verbose -Verbose "System.DefaultWorkingDirectory: $(System.DefaultWorkingDirectory)"
- Get-ChildItem -Path $(System.DefaultWorkingDirectory) -Recurse | Select-Object -ExpandProperty FullName
- Test-Path -Path '$(System.DefaultWorkingDirectory)/PowerShell/.pipelines/store/PDP-Private.xml' | Write-Verbose -Verbose
- displayName: Output Pipeline.Workspace and System.DefaultWorkingDirectory
-
- - template: channelSelection.yml@self
-
- - pwsh: |
- $IsLTS = '$(ChannelSelection.IsLTS)' -eq 'true'
- $IsStable = '$(ChannelSelection.IsStable)' -eq 'true'
- $IsPreview = '$(ChannelSelection.IsPreview)' -eq 'true'
-
- Write-Verbose -Verbose "Channel Selection - LTS: $IsLTS, Stable: $IsStable, Preview: $IsPreview"
-
- # Define app configurations for each channel
- $channelConfigs = @{
- 'LTS' = @{
- AppStoreName = 'PowerShell-LTS'
- ProductId = '$(productId-LTS)'
- AppId = '$(AppID-LTS)'
- ServiceEndpoint = "StoreAppPublish-Stable"
- }
- 'Stable' = @{
- AppStoreName = 'PowerShell'
- ProductId = '$(productId-Stable)'
- AppId = '$(AppID-Stable)'
- ServiceEndpoint = "StoreAppPublish-Stable"
- }
- 'Preview' = @{
- AppStoreName = 'PowerShell (Preview)'
- ProductId = '$(productId-Preview)'
- AppId = '$(AppID-Preview)'
- ServiceEndpoint = "StoreAppPublish-Preview"
- }
- }
-
- $currentChannel = if ($IsLTS) { 'LTS' }
- elseif ($IsStable) { 'Stable' }
- elseif ($IsPreview) { 'Preview' }
- else {
- Write-Error "No valid channel detected"
- exit 1
- }
-
- $config = $channelConfigs[$currentChannel]
- Write-Verbose -Verbose "Selected channel: $currentChannel"
- Write-Verbose -Verbose "App Store Name: $($config.AppStoreName)"
- Write-Verbose -Verbose "Product ID: $($config.ProductId)"
-
- # Update PDP.xml file
- $pdpPath = '$(System.DefaultWorkingDirectory)/PowerShell/.pipelines/store/PDP/PDP/en-US/PDP.xml'
- if (Test-Path $pdpPath) {
- Write-Verbose -Verbose "Updating PDP file: $pdpPath"
-
- [xml]$pdpXml = Get-Content $pdpPath -Raw
-
- # Create namespace manager for XML with default namespace
- $nsManager = New-Object System.Xml.XmlNamespaceManager($pdpXml.NameTable)
- $nsManager.AddNamespace("pd", "http://schemas.microsoft.com/appx/2012/ProductDescription")
-
- $appStoreNameElement = $pdpXml.SelectSingleNode("//pd:AppStoreName", $nsManager)
- if ($appStoreNameElement) {
- $appStoreNameElement.SetAttribute("_locID", $config.AppStoreName)
- Write-Verbose -Verbose "Updated AppStoreName _locID to: $($config.AppStoreName)"
- } else {
- Write-Warning "AppStoreName element not found in PDP file"
- }
-
- $pdpXml.Save($pdpPath)
- Write-Verbose -Verbose "PDP file updated successfully"
- Get-Content -Path $pdpPath | Write-Verbose -Verbose
- } else {
- Write-Error "PDP file not found: $pdpPath"
- exit 1
- }
-
- # Update SBConfig.json file
- $sbConfigPath = '$(System.DefaultWorkingDirectory)/PowerShell/.pipelines/store/SBConfig.json'
- if (Test-Path $sbConfigPath) {
- Write-Verbose -Verbose "Updating SBConfig file: $sbConfigPath"
-
- $sbConfigJson = Get-Content $sbConfigPath -Raw | ConvertFrom-Json
-
- $sbConfigJson.appSubmission.productId = $config.ProductId
- Write-Verbose -Verbose "Updated productId to: $($config.ProductId)"
-
- $sbConfigJson | ConvertTo-Json -Depth 100 | Set-Content $sbConfigPath -Encoding UTF8
- Write-Verbose -Verbose "SBConfig file updated successfully"
- Get-Content -Path $sbConfigPath | Write-Verbose -Verbose
- } else {
- Write-Error "SBConfig file not found: $sbConfigPath"
- exit 1
- }
-
- Write-Host "##vso[task.setvariable variable=ServiceConnection]$($config.ServiceEndpoint)"
- Write-Host "##vso[task.setvariable variable=SBConfigPath]$($sbConfigPath)"
-
- # Select the correct bundle based on channel
- $bundleFiles = @(Get-ChildItem -Path '$(BundleDir)' -Filter '*.msixbundle')
- Write-Verbose -Verbose "Available bundles: $($bundleFiles.Name -join ', ')"
-
- if ($IsLTS) {
- $bundleFile = $bundleFiles | Where-Object { $_.Name -match '-LTS-' }
- } else {
- # Catches Stable or Preview
- $bundleFile = $bundleFiles | Where-Object { $_.Name -notmatch '-LTS-' }
- }
-
- if (-not $bundleFile) {
- Write-Error "No matching bundle found for channel '$currentChannel'. Available bundles: $($bundleFiles.Name -join ', ')"
- exit 1
- }
-
- # Copy the selected bundle to a dedicated directory for store packaging
- $storeBundleDir = '$(Pipeline.Workspace)\releasePipeline\msix\store-bundle'
- New-Item $storeBundleDir -Type Directory -Force > $null
- Copy-Item -Path $bundleFile.FullName -Destination $storeBundleDir -Force -Verbose
- Write-Host "##vso[task.setvariable variable=StoreBundleDir]$storeBundleDir"
- Write-Verbose -Verbose "Selected bundle for store packaging: $($bundleFile.Name)"
-
- # These variables are used in the next tasks to determine which ServiceEndpoint to use
- $ltsValue = $IsLTS.ToString().ToLower()
- $stableValue = $IsStable.ToString().ToLower()
- $previewValue = $IsPreview.ToString().ToLower()
-
- Write-Verbose -Verbose "About to set variables:"
- Write-Verbose -Verbose " LTS=$ltsValue"
- Write-Verbose -Verbose " STABLE=$stableValue"
- Write-Verbose -Verbose " PREVIEW=$previewValue"
-
- Write-Host "##vso[task.setvariable variable=LTS]$ltsValue"
- Write-Host "##vso[task.setvariable variable=STABLE]$stableValue"
- Write-Host "##vso[task.setvariable variable=PREVIEW]$previewValue"
-
- Write-Verbose -Verbose "Variables set successfully"
- name: UpdateConfigs
- displayName: Update PDPs and SBConfig.json
-
- - pwsh: |
- Write-Verbose -Verbose "Checking variables after UpdateConfigs:"
- Write-Verbose -Verbose "LTS=$(LTS)"
- Write-Verbose -Verbose "STABLE=$(STABLE)"
- Write-Verbose -Verbose "PREVIEW=$(PREVIEW)"
- displayName: Debug - Check Variables
-
- - task: MS-RDX-MRO.windows-store-publish.package-task.store-package@3
- displayName: 'Create StoreBroker Package (Preview)'
- condition: eq(variables['PREVIEW'], 'true')
- inputs:
- serviceEndpoint: 'StoreAppPublish-Preview'
- sbConfigPath: '$(SBConfigPath)'
- sourceFolder: '$(StoreBundleDir)'
- contents: '*.msixBundle'
- outSBName: 'PowerShellStorePackage'
- pdpPath: '$(System.DefaultWorkingDirectory)/PowerShell/.pipelines/store/PDP/PDP'
- pdpMediaPath: '$(System.DefaultWorkingDirectory)/PowerShell/.pipelines/store/PDP/PDP-Media'
-
- - task: MS-RDX-MRO.windows-store-publish.package-task.store-package@3
- displayName: 'Create StoreBroker Package (Stable/LTS)'
- condition: or(eq(variables['STABLE'], 'true'), eq(variables['LTS'], 'true'))
- inputs:
- serviceEndpoint: 'StoreAppPublish-Stable'
- sbConfigPath: '$(SBConfigPath)'
- sourceFolder: '$(StoreBundleDir)'
- contents: '*.msixBundle'
- outSBName: 'PowerShellStorePackage'
- pdpPath: '$(System.DefaultWorkingDirectory)/PowerShell/.pipelines/store/PDP/PDP'
- pdpMediaPath: '$(System.DefaultWorkingDirectory)/PowerShell/.pipelines/store/PDP/PDP-Media'
-
- - pwsh: |
- Get-Item -Path "$(System.DefaultWorkingDirectory)/SBLog.txt" -ErrorAction SilentlyContinue |
- Copy-Item -Destination "$(ob_outputDirectory)" -Verbose
- displayName: Upload Store Failure Log
- condition: failed()
-
- - pwsh: |
- $submissionPackageDir = "$(System.DefaultWorkingDirectory)/SBOutDir"
- $jsonFile = "$submissionPackageDir/PowerShellStorePackage.json"
- $zipFile = "$submissionPackageDir/PowerShellStorePackage.zip"
-
- if ((Test-Path $jsonFile) -and (Test-Path $zipFile)) {
- Write-Verbose -Verbose "Uploading StoreBroker Package files:"
- Write-Verbose -Verbose "JSON File: $jsonFile"
- Write-Verbose -Verbose "ZIP File: $zipFile"
-
- Copy-Item -Path $submissionPackageDir -Destination "$(ob_outputDirectory)" -Verbose -Recurse
- }
-
- else {
- Write-Error "Required files not found in $submissionPackageDir"
- }
- displayName: 'Upload StoreBroker Package'
diff --git a/.pipelines/templates/package-store-package.yml b/.pipelines/templates/package-store-package.yml
new file mode 100644
index 00000000000..7667b1361e7
--- /dev/null
+++ b/.pipelines/templates/package-store-package.yml
@@ -0,0 +1,242 @@
+jobs:
+- job: CreateStorePackage
+ displayName: Create StoreBroker Package
+ pool:
+ type: windows
+
+ variables:
+ - group: 'Azure Blob variable group'
+ - group: 'Store Publish Variables'
+ - name: ob_sdl_credscan_suppressionsFile
+ value: $(Build.SourcesDirectory)\PowerShell\.config\suppress.json
+ - name: ob_sdl_tsa_configFile
+ value: $(Build.SourcesDirectory)\PowerShell\.config\tsaoptions.json
+ - name: ob_outputDirectory
+ value: '$(Build.ArtifactStagingDirectory)/ONEBRANCH_ARTIFACT'
+ - name: ob_signing_setup_enabled
+ value: false
+ - name: ob_sdl_codeSignValidation_enabled
+ value: false
+
+ steps:
+ - checkout: self
+ clean: true
+
+ - template: release-SetReleaseTagandContainerName.yml@self
+
+ - task: DownloadPipelineArtifact@2
+ inputs:
+ buildType: 'current'
+ artifact: drop_msixbundle_CreateMSIXBundle
+ itemPattern: |
+ **/*.msixbundle
+ targetPath: '$(Build.ArtifactStagingDirectory)/downloads'
+ displayName: Download signed msixbundle
+
+ - pwsh: |
+ $bundleDir = '$(Build.ArtifactStagingDirectory)/downloads'
+ $bundle = Get-ChildItem -Path $bundleDir -Filter '*.msixbundle' -Recurse | Select-Object -First 1
+ if (-not $bundle) {
+ Write-Error "No .msixbundle file found in $bundleDir"
+ exit 1
+ }
+ Write-Verbose -Verbose "Found bundle: $($bundle.FullName)"
+ $vstsCommandString = "vso[task.setvariable variable=BundleDir]$($bundle.DirectoryName)"
+ Write-Host "##$vstsCommandString"
+ displayName: Locate msixbundle
+
+ - template: channelSelection.yml@self
+
+ - pwsh: |
+ $IsLTS = '$(ChannelSelection.IsLTS)' -eq 'true'
+ $IsStable = '$(ChannelSelection.IsStable)' -eq 'true'
+ $IsPreview = '$(ChannelSelection.IsPreview)' -eq 'true'
+
+ Write-Verbose -Verbose "Channel Selection - LTS: $IsLTS, Stable: $IsStable, Preview: $IsPreview"
+
+ # Define app configurations for each channel
+ $channelConfigs = @{
+ 'LTS' = @{
+ AppStoreName = 'PowerShell-LTS'
+ ProductId = '$(productId-LTS)'
+ AppId = '$(AppID-LTS)'
+ ServiceEndpoint = "StoreAppPublish-Stable"
+ }
+ 'Stable' = @{
+ AppStoreName = 'PowerShell'
+ ProductId = '$(productId-Stable)'
+ AppId = '$(AppID-Stable)'
+ ServiceEndpoint = "StoreAppPublish-Stable"
+ }
+ 'Preview' = @{
+ AppStoreName = 'PowerShell (Preview)'
+ ProductId = '$(productId-Preview)'
+ AppId = '$(AppID-Preview)'
+ ServiceEndpoint = "StoreAppPublish-Preview"
+ }
+ }
+
+ $currentChannel = if ($IsLTS) { 'LTS' }
+ elseif ($IsStable) { 'Stable' }
+ elseif ($IsPreview) { 'Preview' }
+ else {
+ Write-Error "No valid channel detected"
+ exit 1
+ }
+
+ $config = $channelConfigs[$currentChannel]
+ Write-Verbose -Verbose "Selected channel: $currentChannel"
+ Write-Verbose -Verbose "App Store Name: $($config.AppStoreName)"
+ Write-Verbose -Verbose "Product ID: $($config.ProductId)"
+
+ # Update PDP.xml file
+ $pdpPath = '$(System.DefaultWorkingDirectory)/PowerShell/.pipelines/store/PDP/PDP/en-US/PDP.xml'
+ if (Test-Path $pdpPath) {
+ Write-Verbose -Verbose "Updating PDP file: $pdpPath"
+
+ [xml]$pdpXml = Get-Content $pdpPath -Raw
+
+ # Create namespace manager for XML with default namespace
+ $nsManager = New-Object System.Xml.XmlNamespaceManager($pdpXml.NameTable)
+ $nsManager.AddNamespace("pd", "http://schemas.microsoft.com/appx/2012/ProductDescription")
+
+ $appStoreNameElement = $pdpXml.SelectSingleNode("//pd:AppStoreName", $nsManager)
+ if ($appStoreNameElement) {
+ $appStoreNameElement.SetAttribute("_locID", $config.AppStoreName)
+ Write-Verbose -Verbose "Updated AppStoreName _locID to: $($config.AppStoreName)"
+ } else {
+ Write-Warning "AppStoreName element not found in PDP file"
+ }
+
+ $pdpXml.Save($pdpPath)
+ Write-Verbose -Verbose "PDP file updated successfully"
+ Get-Content -Path $pdpPath | Write-Verbose -Verbose
+ } else {
+ Write-Error "PDP file not found: $pdpPath"
+ exit 1
+ }
+
+ # Update SBConfig.json file
+ $sbConfigPath = '$(System.DefaultWorkingDirectory)/PowerShell/.pipelines/store/SBConfig.json'
+ if (Test-Path $sbConfigPath) {
+ Write-Verbose -Verbose "Updating SBConfig file: $sbConfigPath"
+
+ $sbConfigJson = Get-Content $sbConfigPath -Raw | ConvertFrom-Json
+
+ $sbConfigJson.appSubmission.productId = $config.ProductId
+ Write-Verbose -Verbose "Updated productId to: $($config.ProductId)"
+
+ $sbConfigJson | ConvertTo-Json -Depth 100 | Set-Content $sbConfigPath -Encoding UTF8
+ Write-Verbose -Verbose "SBConfig file updated successfully"
+ Get-Content -Path $sbConfigPath | Write-Verbose -Verbose
+ } else {
+ Write-Error "SBConfig file not found: $sbConfigPath"
+ exit 1
+ }
+
+ Write-Host "##vso[task.setvariable variable=ServiceConnection]$($config.ServiceEndpoint)"
+ Write-Host "##vso[task.setvariable variable=SBConfigPath]$($sbConfigPath)"
+
+ # Select the correct bundle based on channel
+ $bundleFiles = @(Get-ChildItem -Path '$(BundleDir)' -Filter '*.msixbundle')
+ Write-Verbose -Verbose "Available bundles: $($bundleFiles.Name -join ', ')"
+
+ if ($IsLTS) {
+ $bundleFile = $bundleFiles | Where-Object { $_.Name -match '-LTS-' }
+ } else {
+ # Catches Stable or Preview
+ $bundleFile = $bundleFiles | Where-Object { $_.Name -notmatch '-LTS-' }
+ }
+
+ if (-not $bundleFile) {
+ Write-Error "No matching bundle found for channel '$currentChannel'. Available bundles: $($bundleFiles.Name -join ', ')"
+ exit 1
+ }
+
+ # Copy the selected bundle to a dedicated directory for store packaging
+ $storeBundleDir = '$(Pipeline.Workspace)\releasePipeline\msix\store-bundle'
+ New-Item $storeBundleDir -Type Directory -Force > $null
+ Copy-Item -Path $bundleFile.FullName -Destination $storeBundleDir -Force -Verbose
+ Write-Host "##vso[task.setvariable variable=StoreBundleDir]$storeBundleDir"
+ Write-Verbose -Verbose "Selected bundle for store packaging: $($bundleFile.Name)"
+
+ # These variables are used in the next tasks to determine which ServiceEndpoint to use
+ $ltsValue = $IsLTS.ToString().ToLower()
+ $stableValue = $IsStable.ToString().ToLower()
+ $previewValue = $IsPreview.ToString().ToLower()
+
+ Write-Verbose -Verbose "About to set variables:"
+ Write-Verbose -Verbose " LTS=$ltsValue"
+ Write-Verbose -Verbose " STABLE=$stableValue"
+ Write-Verbose -Verbose " PREVIEW=$previewValue"
+
+ Write-Host "##vso[task.setvariable variable=LTS]$ltsValue"
+ Write-Host "##vso[task.setvariable variable=STABLE]$stableValue"
+ Write-Host "##vso[task.setvariable variable=PREVIEW]$previewValue"
+
+ Write-Verbose -Verbose "Variables set successfully"
+ name: UpdateConfigs
+ displayName: Update PDPs and SBConfig.json
+
+ - pwsh: |
+ Write-Verbose -Verbose "Checking variables after UpdateConfigs:"
+ Write-Verbose -Verbose "LTS=$(LTS)"
+ Write-Verbose -Verbose "STABLE=$(STABLE)"
+ Write-Verbose -Verbose "PREVIEW=$(PREVIEW)"
+ displayName: Debug - Check Variables
+
+ - task: MS-RDX-MRO.windows-store-publish.package-task.store-package@3
+ displayName: 'Create StoreBroker Package (Preview)'
+ condition: eq(variables['PREVIEW'], 'true')
+ inputs:
+ serviceEndpoint: 'StoreAppPublish-Preview'
+ sbConfigPath: '$(SBConfigPath)'
+ sourceFolder: '$(StoreBundleDir)'
+ contents: '*.msixBundle'
+ outSBName: 'PowerShellStorePackage'
+ pdpPath: '$(System.DefaultWorkingDirectory)/PowerShell/.pipelines/store/PDP/PDP'
+
+ - task: MS-RDX-MRO.windows-store-publish.package-task.store-package@3
+ displayName: 'Create StoreBroker Package (Stable/LTS)'
+ condition: or(eq(variables['STABLE'], 'true'), eq(variables['LTS'], 'true'))
+ inputs:
+ serviceEndpoint: 'StoreAppPublish-Stable'
+ sbConfigPath: '$(SBConfigPath)'
+ sourceFolder: '$(StoreBundleDir)'
+ contents: '*.msixBundle'
+ outSBName: 'PowerShellStorePackage'
+ pdpPath: '$(System.DefaultWorkingDirectory)/PowerShell/.pipelines/store/PDP/PDP'
+
+ - pwsh: |
+ $outputDirectory = "$(ob_outputDirectory)"
+ if (-not (Test-Path -LiteralPath $outputDirectory)) {
+ New-Item -ItemType Directory -Path $outputDirectory -Force | Out-Null
+ }
+
+ Get-Item -Path "$(System.DefaultWorkingDirectory)/SBLog.txt" -ErrorAction SilentlyContinue |
+ Copy-Item -Destination $outputDirectory -Verbose
+ displayName: Upload Store Failure Log
+ condition: failed()
+
+ - pwsh: |
+ $outputDirectory = "$(ob_outputDirectory)"
+ if (-not (Test-Path -LiteralPath $outputDirectory)) {
+ New-Item -ItemType Directory -Path $outputDirectory -Force | Out-Null
+ }
+
+ $submissionPackageDir = "$(System.DefaultWorkingDirectory)/SBOutDir"
+ $jsonFile = "$submissionPackageDir/PowerShellStorePackage.json"
+ $zipFile = "$submissionPackageDir/PowerShellStorePackage.zip"
+
+ if ((Test-Path $jsonFile) -and (Test-Path $zipFile)) {
+ Write-Verbose -Verbose "Uploading StoreBroker Package files:"
+ Write-Verbose -Verbose "JSON File: $jsonFile"
+ Write-Verbose -Verbose "ZIP File: $zipFile"
+
+ Copy-Item -Path $submissionPackageDir -Destination $outputDirectory -Verbose -Recurse
+ }
+ else {
+ Write-Error "Required files not found in $submissionPackageDir"
+ exit 1
+ }
+ displayName: 'Upload StoreBroker Package'
diff --git a/.pipelines/templates/release-MSIX-Publish.yml b/.pipelines/templates/release-MSIX-Publish.yml
index a202129931e..cbbdb70cc4f 100644
--- a/.pipelines/templates/release-MSIX-Publish.yml
+++ b/.pipelines/templates/release-MSIX-Publish.yml
@@ -12,7 +12,7 @@ jobs:
inputs:
- input: pipelineArtifact
pipeline: PSPackagesOfficial
- artifactName: drop_msixbundle_CreateMSIXBundle
+ artifactName: drop_store_package_CreateStorePackage
variables:
- group: 'Store Publish Variables'
- name: LTS
@@ -107,29 +107,32 @@ jobs:
- task: MS-RDX-MRO.windows-store-publish.publish-task.store-publish@3
displayName: 'Publish StoreBroker Package (Stable/LTS)'
- condition: and(ne('${{ parameters.skipMSIXPublish }}', 'true'), or(eq(variables['STABLE'], 'true'), eq(variables['LTS'], 'true')))
- continueOnError: true
+ condition: and(not(${{ parameters.skipMSIXPublish }}), or(eq(variables['STABLE'], 'true'), eq(variables['LTS'], 'true')))
inputs:
serviceEndpoint: 'StoreAppPublish-Stable'
appId: '$(AppID)'
inputMethod: JsonAndZip
jsonPath: '$(Pipeline.Workspace)\SBOutDir\PowerShellStorePackage.json'
zipPath: '$(Pipeline.Workspace)\SBOutDir\PowerShellStorePackage.zip'
+ force: true
+ deletePackages: true
numberOfPackagesToKeep: 2
jsonZipUpdateMetadata: true
targetPublishMode: 'Immediate'
+ skipPolling: true
- task: MS-RDX-MRO.windows-store-publish.publish-task.store-publish@3
displayName: 'Publish StoreBroker Package (Preview)'
- condition: and(ne('${{ parameters.skipMSIXPublish }}', 'true'), eq(variables['PREVIEW'], 'true'))
- continueOnError: true
+ condition: and(not(${{ parameters.skipMSIXPublish }}), eq(variables['PREVIEW'], 'true'))
inputs:
serviceEndpoint: 'StoreAppPublish-Preview'
appId: '$(AppID)'
inputMethod: JsonAndZip
jsonPath: '$(Pipeline.Workspace)\SBOutDir\PowerShellStorePackage.json'
zipPath: '$(Pipeline.Workspace)\SBOutDir\PowerShellStorePackage.zip'
+ force: true
+ deletePackages: true
numberOfPackagesToKeep: 2
jsonZipUpdateMetadata: true
targetPublishMode: 'Immediate'
-
+ skipPolling: true
diff --git a/.pipelines/templates/stages/PowerShell-Packages-Stages.yml b/.pipelines/templates/stages/PowerShell-Packages-Stages.yml
index ff40941e31b..b1efb2a8097 100644
--- a/.pipelines/templates/stages/PowerShell-Packages-Stages.yml
+++ b/.pipelines/templates/stages/PowerShell-Packages-Stages.yml
@@ -173,6 +173,12 @@ stages:
parameters:
OfficialBuild: ${{ parameters.OfficialBuild }}
+- stage: store_package
+ displayName: 'Store Package'
+ dependsOn: [msixbundle]
+ jobs:
+ - template: /.pipelines/templates/package-store-package.yml@self
+
- stage: upload
displayName: 'Upload'
dependsOn: [prep, mac_package, windows_package_sign, linux_package, nupkg, msixbundle] # prep needed for BuildInfo JSON