diff --git a/assets/wix/files.wxs b/assets/wix/files.wxs
index 13e38dbdd6..78b21b8d64 100644
--- a/assets/wix/files.wxs
+++ b/assets/wix/files.wxs
@@ -3137,6 +3137,9 @@
+
+
+
@@ -4170,6 +4173,7 @@
+
diff --git a/build.psm1 b/build.psm1
index 9e9da60596..d3bfb96866 100644
--- a/build.psm1
+++ b/build.psm1
@@ -439,10 +439,9 @@ Fix steps:
# Add --self-contained due to "warning NETSDK1179: One of '--self-contained' or '--no-self-contained' options are required when '--runtime' is used."
if ($Options.Runtime -like 'fxdependent*') {
$Arguments += "--no-self-contained"
- # The UseAppHost = false property avoids creating ".exe" for the fxdependent packages.
- # The ".exe" is not a cross-platform executable, but specific to the platform that it was built on.
- # We do not need to ship that.
- $Arguments += "/property:UseAppHost=false"
+ # The UseAppHost = true property creates ".exe" for the fxdependent packages.
+ # We need this in the package as Start-Job needs it.
+ $Arguments += "/property:UseAppHost=true"
}
else {
$Arguments += "--self-contained"
diff --git a/tools/releaseBuild/azureDevOps/releasePipeline.yml b/tools/releaseBuild/azureDevOps/releasePipeline.yml
index d68f7bbb62..5916043610 100644
--- a/tools/releaseBuild/azureDevOps/releasePipeline.yml
+++ b/tools/releaseBuild/azureDevOps/releasePipeline.yml
@@ -78,6 +78,31 @@ stages:
globalToolExeName: 'pwsh'
globalToolPackageName: 'PowerShell.Linux.x64'
+- stage: ValidateFxdPackage
+ displayName: Validate Fxd Package
+ dependsOn: []
+ jobs:
+ - template: templates/release-ValidateFxdPackage.yml
+ parameters:
+ jobName: WinFxdPackage
+ displayName: Fxd Package Test Win
+ imageName: windows-latest
+ packageNamePattern: '**/*win-fxdependent.zip'
+
+ - template: templates/release-ValidateFxdPackage.yml
+ parameters:
+ jobName: FxdPackageWindDesktop
+ displayName: Fxd Package Test WinDesktop
+ imageName: windows-latest
+ packageNamePattern: '**/*win-fxdependentWinDesktop.zip'
+
+ - template: templates/release-ValidateFxdPackage.yml
+ parameters:
+ jobName: FxdPackageLinux
+ displayName: Fxd Package Test Linux
+ imageName: ubuntu-latest
+ packageNamePattern: '**/*fxdependent.tar.gz'
+
- stage: StaticPkgValidation
dependsOn: []
displayName: Static package validation
@@ -142,6 +167,8 @@ stages:
- StartDocker
- ManualValidation
- ReleaseAutomation
+ - ValidateFxdPackage
+ - ValidateGlobalTool
# The environment here is used for approval.
jobs:
diff --git a/tools/releaseBuild/azureDevOps/templates/release-ValidateFxdPackage.yml b/tools/releaseBuild/azureDevOps/templates/release-ValidateFxdPackage.yml
new file mode 100644
index 0000000000..687b9d526d
--- /dev/null
+++ b/tools/releaseBuild/azureDevOps/templates/release-ValidateFxdPackage.yml
@@ -0,0 +1,62 @@
+parameters:
+ jobName: ""
+ displayName: ""
+ imageName: ""
+ packageNamePattern: ""
+
+jobs:
+- job: ${{ parameters.jobName }}
+ displayName: ${{ parameters.displayName }}
+ pool:
+ vmImage: ${{ parameters.imageName }}
+ steps:
+ - checkout: self
+ clean: true
+
+ - task: DownloadPipelineArtifact@2
+ inputs:
+ source: specific
+ project: PowerShellCore
+ pipeline: '696'
+ preferTriggeringPipeline: true
+ runVersion: latestFromBranch
+ runBranch: '$(Build.SourceBranch)'
+ artifact: finalResults
+ patterns: '${{ parameters.packageNamePattern }}'
+ path: '$(Pipeline.Workspace)/releasePipeline/finalResults'
+
+ - pwsh: |
+ Get-ChildItem -Path '$(Pipeline.Workspace)/releasePipeline/finalResults' -Recurse
+ displayName: Capture downloaded package
+
+ - pwsh: |
+ $destPath = New-Item '$(Pipeline.Workspace)/releasePipeline/finalResults/fxd' -ItemType Directory
+ $packageNameFilter = '${{ parameters.packageNamePattern }}'
+
+ if ($packageNameFilter.EndsWith('tar.gz')) {
+ $package = @(Get-ChildItem -Path '$(Pipeline.Workspace)/releasePipeline/finalResults/*.tar.gz')
+ Write-Verbose -Verbose "Package: $package"
+ if ($package.Count -ne 1) {
+ throw 'Only 1 package was expected.'
+ }
+ tar -xvf $package.FullName -C $destPath
+ }
+ else {
+ $package = @(Get-ChildItem -Path '$(Pipeline.Workspace)/releasePipeline/finalResults/*.zip')
+ Write-Verbose -Verbose "Package: $package"
+ if ($package.Count -ne 1) {
+ throw 'Only 1 package was expected.'
+ }
+ Expand-Archive -Path $package.FullName -Destination "$destPath" -Verbose
+ }
+ displayName: Expand fxd package
+
+ - pwsh: |
+ $packageNameFilter = '${{ parameters.packageNamePattern }}'
+ $pwshExeName = if ($packageNameFilter.EndsWith('tar.gz')) { 'pwsh' } else { 'pwsh.exe' }
+ $actualOutput = & $pwshExeName -c 'Start-Job -ScriptBlock { "1" } | Wait-Job | Receive-Job'
+ Write-Verbose -Verbose "Actual output: $actualOutput"
+ if ($actualOutput -ne 1) {
+ throw "Actual output is not as expected"
+ }
+ displayName: Test package
diff --git a/tools/releaseBuild/azureDevOps/templates/windows-packaging.yml b/tools/releaseBuild/azureDevOps/templates/windows-packaging.yml
index 03ecebaf0c..f2b0e091f0 100644
--- a/tools/releaseBuild/azureDevOps/templates/windows-packaging.yml
+++ b/tools/releaseBuild/azureDevOps/templates/windows-packaging.yml
@@ -129,6 +129,7 @@ jobs:
"$($fullSymbolsFolder)\Modules\PSDiagnostics\PSDiagnostics.ps?1" = "Modules\PSDiagnostics"
"$($fullSymbolsFolder)\pwsh.dll" = ""
"$($fullSymbolsFolder)\System.Management.Automation.dll" = ""
+ "$($fullSymbolsFolder)\pwsh.exe" = ""
}
$itemsToExclude = @(
@@ -136,11 +137,6 @@ jobs:
"$($fullSymbolsFolder)\Microsoft.PowerShell.MarkdownRender.dll"
)
- if ("$env:Architecture" -notlike 'fxdependent*')
- {
- $itemsToCopy += @{"$($fullSymbolsFolder)\pwsh.exe" = ""}
- }
-
Write-Verbose -verbose "recusively copying $($itemsToCopyWithRecurse | out-string) to $filesToSignDirectory"
Copy-Item -Path $itemsToCopyWithRecurse -Destination $filesToSignDirectory -Recurse -verbose -exclude $itemsToExclude