PowerShell/tools/releaseBuild/Images/microsoft_powershell_windowsservercore/PowerShellPackage.ps1
Dongbo Wang f2d5ae74ad
Clean up crossgen related build scripts also generate native symbols for R2R images (#16297)
* Clean up crossgen related build scripts

* Fix ci.psm1

* Clean up '-CrossGen' use in a few other files
2021-10-27 11:42:37 -07:00

217 lines
6.8 KiB
PowerShell

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
[cmdletbinding(DefaultParameterSetName='default')]
# PowerShell Script to clone, build and package PowerShell from specified fork and branch
param (
[string] $fork = 'powershell',
[string] $branch = 'master',
[string] $location = "$PWD\powershell",
[string] $destination = "$env:WORKSPACE",
[ValidateSet("win7-x64", "win7-x86", "win-arm", "win-arm64", "fxdependent", "fxdependent-win-desktop")]
[string] $Runtime = 'win7-x64',
[switch] $ForMinimalSize,
[switch] $Wait,
[ValidatePattern("^v\d+\.\d+\.\d+(-\w+(\.\d{1,2})?)?$")]
[ValidateNotNullOrEmpty()]
[string] $ReleaseTag,
[Parameter(Mandatory,ParameterSetName='IncludeSymbols')]
[switch] $Symbols,
[Parameter(Mandatory,ParameterSetName='packageSigned')]
[ValidatePattern("-signed.zip$")]
[string] $BuildZip,
[Parameter(Mandatory,ParameterSetName='ComponentRegistration')]
[switch] $ComponentRegistration
)
$releaseTagParam = @{}
if ($ReleaseTag)
{
$releaseTagParam = @{ 'ReleaseTag' = $ReleaseTag }
}
if (-not $env:homedrive)
{
Write-Verbose "fixing empty home paths..." -Verbose
$profileParts = $env:userprofile -split ':'
$env:homedrive = $profileParts[0]+':'
$env:homepath = $profileParts[1]
}
if (! (Test-Path $destination))
{
Write-Verbose "Creating destination $destination" -Verbose
$null = New-Item -Path $destination -ItemType Directory
}
Write-Verbose "homedrive : ${env:homedrive}"
Write-Verbose "homepath : ${env:homepath}"
# Don't use CIM_PhysicalMemory, docker containers may cache old values
$memoryMB = (Get-CimInstance win32_computersystem).TotalPhysicalMemory /1MB
$requiredMemoryMB = 2048
if ($memoryMB -lt $requiredMemoryMB)
{
throw "Building powershell requires at least $requiredMemoryMB MiB of memory and only $memoryMB MiB is present."
}
Write-Verbose "Running with $memoryMB MB memory." -Verbose
try
{
Set-Location $location
Import-Module "$location\build.psm1" -Force
Import-Module "$location\tools\packaging" -Force
$env:platform = $null
Write-Verbose "Sync'ing Tags..." -Verbose
Sync-PSTags -AddRemoteIfMissing
Write-Verbose "Bootstrapping powershell build..." -Verbose
Start-PSBootstrap -Force -Package
if ($PSCmdlet.ParameterSetName -eq 'packageSigned')
{
Write-Verbose "Expanding signed build..." -Verbose
if($Runtime -like 'fxdependent*')
{
Expand-PSSignedBuild -BuildZip $BuildZip -SkipPwshExeCheck
}
else
{
Expand-PSSignedBuild -BuildZip $BuildZip
}
Remove-Item -Path $BuildZip
}
else
{
Write-Verbose "Starting powershell build for RID: $Runtime and ReleaseTag: $ReleaseTag ..." -Verbose
$buildParams = @{
ForMinimalSize = $ForMinimalSize
}
if($Symbols)
{
$buildParams['NoPSModuleRestore'] = $true
}
else
{
$buildParams['PSModuleRestore'] = $true
}
Start-PSBuild -Clean -Runtime $Runtime -Configuration Release @releaseTagParam @buildParams
}
if ($ComponentRegistration)
{
Write-Verbose "Exporting project.assets files ..." -Verbose
$projectAssetsCounter = 1
$projectAssetsFolder = Join-Path -Path $destination -ChildPath 'projectAssets'
$projectAssetsZip = Join-Path -Path $destination -ChildPath 'windowsProjectAssetssymbols.zip'
Get-ChildItem $location\project.assets.json -Recurse | ForEach-Object {
$subfolder = $_.FullName.Replace($location,'')
$subfolder.Replace('project.assets.json','')
$itemDestination = Join-Path -Path $projectAssetsFolder -ChildPath $subfolder
New-Item -Path $itemDestination -ItemType Directory -Force > $null
$file = $_.FullName
Write-Verbose "Copying $file to $itemDestination" -Verbose
Copy-Item -Path $file -Destination "$itemDestination\" -Force
$projectAssetsCounter++
}
Compress-Archive -Path $projectAssetsFolder -DestinationPath $projectAssetsZip
Remove-Item -Path $projectAssetsFolder -Recurse -Force -ErrorAction SilentlyContinue
return
}
if ($Runtime -like 'fxdependent*')
{
$pspackageParams = @{'Type' = $Runtime}
}
else
{
## Set the default package type.
$pspackageParams = @{'Type' = 'msi'; 'WindowsRuntime' = $Runtime}
if ($ForMinimalSize)
{
## Special case for the minimal size self-contained package.
$pspackageParams['Type'] = 'min-size'
}
}
if (!$Symbols -and $Runtime -notlike 'fxdependent*' -and !$ForMinimalSize)
{
if ($Runtime -notmatch 'arm')
{
Write-Verbose "Starting powershell packaging(msi)..." -Verbose
Start-PSPackage @pspackageParams @releaseTagParam
}
$pspackageParams['Type']='msix'
Write-Verbose "Starting powershell packaging(msix)..." -Verbose
Start-PSPackage @pspackageParams @releaseTagParam
}
if ($Runtime -like 'fxdependent*' -or $ForMinimalSize)
{
## Add symbols for just like zip package.
$pspackageParams['IncludeSymbols']=$Symbols
Start-PSPackage @pspackageParams @releaseTagParam
## Copy the fxdependent Zip package to destination.
Get-ChildItem $location\PowerShell-*.zip | ForEach-Object {
$file = $_.FullName
Write-Verbose "Copying $file to $destination" -Verbose
Copy-Item -Path $file -Destination "$destination\" -Force
}
}
else
{
if (!$Symbols) {
$pspackageParams['Type'] = 'zip-pdb'
Write-Verbose "Starting powershell symbols packaging(zip)..." -Verbose
Start-PSPackage @pspackageParams @releaseTagParam
}
$pspackageParams['Type']='zip'
$pspackageParams['IncludeSymbols']=$Symbols
Write-Verbose "Starting powershell packaging(zip)..." -Verbose
Start-PSPackage @pspackageParams @releaseTagParam
Write-Verbose "Exporting packages ..." -Verbose
Get-ChildItem $location\*.msi,$location\*.zip,$location\*.wixpdb,$location\*.msix,$location\*.exe | ForEach-Object {
$file = $_.FullName
Write-Verbose "Copying $file to $destination" -Verbose
Copy-Item -Path $file -Destination "$destination\" -Force
}
}
}
finally
{
Write-Verbose "Beginning build clean-up..." -Verbose
if ($Wait)
{
$path = Join-Path $PSScriptRoot -ChildPath 'delete-to-continue.txt'
$null = New-Item -Path $path -ItemType File
Write-Verbose "Computer name: $env:COMPUTERNAME" -Verbose
Write-Verbose "Delete $path to exit." -Verbose
while(Test-Path -LiteralPath $path)
{
Start-Sleep -Seconds 60
}
}
}