mirror of
https://github.com/PowerShell/PowerShell
synced 2026-06-08 12:12:50 +00:00
[release/v7.4] Cleanup old release pipelines (#25404)
Co-authored-by: Travis Plunk <travis.plunk@microsoft.com>
This commit is contained in:
co-authored by
Travis Plunk
parent
4586837828
commit
b543ea699f
@@ -1 +0,0 @@
|
||||
PSRelease/
|
||||
@@ -1,145 +0,0 @@
|
||||
# Copyright (c) Microsoft Corporation.
|
||||
# Licensed under the MIT License.
|
||||
|
||||
# PowerShell Script to build and package PowerShell from specified form and branch
|
||||
# Script is intented to use in Docker containers
|
||||
# Ensure PowerShell is available in the provided image
|
||||
|
||||
param (
|
||||
[string] $location = "/powershell",
|
||||
|
||||
# Destination location of the package on docker host
|
||||
[string] $destination = '/mnt',
|
||||
|
||||
[ValidatePattern("^v\d+\.\d+\.\d+(-\w+(\.\d{1,2})?)?$")]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[string]$ReleaseTag,
|
||||
|
||||
[switch]$TarX64,
|
||||
[switch]$TarArm,
|
||||
[switch]$TarArm64,
|
||||
[switch]$TarMinSize,
|
||||
[switch]$FxDependent,
|
||||
[switch]$Alpine
|
||||
)
|
||||
|
||||
$releaseTagParam = @{}
|
||||
if ($ReleaseTag)
|
||||
{
|
||||
$releaseTagParam = @{ 'ReleaseTag' = $ReleaseTag }
|
||||
}
|
||||
|
||||
#Remove the initial 'v' from the ReleaseTag
|
||||
$version = $ReleaseTag -replace '^v'
|
||||
$semVersion = [System.Management.Automation.SemanticVersion] $version
|
||||
|
||||
$metadata = Get-Content "$location/tools/metadata.json" -Raw | ConvertFrom-Json
|
||||
|
||||
$LTS = $metadata.LTSRelease.Package
|
||||
|
||||
Write-Verbose -Verbose -Message "LTS is set to: $LTS"
|
||||
|
||||
function BuildPackages {
|
||||
param(
|
||||
[switch] $LTS
|
||||
)
|
||||
|
||||
Push-Location
|
||||
try {
|
||||
Set-Location $location
|
||||
Import-Module "$location/build.psm1"
|
||||
Import-Module "$location/tools/packaging"
|
||||
|
||||
Start-PSBootstrap -Package -NoSudo
|
||||
|
||||
$buildParams = @{ Configuration = 'Release'; PSModuleRestore = $true; Restore = $true }
|
||||
|
||||
if ($FxDependent.IsPresent) {
|
||||
$projectAssetsZipName = 'linuxFxDependantProjectAssetssymbols.zip'
|
||||
$buildParams.Add("Runtime", "fxdependent")
|
||||
} elseif ($Alpine.IsPresent) {
|
||||
$projectAssetsZipName = 'linuxAlpineProjectAssetssymbols.zip'
|
||||
$buildParams.Add("Runtime", 'musl-x64')
|
||||
} else {
|
||||
# make the artifact name unique
|
||||
$projectAssetsZipName = "linuxProjectAssets-$((Get-Date).Ticks)-symbols.zip"
|
||||
}
|
||||
|
||||
Start-PSBuild @buildParams @releaseTagParam
|
||||
$options = Get-PSOptions
|
||||
|
||||
if ($FxDependent) {
|
||||
Start-PSPackage -Type 'fxdependent' @releaseTagParam -LTS:$LTS
|
||||
} elseif ($Alpine) {
|
||||
Start-PSPackage -Type 'tar-alpine' @releaseTagParam -LTS:$LTS
|
||||
} else {
|
||||
Start-PSPackage @releaseTagParam -LTS:$LTS
|
||||
}
|
||||
|
||||
if ($TarX64) { Start-PSPackage -Type tar @releaseTagParam -LTS:$LTS }
|
||||
|
||||
if ($TarMinSize) {
|
||||
Write-Verbose -Verbose "---- Min-Size ----"
|
||||
Write-Verbose -Verbose "options.Output: $($options.Output)"
|
||||
Write-Verbose -Verbose "options.Top $($options.Top)"
|
||||
|
||||
$binDir = Join-Path -Path $options.Top -ChildPath 'bin'
|
||||
Write-Verbose -Verbose "Remove $binDir, to get a clean build for min-size package"
|
||||
Remove-Item -Path $binDir -Recurse -Force
|
||||
|
||||
## Build 'min-size' and create 'tar.gz' package for it.
|
||||
$buildParams['ForMinimalSize'] = $true
|
||||
Start-PSBuild @buildParams @releaseTagParam
|
||||
Start-PSPackage -Type min-size @releaseTagParam -LTS:$LTS
|
||||
}
|
||||
|
||||
if ($TarArm) {
|
||||
## Build 'linux-arm' and create 'tar.gz' package for it.
|
||||
## Note that 'linux-arm' can only be built on Ubuntu environment.
|
||||
Start-PSBuild -Configuration Release -Restore -Runtime linux-arm -PSModuleRestore @releaseTagParam
|
||||
Start-PSPackage -Type tar-arm @releaseTagParam -LTS:$LTS
|
||||
}
|
||||
|
||||
if ($TarArm64) {
|
||||
Start-PSBuild -Configuration Release -Restore -Runtime linux-arm64 -PSModuleRestore @releaseTagParam
|
||||
Start-PSPackage -Type tar-arm64 @releaseTagParam -LTS:$LTS
|
||||
}
|
||||
} finally {
|
||||
Pop-Location
|
||||
}
|
||||
}
|
||||
|
||||
BuildPackages
|
||||
|
||||
if ($LTS) {
|
||||
Write-Verbose -Verbose "Packaging LTS"
|
||||
BuildPackages -LTS
|
||||
}
|
||||
|
||||
$linuxPackages = Get-ChildItem "$location/powershell*" -Include *.deb,*.rpm,*.tar.gz
|
||||
|
||||
foreach ($linuxPackage in $linuxPackages)
|
||||
{
|
||||
$filePath = $linuxPackage.FullName
|
||||
Write-Verbose "Copying $filePath to $destination" -Verbose
|
||||
Copy-Item -Path $filePath -Destination $destination -Force
|
||||
}
|
||||
|
||||
Write-Verbose "Exporting project.assets files ..." -Verbose
|
||||
|
||||
$projectAssetsCounter = 1
|
||||
$projectAssetsFolder = Join-Path -Path $destination -ChildPath 'projectAssets'
|
||||
$projectAssetsZip = Join-Path -Path $destination -ChildPath $projectAssetsZipName
|
||||
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
|
||||
$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
|
||||
-213
@@ -1,213 +0,0 @@
|
||||
# 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 -ErrorAction Stop
|
||||
|
||||
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)
|
||||
{
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,115 +0,0 @@
|
||||
# Copyright (c) Microsoft Corporation.
|
||||
# Licensed under the MIT License.
|
||||
function Install-ChocolateyPackage
|
||||
{
|
||||
param(
|
||||
[Parameter(Mandatory=$true)]
|
||||
[string]
|
||||
$PackageName,
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[string]
|
||||
$Executable,
|
||||
|
||||
[string[]]
|
||||
$ArgumentList,
|
||||
|
||||
[switch]
|
||||
$Cleanup,
|
||||
|
||||
[int]
|
||||
$ExecutionTimeout = 2700,
|
||||
|
||||
[string]
|
||||
$Version
|
||||
)
|
||||
|
||||
if(-not(Get-Command -Name Choco -ErrorAction SilentlyContinue))
|
||||
{
|
||||
Write-Verbose "Installing Chocolatey provider..." -Verbose
|
||||
Invoke-WebRequest https://chocolatey.org/install.ps1 -UseBasicParsing | Invoke-Expression
|
||||
}
|
||||
|
||||
Write-Verbose "Installing $PackageName..." -Verbose
|
||||
$extraCommand = @()
|
||||
if($Version)
|
||||
{
|
||||
$extraCommand += '--version', $version
|
||||
}
|
||||
choco install -y $PackageName --no-progress --execution-timeout=$ExecutionTimeout $ArgumentList $extraCommands
|
||||
|
||||
if($executable)
|
||||
{
|
||||
Write-Verbose "Verifing $Executable is in path..." -Verbose
|
||||
$exeSource = $null
|
||||
$exeSource = Get-ChildItem -Path "$env:ProgramFiles\$Executable" -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName
|
||||
if(!$exeSource)
|
||||
{
|
||||
Write-Verbose "Falling back to x86 program files..." -Verbose
|
||||
$exeSource = Get-ChildItem -Path "${env:ProgramFiles(x86)}\$Executable" -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName
|
||||
}
|
||||
|
||||
# Don't search the chocolatey program data until more official locations have been searched
|
||||
if(!$exeSource)
|
||||
{
|
||||
Write-Verbose "Falling back to chocolatey..." -Verbose
|
||||
$exeSource = Get-ChildItem -Path "$env:ProgramData\chocolatey\$Executable" -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName
|
||||
}
|
||||
|
||||
# all obvious locations are exhausted, use brute force and search from the root of the filesystem
|
||||
if(!$exeSource)
|
||||
{
|
||||
Write-Verbose "Falling back to the root of the drive..." -Verbose
|
||||
$exeSource = Get-ChildItem -Path "/$Executable" -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName
|
||||
}
|
||||
|
||||
if(!$exeSource)
|
||||
{
|
||||
throw "$Executable not found"
|
||||
}
|
||||
|
||||
$exePath = Split-Path -Path $exeSource
|
||||
Append-Path -path $exePath
|
||||
}
|
||||
|
||||
if($Cleanup.IsPresent)
|
||||
{
|
||||
Remove-Folder -Folder "$env:temp\chocolatey"
|
||||
}
|
||||
}
|
||||
|
||||
function Append-Path
|
||||
{
|
||||
param
|
||||
(
|
||||
$path
|
||||
)
|
||||
$machinePathString = [System.Environment]::GetEnvironmentVariable('path',[System.EnvironmentVariableTarget]::Machine)
|
||||
$machinePath = $machinePathString -split ';'
|
||||
|
||||
if($machinePath -inotcontains $path)
|
||||
{
|
||||
$newPath = "$machinePathString;$path"
|
||||
Write-Verbose "Adding $path to path..." -Verbose
|
||||
[System.Environment]::SetEnvironmentVariable('path',$newPath,[System.EnvironmentVariableTarget]::Machine)
|
||||
Write-Verbose "Added $path to path." -Verbose
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Verbose "$path already in path." -Verbose
|
||||
}
|
||||
}
|
||||
|
||||
function Remove-Folder
|
||||
{
|
||||
param(
|
||||
[string]
|
||||
$Folder
|
||||
)
|
||||
|
||||
Write-Verbose "Cleaning up $Folder..." -Verbose
|
||||
$filter = Join-Path -Path $Folder -ChildPath *
|
||||
[int]$measuredCleanupMB = (Get-ChildItem $filter -Recurse | Measure-Object -Property Length -Sum).Sum / 1MB
|
||||
Remove-Item -Recurse -Force $filter -ErrorAction SilentlyContinue
|
||||
Write-Verbose "Cleaned up $measuredCleanupMB MB from $Folder" -Verbose
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
# Azure Dev Ops Release Builds
|
||||
|
||||
## Requirements
|
||||
|
||||
Docker must be installed to run any of the release builds.
|
||||
|
||||
## Running Windows Release Builds Locally
|
||||
|
||||
From PowerShell on Windows, run `.\vstsbuild.ps1 -ReleaseTag <tag> -Name <buildName>`.
|
||||
|
||||
For the package builds, run `.\vstsbuild.ps1 -ReleaseTag <tag> -Name <buildName> -BuildPath <path to extracted zip from build step> -SignedFilesPath <path to extracted 'symbol' zip from build step>`
|
||||
|
||||
Windows Build Names:
|
||||
|
||||
* `win7-x64-symbols`
|
||||
* Builds the Windows x64 Zip with symbols
|
||||
* `win7-x86-symbols`
|
||||
* Builds the Windows x86 Zip with symbols
|
||||
* `win7-arm-symbols`
|
||||
* Builds the Windows ARM Zip with symbols
|
||||
* `win7-arm64-symbols`
|
||||
* Builds the Windows ARM64 Zip with symbols
|
||||
* `win7-fxdependent-symbols`
|
||||
* Builds the Windows FxDependent Zip with symbols
|
||||
* `win7-x64-package`
|
||||
* Builds the Windows x64 packages
|
||||
* `win7-x86-package`
|
||||
* Builds the Windows x86 packages
|
||||
* `win7-arm-package`
|
||||
* Builds the Windows ARM packages
|
||||
* `win7-arm64-package`
|
||||
* Builds the Windows ARM64 packages
|
||||
* `win7-fxdependent-package`
|
||||
* Builds the Windows FxDependent packages
|
||||
|
||||
## Running Linux Release Builds Locally
|
||||
|
||||
From PowerShell on Linux or macOS, run `.\vstsbuild.ps1 -ReleaseTag <tag> -Name <buildName>`.
|
||||
|
||||
Linux Build Names:
|
||||
|
||||
* `deb`
|
||||
* Builds the Debian Packages, ARM32 and ARM64.
|
||||
* `alpine`
|
||||
* Builds the Alpine Package
|
||||
* `rpm`
|
||||
* Builds the RedHat variant Package
|
||||
|
||||
## Azure Dev Ops Build
|
||||
|
||||
The release build is fairly complicated. The definition is at `./azureDevOps/releaseBuild.yml`.
|
||||
|
||||
Here is a diagram of the build:
|
||||
|
||||
[](https://raw.githubusercontent.com/PowerShell/PowerShell/master/tools/releaseBuild/azureDevOps/diagram.svg?sanitize=true)
|
||||
@@ -1,33 +0,0 @@
|
||||
# Sync packages from PSGallery to Azure DevOps Artifacts feed
|
||||
|
||||
resources:
|
||||
- repo: self
|
||||
clean: true
|
||||
|
||||
pool:
|
||||
name: 1es
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Minimal
|
||||
|
||||
steps:
|
||||
- pwsh: |
|
||||
$minVer = [version]"2.2.3"
|
||||
$curVer = Get-Module PowerShellGet -ListAvailable | Select-Object -First 1 | ForEach-Object Version
|
||||
if (-not $curVer -or $curVer -lt $minVer) {
|
||||
Install-Module -Name PowerShellGet -MinimumVersion 2.2.3 -Force
|
||||
}
|
||||
displayName: Update PSGet and PackageManagement
|
||||
condition: succeededOrFailed()
|
||||
|
||||
- pwsh: |
|
||||
Write-Verbose -Verbose "Packages to upload"
|
||||
if(Test-Path $(Build.ArtifactStagingDirectory)) { Get-ChildItem "$(Build.ArtifactStagingDirectory)/*.nupkg" | ForEach-Object { $_.FullName }}
|
||||
displayName: List packages to upload
|
||||
condition: succeededOrFailed()
|
||||
|
||||
- task: NuGetCommand@2
|
||||
displayName: 'NuGet push'
|
||||
inputs:
|
||||
command: push
|
||||
publishVstsFeed: 'pscore-release'
|
||||
publishFeedCredentials: 'AzArtifactsFeed'
|
||||
@@ -1,67 +0,0 @@
|
||||
name: Compliance-$(Build.BuildId)
|
||||
|
||||
trigger: none
|
||||
pr: none
|
||||
|
||||
schedules:
|
||||
# Chrontab format, see https://en.wikipedia.org/wiki/Cron
|
||||
# this is in UTC
|
||||
- cron: '0 13 * * *'
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
|
||||
resources:
|
||||
repositories:
|
||||
- repository: ComplianceRepo
|
||||
type: github
|
||||
endpoint: ComplianceGHRepo
|
||||
name: PowerShell/compliance
|
||||
ref: master
|
||||
|
||||
parameters:
|
||||
- name: InternalSDKBlobURL
|
||||
displayName: URL to the blob havibg internal .NET SDK
|
||||
type: string
|
||||
default: ' '
|
||||
|
||||
variables:
|
||||
- name: DOTNET_CLI_TELEMETRY_OPTOUT
|
||||
value: 1
|
||||
- name: POWERSHELL_TELEMETRY_OPTOUT
|
||||
value: 1
|
||||
- name: nugetMultiFeedWarnLevel
|
||||
value: none
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
# Defines the variables AzureFileCopySubscription, StorageAccount, StorageAccountKey, StorageResourceGroup, StorageSubscriptionName
|
||||
- group: 'Azure Blob variable group'
|
||||
# Defines the variables CgPat, CgOrganization, and CgProject
|
||||
- group: 'ComponentGovernance'
|
||||
- group: 'PoolNames'
|
||||
- name: __DOTNET_RUNTIME_FEED
|
||||
value: ${{ parameters.InternalSDKBlobURL }}
|
||||
|
||||
|
||||
stages:
|
||||
- stage: compliance
|
||||
displayName: 'Compliance'
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- template: templates/compliance/compliance.yml
|
||||
parameters:
|
||||
parentJobs: []
|
||||
- stage: APIScan
|
||||
displayName: 'ApiScan'
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- template: templates/compliance/apiscan.yml
|
||||
parameters:
|
||||
parentJobs: []
|
||||
- stage: notice
|
||||
displayName: Generate Notice File
|
||||
dependsOn: []
|
||||
jobs:
|
||||
- template: templates/compliance/generateNotice.yml
|
||||
parameters:
|
||||
parentJobs: []
|
||||
@@ -1,107 +0,0 @@
|
||||
@startuml
|
||||
|
||||
folder "Linux Builds" as LinuxBuilds {
|
||||
' Define the build tasks as business processes
|
||||
agent "DEB" as BuildDEB
|
||||
agent "RPM" as BuildRPM
|
||||
agent "Alpine" as BuildAlpine
|
||||
agent "Linux-FxDependent" as BuildLinuxFx
|
||||
|
||||
}
|
||||
|
||||
agent "macOS Build" as BuildMac
|
||||
|
||||
agent "Upload build metadata" as BuildMetadata
|
||||
|
||||
folder "Windows Builds" as WinBuilds {
|
||||
agent "x64" as BuildWinX64
|
||||
agent "x86" as BuildWinX86
|
||||
agent "arm32" as BuildWinArm32
|
||||
agent "arm64" as BuildWinArm64
|
||||
agent "FxDependent" as BuildWinFx
|
||||
}
|
||||
|
||||
agent "ComponentRegistration" as BuildCG
|
||||
|
||||
folder "Linux Package Scanning and Upload" as PkgScanUploadLinux {
|
||||
agent "DEB" as UploadDEB
|
||||
agent "RPM" as UploadRPM
|
||||
agent "Alpine" as UploadAlpine
|
||||
agent "Linux-FxDependent" as UploadLinuxFx
|
||||
}
|
||||
|
||||
folder "Package Signing and Upload" as PkgSignUpload {
|
||||
agent "macOS" as SignMac
|
||||
|
||||
agent "Windows" as SignWin
|
||||
}
|
||||
|
||||
folder "Build Test Artifacts" as TestArtifacts {
|
||||
agent "Windows" as WinTest
|
||||
agent "Linux" as LinuxTest
|
||||
agent "Linux-ARM" as LinuxArmTest
|
||||
agent "Linux-ARM64" as LinuxArm64Test
|
||||
}
|
||||
|
||||
agent "Compliance" as Compliance
|
||||
|
||||
|
||||
agent "Create SDK and Global Tool and Upload" as BuildNuGet
|
||||
|
||||
|
||||
' Define finishing the build as a goal filled
|
||||
control "Finish" as Finish
|
||||
control "Start" as Start
|
||||
|
||||
' map the various Upload task dependencies
|
||||
BuildDEB -down-> UploadDEB
|
||||
BuildRPM -down-> UploadRPM
|
||||
BuildLinuxFx -down-> UploadLinuxFx
|
||||
BuildAlpine -down-> UploadAlpine
|
||||
|
||||
' map all of the SignMac task dependencies
|
||||
BuildMac -down-> SignMac
|
||||
|
||||
' map all of the SignWin task dependencies
|
||||
WinBuilds -down-> SignWin
|
||||
'BuildWinX64 -down-> SignWin
|
||||
'BuildWinX86 -down-> SignWin
|
||||
'BuildWinArm32 -down-> SignWin
|
||||
'BuildWinArm64 -down-> SignWin
|
||||
'BuildWinFx -down-> SignWin
|
||||
|
||||
' map all of the Compliance task dependencies
|
||||
BuildWinX86 -down-> Compliance
|
||||
BuildWinX64 -down-> Compliance
|
||||
BuildWinFx -down-> Compliance
|
||||
|
||||
PkgSignUpload -down-> BuildNuGet
|
||||
LinuxBuilds -down-> BuildNuGet
|
||||
|
||||
' map all leafs to finish
|
||||
Compliance ~~ Finish
|
||||
UploadAlpine ~~ Finish
|
||||
UploadDEB ~~ Finish
|
||||
UploadRPM ~~ Finish
|
||||
UploadLinuxFx ~~ Finish
|
||||
SignMac ~~ Finish
|
||||
BuildCG ~~ Finish
|
||||
BuildNuGet ~~ Finish
|
||||
TestArtifacts ~~ Finish
|
||||
BuildMetadata ~~ Finish
|
||||
|
||||
Start ~~ BuildDEB
|
||||
Start ~~ BuildRPM
|
||||
Start ~~ BuildAlpine
|
||||
Start ~~ BuildLinuxFx
|
||||
Start ~~ BuildMac
|
||||
Start ~~ BuildWinX64
|
||||
Start ~~ BuildWinX86
|
||||
Start ~~ BuildWinFx
|
||||
Start ~~ BuildWinArm32
|
||||
Start ~~ BuildWinArm64
|
||||
Start ~~ BuildCG
|
||||
Start ~~ TestArtifacts
|
||||
Start ~~ BuildMetadata
|
||||
|
||||
@enduml
|
||||
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 24 KiB |
@@ -1,379 +0,0 @@
|
||||
name: UnifiedPackageBuild-$(Build.BuildId)
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- release*
|
||||
pr:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- release*
|
||||
|
||||
parameters:
|
||||
- name: ForceAzureBlobDelete
|
||||
displayName: Delete Azure Blob
|
||||
type: string
|
||||
values:
|
||||
- true
|
||||
- false
|
||||
default: false
|
||||
- name: InternalSDKBlobURL
|
||||
displayName: URL to the blob having internal .NET SDK
|
||||
type: string
|
||||
default: ' '
|
||||
|
||||
resources:
|
||||
repositories:
|
||||
- repository: ComplianceRepo
|
||||
type: github
|
||||
endpoint: ComplianceGHRepo
|
||||
name: PowerShell/compliance
|
||||
ref: master
|
||||
|
||||
variables:
|
||||
- name: PS_RELEASE_BUILD
|
||||
value: 1
|
||||
- name: DOTNET_CLI_TELEMETRY_OPTOUT
|
||||
value: 1
|
||||
- name: POWERSHELL_TELEMETRY_OPTOUT
|
||||
value: 1
|
||||
- name: nugetMultiFeedWarnLevel
|
||||
value: none
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
# Prevents auto-injection of nuget-security-analysis@0
|
||||
- name: skipNugetSecurityAnalysis
|
||||
value: true
|
||||
- name: branchCounterKey
|
||||
value: $[format('{0:yyyyMMdd}-{1}', pipeline.startTime,variables['Build.SourceBranch'])]
|
||||
- name: branchCounter
|
||||
value: $[counter(variables['branchCounterKey'], 1)]
|
||||
- name: ForceAzureBlobDelete
|
||||
value: ${{ parameters.ForceAzureBlobDelete }}
|
||||
- name: Github_Build_Repository_Uri
|
||||
value: https://github.com/powershell/powershell
|
||||
- name: SBOMGenerator_Formats
|
||||
value: spdx:2.2
|
||||
- name: BUILDSECMON_OPT_IN
|
||||
value: true
|
||||
- group: PoolNames
|
||||
- name: __DOTNET_RUNTIME_FEED
|
||||
value: ${{ parameters.InternalSDKBlobURL }}
|
||||
|
||||
stages:
|
||||
- stage: prep
|
||||
jobs:
|
||||
- template: templates/checkAzureContainer.yml
|
||||
|
||||
- stage: macos
|
||||
dependsOn: ['prep']
|
||||
jobs:
|
||||
- template: templates/mac.yml
|
||||
parameters:
|
||||
buildArchitecture: x64
|
||||
|
||||
- template: templates/mac.yml
|
||||
parameters:
|
||||
buildArchitecture: arm64
|
||||
|
||||
- stage: linux
|
||||
dependsOn: ['prep']
|
||||
jobs:
|
||||
- template: templates/linux.yml
|
||||
parameters:
|
||||
buildName: deb
|
||||
|
||||
- template: templates/linux.yml
|
||||
parameters:
|
||||
buildName: rpm
|
||||
parentJob: build_deb
|
||||
|
||||
- template: templates/linux.yml
|
||||
parameters:
|
||||
buildName: fxdependent
|
||||
parentJob: build_deb
|
||||
|
||||
- template: templates/linux.yml
|
||||
parameters:
|
||||
buildName: alpine
|
||||
|
||||
- stage: windows
|
||||
dependsOn: ['prep']
|
||||
jobs:
|
||||
- template: templates/windows-hosted-build.yml
|
||||
parameters:
|
||||
Architecture: x64
|
||||
|
||||
- template: templates/windows-hosted-build.yml
|
||||
parameters:
|
||||
Architecture: x64
|
||||
BuildConfiguration: minSize
|
||||
|
||||
- template: templates/windows-hosted-build.yml
|
||||
parameters:
|
||||
Architecture: x86
|
||||
|
||||
- template: templates/windows-hosted-build.yml
|
||||
parameters:
|
||||
Architecture: arm64
|
||||
|
||||
- template: templates/windows-hosted-build.yml
|
||||
parameters:
|
||||
Architecture: fxdependent
|
||||
|
||||
- template: templates/windows-hosted-build.yml
|
||||
parameters:
|
||||
Architecture: fxdependentWinDesktop
|
||||
|
||||
- stage: SignFiles
|
||||
displayName: Sign files
|
||||
dependsOn: ['windows', 'linux', 'macos']
|
||||
jobs:
|
||||
- template: templates/mac-file-signing.yml
|
||||
parameters:
|
||||
buildArchitecture: x64
|
||||
|
||||
- template: templates/mac-file-signing.yml
|
||||
parameters:
|
||||
buildArchitecture: arm64
|
||||
|
||||
- job: SignFilesWinLinux
|
||||
pool:
|
||||
name: $(windowsPool)
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
displayName: Sign files
|
||||
|
||||
variables:
|
||||
- group: ESRP
|
||||
- name: runCodesignValidationInjection
|
||||
value: false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
- name: repoFolder
|
||||
value: PowerShell
|
||||
- name: repoRoot
|
||||
value: $(Agent.BuildDirectory)\$(repoFolder)
|
||||
- name: complianceRepoFolder
|
||||
value: compliance
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
linux-x64:
|
||||
runtime: linux-x64
|
||||
unsignedBuildArtifactContainer: pwshLinuxBuild.tar.gz
|
||||
unsignedBuildArtifactName: pwshLinuxBuild.tar.gz
|
||||
signedBuildArtifactName: pwshLinuxBuild.tar.gz
|
||||
signedArtifactContainer: authenticode-signed
|
||||
linux-x64-Alpine:
|
||||
runtime: linux-x64-Alpine
|
||||
unsignedBuildArtifactContainer: pwshLinuxBuildAlpine.tar.gz
|
||||
unsignedBuildArtifactName: pwshLinuxBuild.tar.gz
|
||||
signedBuildArtifactName: pwshLinuxBuildAlpine.tar.gz
|
||||
signedArtifactContainer: authenticode-signed
|
||||
linux-x64-Alpine-Fxdependent:
|
||||
runtime: linux-x64-Alpine-Fxdependent
|
||||
unsignedBuildArtifactContainer: pwshAlpineFxdBuildAmd64.tar.gz
|
||||
unsignedBuildArtifactName: pwshAlpineFxdBuildAmd64.tar.gz
|
||||
signedBuildArtifactName: pwshAlpineFxdBuildAmd64.tar.gz
|
||||
signedArtifactContainer: authenticode-signed
|
||||
linux-arm32:
|
||||
runtime: linux-arm32
|
||||
unsignedBuildArtifactContainer: pwshLinuxBuildArm32.tar.gz
|
||||
unsignedBuildArtifactName: pwshLinuxBuildArm32.tar.gz
|
||||
signedBuildArtifactName: pwshLinuxBuildArm32.tar.gz
|
||||
signedArtifactContainer: authenticode-signed
|
||||
linux-arm64:
|
||||
runtime: linux-arm64
|
||||
unsignedBuildArtifactContainer: pwshLinuxBuildArm64.tar.gz
|
||||
unsignedBuildArtifactName: pwshLinuxBuildArm64.tar.gz
|
||||
signedBuildArtifactName: pwshLinuxBuildArm64.tar.gz
|
||||
signedArtifactContainer: authenticode-signed
|
||||
linux-fxd:
|
||||
runtime: linux-fxd
|
||||
unsignedBuildArtifactContainer: pwshLinuxBuildFxdependent.tar.gz
|
||||
unsignedBuildArtifactName: pwshLinuxBuild.tar.gz
|
||||
signedBuildArtifactName: pwshLinuxBuildFxdependent.tar.gz
|
||||
signedArtifactContainer: authenticode-signed
|
||||
linux-mariner:
|
||||
runtime: linux-mariner
|
||||
unsignedBuildArtifactContainer: pwshMarinerBuildAmd64.tar.gz
|
||||
unsignedBuildArtifactName: pwshMarinerBuildAmd64.tar.gz
|
||||
signedBuildArtifactName: pwshMarinerBuildAmd64.tar.gz
|
||||
signedArtifactContainer: authenticode-signed
|
||||
linux-arm64-mariner:
|
||||
runtime: linux-arm64-mariner
|
||||
unsignedBuildArtifactContainer: pwshMarinerBuildArm64.tar.gz
|
||||
unsignedBuildArtifactName: pwshMarinerBuildArm64.tar.gz
|
||||
signedBuildArtifactName: pwshMarinerBuildArm64.tar.gz
|
||||
signedArtifactContainer: authenticode-signed
|
||||
linux-minsize:
|
||||
runtime: linux-minsize
|
||||
unsignedBuildArtifactContainer: pwshLinuxBuildMinSize.tar.gz
|
||||
unsignedBuildArtifactName: pwshLinuxBuildMinSize.tar.gz
|
||||
signedBuildArtifactName: pwshLinuxBuildMinSize.tar.gz
|
||||
signedArtifactContainer: authenticode-signed
|
||||
win-x64:
|
||||
runtime: win-x64
|
||||
unsignedBuildArtifactContainer: results
|
||||
unsignedBuildArtifactName: '**/*-symbols-win-x64.zip'
|
||||
signedBuildArtifactName: '-symbols-win-x64-signed.zip'
|
||||
signedArtifactContainer: results
|
||||
win-x86:
|
||||
runtime: win-x86
|
||||
unsignedBuildArtifactContainer: results
|
||||
unsignedBuildArtifactName: '**/*-symbols-win-x86.zip'
|
||||
signedBuildArtifactName: '-symbols-win-x86-signed.zip'
|
||||
signedArtifactContainer: results
|
||||
win-arm64:
|
||||
runtime: win-arm64
|
||||
unsignedBuildArtifactContainer: results
|
||||
unsignedBuildArtifactName: '**/*-symbols-win-arm64.zip'
|
||||
signedBuildArtifactName: '-symbols-win-arm64-signed.zip'
|
||||
signedArtifactContainer: results
|
||||
win-x64-gc:
|
||||
runtime: win-x64-gc
|
||||
unsignedBuildArtifactContainer: results
|
||||
unsignedBuildArtifactName: '**/*-symbols-win-x64-gc.zip'
|
||||
signedBuildArtifactName: '-symbols-win-x64-gc-signed.zip'
|
||||
signedArtifactContainer: results
|
||||
win-fxdependent:
|
||||
runtime: win-fxdependent
|
||||
unsignedBuildArtifactContainer: results
|
||||
unsignedBuildArtifactName: '**/*-symbols-win-fxdependent.zip'
|
||||
signedBuildArtifactName: '-symbols-win-fxdependent-signed.zip'
|
||||
signedArtifactContainer: results
|
||||
win-fxdependentWinDesktop:
|
||||
runtime: win-fxdependentWinDesktop
|
||||
unsignedBuildArtifactContainer: results
|
||||
unsignedBuildArtifactName: '**/*-symbols-win-fxdependentWinDesktop.zip'
|
||||
signedBuildArtifactName: '-symbols-win-fxdependentWinDesktop-signed.zip'
|
||||
signedArtifactContainer: results
|
||||
steps:
|
||||
- template: templates/sign-build-file.yml
|
||||
|
||||
- stage: mac_packaging
|
||||
displayName: macOS packaging
|
||||
dependsOn: ['SignFiles']
|
||||
jobs:
|
||||
- template: templates/mac-package-build.yml
|
||||
parameters:
|
||||
buildArchitecture: x64
|
||||
|
||||
- template: templates/mac-package-build.yml
|
||||
parameters:
|
||||
buildArchitecture: arm64
|
||||
|
||||
- stage: linux_packaging
|
||||
displayName: Linux Packaging
|
||||
dependsOn: ['SignFiles']
|
||||
jobs:
|
||||
- template: templates/linux-packaging.yml
|
||||
parameters:
|
||||
buildName: deb
|
||||
|
||||
- template: templates/linux-packaging.yml
|
||||
parameters:
|
||||
buildName: rpm
|
||||
uploadDisplayName: Upload and Sign
|
||||
|
||||
- template: templates/linux-packaging.yml
|
||||
parameters:
|
||||
buildName: alpine
|
||||
|
||||
- template: templates/linux-packaging.yml
|
||||
parameters:
|
||||
buildName: fxdependent
|
||||
|
||||
- stage: win_packaging
|
||||
displayName: Windows Packaging
|
||||
dependsOn: ['SignFiles']
|
||||
jobs:
|
||||
- template: templates/windows-packaging.yml
|
||||
parameters:
|
||||
Architecture: x64
|
||||
parentJob: build_windows_x64_release
|
||||
|
||||
- template: templates/windows-packaging.yml
|
||||
parameters:
|
||||
Architecture: x64
|
||||
BuildConfiguration: minSize
|
||||
parentJob: build_windows_x64_minSize
|
||||
|
||||
- template: templates/windows-packaging.yml
|
||||
parameters:
|
||||
Architecture: x86
|
||||
parentJob: build_windows_x86_release
|
||||
|
||||
- template: templates/windows-packaging.yml
|
||||
parameters:
|
||||
Architecture: arm64
|
||||
parentJob: build_windows_arm64_release
|
||||
|
||||
- template: templates/windows-packaging.yml
|
||||
parameters:
|
||||
Architecture: fxdependent
|
||||
parentJob: build_windows_fxdependent_release
|
||||
|
||||
- template: templates/windows-packaging.yml
|
||||
parameters:
|
||||
Architecture: fxdependentWinDesktop
|
||||
parentJob: build_windows_fxdependentWinDesktop_release
|
||||
|
||||
- stage: package_signing
|
||||
displayName: Package Signing
|
||||
dependsOn: ['mac_packaging', 'linux_packaging', 'win_packaging']
|
||||
jobs:
|
||||
- template: templates/windows-package-signing.yml
|
||||
|
||||
- template: templates/mac-package-signing.yml
|
||||
parameters:
|
||||
buildArchitecture: x64
|
||||
|
||||
- template: templates/mac-package-signing.yml
|
||||
parameters:
|
||||
buildArchitecture: arm64
|
||||
|
||||
- stage: nuget_and_json
|
||||
displayName: NuGet Packaging and Build Json
|
||||
dependsOn: ['package_signing']
|
||||
jobs:
|
||||
- template: templates/nuget.yml
|
||||
- template: templates/json.yml
|
||||
|
||||
# This is done late so that we dont use resources before the big signing and packaging tasks.
|
||||
- stage: compliance
|
||||
dependsOn: ['package_signing']
|
||||
jobs:
|
||||
- template: templates/compliance.yml
|
||||
|
||||
- stage: test_and_release_artifacts
|
||||
displayName: Test and Release Artifacts
|
||||
dependsOn: ['prep']
|
||||
jobs:
|
||||
- template: templates/testartifacts.yml
|
||||
|
||||
- job: release_json
|
||||
displayName: Create and Upload release.json
|
||||
pool:
|
||||
name: $(windowsPool)
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
- template: templates/SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- powershell: |
|
||||
$metadata = Get-Content '$(Build.SourcesDirectory)/tools/metadata.json' -Raw | ConvertFrom-Json
|
||||
$LTS = $metadata.LTSRelease.Package
|
||||
@{ ReleaseVersion = "$(Version)"; LTSRelease = $LTS } | ConvertTo-Json | Out-File "$(Build.StagingDirectory)\release.json"
|
||||
Get-Content "$(Build.StagingDirectory)\release.json"
|
||||
Write-Host "##vso[artifact.upload containerfolder=metadata;artifactname=metadata]$(Build.StagingDirectory)\release.json"
|
||||
displayName: Create and upload release.json file to build artifact
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/step/finalize.yml
|
||||
@@ -1,63 +0,0 @@
|
||||
parameters:
|
||||
ReleaseTagVar: v6.2.0
|
||||
ReleaseTagVarName: ReleaseTagVar
|
||||
CreateJson: 'no'
|
||||
UseJson: 'yes'
|
||||
|
||||
steps:
|
||||
- ${{ if eq(parameters['UseJson'],'yes') }}:
|
||||
- task: DownloadBuildArtifacts@0
|
||||
inputs:
|
||||
artifactName: 'BuildInfoJson'
|
||||
itemPattern: '**/*.json'
|
||||
downloadPath: '$(System.ArtifactsDirectory)'
|
||||
displayName: Download Build Info Json
|
||||
|
||||
- powershell: |
|
||||
$path = "./build.psm1"
|
||||
|
||||
if($env:REPOROOT){
|
||||
Write-Verbose "reporoot already set to ${env:REPOROOT}" -Verbose
|
||||
exit 0
|
||||
}
|
||||
|
||||
if(Test-Path -Path $path)
|
||||
{
|
||||
Write-Verbose "reporoot detect at: ." -Verbose
|
||||
$repoRoot = '.'
|
||||
}
|
||||
else{
|
||||
$path = "./PowerShell/build.psm1"
|
||||
if(Test-Path -Path $path)
|
||||
{
|
||||
Write-Verbose "reporoot detect at: ./PowerShell" -Verbose
|
||||
$repoRoot = './PowerShell'
|
||||
}
|
||||
}
|
||||
if($repoRoot) {
|
||||
$vstsCommandString = "vso[task.setvariable variable=repoRoot]$repoRoot"
|
||||
Write-Host ("sending " + $vstsCommandString)
|
||||
Write-Host "##$vstsCommandString"
|
||||
} else {
|
||||
Write-Verbose -Verbose "repo not found"
|
||||
}
|
||||
displayName: 'Set repo Root'
|
||||
|
||||
- powershell: |
|
||||
$createJson = ("${{ parameters.CreateJson }}" -ne "no")
|
||||
$releaseTag = & "$env:REPOROOT/tools/releaseBuild/setReleaseTag.ps1" -ReleaseTag ${{ parameters.ReleaseTagVar }} -Variable "${{ parameters.ReleaseTagVarName }}" -CreateJson:$createJson
|
||||
$version = $releaseTag.Substring(1)
|
||||
$vstsCommandString = "vso[task.setvariable variable=Version]$version"
|
||||
Write-Host ("sending " + $vstsCommandString)
|
||||
Write-Host "##$vstsCommandString"
|
||||
|
||||
$azureVersion = $releaseTag.ToLowerInvariant() -replace '\.', '-'
|
||||
$vstsCommandString = "vso[task.setvariable variable=AzureVersion]$azureVersion"
|
||||
Write-Host ("sending " + $vstsCommandString)
|
||||
Write-Host "##$vstsCommandString"
|
||||
displayName: 'Set ${{ parameters.ReleaseTagVarName }} and other version Variables'
|
||||
|
||||
- powershell: |
|
||||
Get-ChildItem -Path env: | Out-String -width 9999 -Stream | write-Verbose -Verbose
|
||||
displayName: Capture environment
|
||||
condition: succeededOrFailed()
|
||||
@@ -1,51 +0,0 @@
|
||||
jobs:
|
||||
- job: DeleteBlob
|
||||
variables:
|
||||
- name: runCodesignValidationInjection
|
||||
value : false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
- group: Azure Blob variable group
|
||||
displayName: Delete blob is exists
|
||||
pool:
|
||||
name: PowerShell1ES
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
CreateJson: yes
|
||||
UseJson: no
|
||||
|
||||
- task: AzurePowerShell@4
|
||||
displayName: Check if blob exists and delete if specified
|
||||
inputs:
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
scriptType: inlineScript
|
||||
azurePowerShellVersion: latestVersion
|
||||
inline: |
|
||||
try {
|
||||
$container = Get-AzStorageContainer -Container '$(AzureVersion)' -Context (New-AzStorageContext -StorageAccountName '$(StorageAccount)') -ErrorAction Stop
|
||||
|
||||
if ($container -ne $null -and '$(ForceAzureBlobDelete)' -eq 'false') {
|
||||
throw 'Azure blob container $(AzureVersion) already exists. To overwrite, use ForceAzureBlobDelete parameter'
|
||||
}
|
||||
elseif ($container -ne $null -and '$(ForceAzureBlobDelete)' -eq 'true') {
|
||||
Write-Verbose -Verbose 'Removing container $(AzureVersion) due to ForceAzureBlobDelete parameter'
|
||||
Remove-AzStorageContainer -Name '$(AzureVersion)' -Context (New-AzStorageContext -StorageAccountName '$(StorageAccount)') -Force
|
||||
}
|
||||
}
|
||||
catch {
|
||||
if ($_.FullyQualifiedErrorId -eq 'ResourceNotFoundException,Microsoft.WindowsAzure.Commands.Storage.Blob.Cmdlet.GetAzureStorageContainerCommand') {
|
||||
Write-Verbose -Verbose 'Container "$(AzureVersion)" does not exists.'
|
||||
}
|
||||
else {
|
||||
throw $_
|
||||
}
|
||||
}
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/step/finalize.yml
|
||||
@@ -1,19 +0,0 @@
|
||||
parameters:
|
||||
nativePathRoot: ''
|
||||
|
||||
steps:
|
||||
- powershell: |
|
||||
$dirSeparatorChar = [system.io.path]::DirectorySeparatorChar
|
||||
$nativePath = "${{parameters.nativePathRoot }}${dirSeparatorChar}PowerShell"
|
||||
Write-Host "##vso[task.setvariable variable=PowerShellRoot]$nativePath"
|
||||
|
||||
if ((Test-Path "$nativePath")) {
|
||||
Remove-Item -Path "$nativePath" -Force -Recurse -Verbose -ErrorAction ignore
|
||||
}
|
||||
else {
|
||||
Write-Verbose -Verbose -Message "No cleanup required."
|
||||
}
|
||||
|
||||
git clone --quiet $env:REPOROOT $nativePath
|
||||
displayName: Clone PowerShell Repo to /PowerShell
|
||||
errorActionPreference: silentlycontinue
|
||||
@@ -1,124 +0,0 @@
|
||||
parameters:
|
||||
parentJobs: []
|
||||
|
||||
jobs:
|
||||
- job: compliance
|
||||
variables:
|
||||
- name: runCodesignValidationInjection
|
||||
value : false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
|
||||
displayName: Compliance
|
||||
dependsOn:
|
||||
${{ parameters.parentJobs }}
|
||||
pool:
|
||||
name: PowerShell1ES
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: 'Download artifacts'
|
||||
inputs:
|
||||
buildType: current
|
||||
downloadType: single
|
||||
artifactName: results
|
||||
downloadPath: '$(System.ArtifactsDirectory)'
|
||||
|
||||
- powershell: |
|
||||
dir "$(System.ArtifactsDirectory)\*" -Recurse
|
||||
displayName: 'Capture artifacts directory'
|
||||
continueOnError: true
|
||||
|
||||
- template: expand-compliance.yml
|
||||
parameters:
|
||||
architecture: fxdependent
|
||||
version: $(version)
|
||||
|
||||
- template: expand-compliance.yml
|
||||
parameters:
|
||||
architecture: x86
|
||||
version: $(version)
|
||||
|
||||
- template: expand-compliance.yml
|
||||
parameters:
|
||||
architecture: x64
|
||||
version: $(version)
|
||||
|
||||
- task: securedevelopmentteam.vss-secure-development-tools.build-task-antimalware.AntiMalware@3
|
||||
displayName: 'Run Defender Scan'
|
||||
|
||||
- task: securedevelopmentteam.vss-secure-development-tools.build-task-binskim.BinSkim@3
|
||||
displayName: 'Run BinSkim '
|
||||
inputs:
|
||||
InputType: Basic
|
||||
AnalyzeTarget: '$(CompliancePath)\*.dll;$(CompliancePath)\*.exe'
|
||||
AnalyzeSymPath: 'SRV*'
|
||||
AnalyzeVerbose: true
|
||||
AnalyzeHashes: true
|
||||
AnalyzeStatistics: true
|
||||
continueOnError: true
|
||||
|
||||
# add RoslynAnalyzers
|
||||
|
||||
- task: securedevelopmentteam.vss-secure-development-tools.build-task-autoapplicability.AutoApplicability@1
|
||||
displayName: 'Run AutoApplicability'
|
||||
inputs:
|
||||
ExternalRelease: true
|
||||
IsSoftware: true
|
||||
DataSensitivity: lbi
|
||||
continueOnError: true
|
||||
|
||||
# add codeMetrics
|
||||
|
||||
- task: securedevelopmentteam.vss-secure-development-tools.build-task-vulnerabilityassessment.VulnerabilityAssessment@0
|
||||
displayName: 'Run Vulnerability Assessment'
|
||||
continueOnError: true
|
||||
|
||||
# FXCop is not applicable
|
||||
|
||||
# PreFASt is not applicable
|
||||
|
||||
- task: securedevelopmentteam.vss-secure-development-tools.build-task-publishsecurityanalysislogs.PublishSecurityAnalysisLogs@2
|
||||
displayName: 'Publish Security Analysis Logs to Build Artifacts'
|
||||
continueOnError: true
|
||||
|
||||
- task: securedevelopmentteam.vss-secure-development-tools.build-task-uploadtotsa.TSAUpload@1
|
||||
displayName: 'TSA upload to Codebase: PowerShellCore_201906'
|
||||
inputs:
|
||||
tsaVersion: TsaV2
|
||||
codeBaseName: 'PowerShellCore_201906'
|
||||
uploadAPIScan: false
|
||||
uploadBinSkim: true
|
||||
uploadCredScan: false
|
||||
uploadFortifySCA: false
|
||||
uploadFxCop: false
|
||||
uploadModernCop: false
|
||||
uploadPoliCheck: false
|
||||
uploadPREfast: false
|
||||
uploadRoslyn: false
|
||||
uploadTSLint: false
|
||||
|
||||
- task: securedevelopmentteam.vss-secure-development-tools.build-task-report.SdtReport@1
|
||||
displayName: 'Create Security Analysis Report'
|
||||
inputs:
|
||||
TsvFile: false
|
||||
APIScan: false
|
||||
BinSkim: true
|
||||
CredScan: true
|
||||
PoliCheck: true
|
||||
PoliCheckBreakOn: Severity2Above
|
||||
|
||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||
displayName: 'Component Detection'
|
||||
inputs:
|
||||
sourceScanPath: '$(Build.SourcesDirectory)\tools'
|
||||
snapshotForceEnabled: true
|
||||
@@ -1,83 +0,0 @@
|
||||
parameters:
|
||||
- name: parentJobs
|
||||
type: jobList
|
||||
|
||||
jobs:
|
||||
- job: compliance
|
||||
variables:
|
||||
- name: runCodesignValidationInjection
|
||||
value : false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
|
||||
# Defines the variables APIScanClient, APIScanTenant and APIScanSecret
|
||||
- group: PS-PS-APIScan
|
||||
|
||||
displayName: Compliance
|
||||
dependsOn:
|
||||
${{ parameters.parentJobs }}
|
||||
pool:
|
||||
name: $(windowsPool)
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
|
||||
# APIScan can take a long time
|
||||
timeoutInMinutes: 180
|
||||
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- task: securedevelopmentteam.vss-secure-development-tools.build-task-credscan.CredScan@3
|
||||
displayName: 'Run CredScan'
|
||||
inputs:
|
||||
suppressionsFile: tools/credScan/suppress.json
|
||||
debugMode: false
|
||||
continueOnError: true
|
||||
|
||||
- task: securedevelopmentteam.vss-secure-development-tools.build-task-policheck.PoliCheck@2
|
||||
displayName: 'Run PoliCheck'
|
||||
inputs:
|
||||
# targetType F means file or folder and is the only applicable value and the default
|
||||
targetType: F
|
||||
# 1 to enable source code comment scanning, which is what we should do for open source
|
||||
optionsFC: 1
|
||||
# recurse
|
||||
optionsXS: 1
|
||||
# run for severity 1, 2, 3 and 4 issues
|
||||
optionsPE: '1|2|3|4'
|
||||
# disable history management
|
||||
optionsHMENABLE: 0
|
||||
# Excluclusion access database
|
||||
optionsRulesDBPath: '$(Build.SourcesDirectory)\tools\terms\PowerShell-Terms-Rules.mdb'
|
||||
# Terms Exclusion xml file
|
||||
optionsUEPath: $(Build.SourcesDirectory)\tools\terms\TermsExclusion.xml
|
||||
continueOnError: true
|
||||
|
||||
- task: securedevelopmentteam.vss-secure-development-tools.build-task-publishsecurityanalysislogs.PublishSecurityAnalysisLogs@3
|
||||
displayName: 'Publish Security Analysis Logs to Build Artifacts'
|
||||
continueOnError: true
|
||||
|
||||
- task: TSAUpload@2
|
||||
displayName: 'TSA upload'
|
||||
inputs:
|
||||
GdnPublishTsaOnboard: false
|
||||
GdnPublishTsaConfigFile: '$(Build.SourcesDirectory)\tools\guardian\tsaconfig-others.json'
|
||||
|
||||
- task: securedevelopmentteam.vss-secure-development-tools.build-task-report.SdtReport@1
|
||||
displayName: 'Create Security Analysis Report'
|
||||
inputs:
|
||||
TsvFile: false
|
||||
APIScan: false
|
||||
BinSkim: false
|
||||
CredScan: true
|
||||
PoliCheck: true
|
||||
PoliCheckBreakOn: Severity2Above
|
||||
|
||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||
displayName: 'Component Detection'
|
||||
inputs:
|
||||
sourceScanPath: '$(Build.SourcesDirectory)\tools'
|
||||
snapshotForceEnabled: true
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/step/finalize.yml
|
||||
@@ -1,90 +0,0 @@
|
||||
parameters:
|
||||
- name: parentJobs
|
||||
type: jobList
|
||||
|
||||
jobs:
|
||||
- job: generateNotice
|
||||
variables:
|
||||
- name: runCodesignValidationInjection
|
||||
value : false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
|
||||
displayName: Generate Notice
|
||||
dependsOn:
|
||||
${{ parameters.parentJobs }}
|
||||
pool:
|
||||
name: PowerShell1ES
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
|
||||
timeoutInMinutes: 15
|
||||
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- pwsh: |
|
||||
[string]$Branch=$env:BUILD_SOURCEBRANCH
|
||||
$branchOnly = $Branch -replace '^refs/heads/';
|
||||
$branchOnly = $branchOnly -replace '[_\-]'
|
||||
|
||||
if ($branchOnly -eq 'master') {
|
||||
$container = 'tpn'
|
||||
} else {
|
||||
$branchOnly = $branchOnly -replace '[\./]', '-'
|
||||
$container = "tpn-$branchOnly"
|
||||
}
|
||||
|
||||
$vstsCommandString = "vso[task.setvariable variable=tpnContainer]$container"
|
||||
Write-Verbose -Message $vstsCommandString -Verbose
|
||||
Write-Host -Object "##$vstsCommandString"
|
||||
displayName: Set ContainerName
|
||||
|
||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||
displayName: 'Component Detection'
|
||||
inputs:
|
||||
sourceScanPath: '$(Build.SourcesDirectory)\tools'
|
||||
|
||||
- pwsh: |
|
||||
./tools/clearlyDefined/ClearlyDefined.ps1 -TestAndHarvest
|
||||
displayName: Verify that packages have license data
|
||||
|
||||
- task: msospo.ospo-extension.8d7f9abb-6896-461d-9e25-4f74ed65ddb2.notice@0
|
||||
displayName: 'NOTICE File Generator'
|
||||
inputs:
|
||||
outputfile: '$(System.ArtifactsDirectory)\ThirdPartyNotices.txt'
|
||||
# output format can be html or text
|
||||
outputformat: text
|
||||
# this isn't working
|
||||
# additionaldata: $(Build.SourcesDirectory)\assets\additionalAttributions.txt
|
||||
|
||||
|
||||
- pwsh: |
|
||||
Get-Content -Raw -Path $(Build.SourcesDirectory)\assets\additionalAttributions.txt | Out-File '$(System.ArtifactsDirectory)\ThirdPartyNotices.txt' -Encoding utf8NoBOM -Force -Append
|
||||
Get-Content -Raw -Path '$(Build.SourcesDirectory)\assets\additionalAttributions.txt'
|
||||
displayName: Append Additional Attributions
|
||||
continueOnError: true
|
||||
|
||||
- pwsh: |
|
||||
Get-Content -Raw -Path '$(System.ArtifactsDirectory)\ThirdPartyNotices.txt'
|
||||
displayName: Capture Notice
|
||||
continueOnError: true
|
||||
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'upload Notice'
|
||||
inputs:
|
||||
SourcePath: $(System.ArtifactsDirectory)\ThirdPartyNotices.txt
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: $(tpnContainer)
|
||||
resourceGroup: '$(StorageResourceGroup)'
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
targetPath: $(System.ArtifactsDirectory)
|
||||
artifactName: notice
|
||||
displayName: Publish notice artifacts
|
||||
retryCountOnTaskFailure: 2
|
||||
@@ -1,12 +0,0 @@
|
||||
parameters:
|
||||
architecture: x86
|
||||
version: 6.2.0
|
||||
|
||||
steps:
|
||||
- powershell: |
|
||||
Expand-Archive -Path "$(System.ArtifactsDirectory)\results\PowerShell-${{ parameters.version }}-symbols-win-${{ parameters.architecture }}.zip" -Destination "$(Build.StagingDirectory)\symbols\${{ parameters.architecture }}"
|
||||
displayName: Expand symbols zip - ${{ parameters.architecture }}
|
||||
|
||||
- powershell: |
|
||||
tools/releaseBuild/createComplianceFolder.ps1 -ArtifactFolder "$(Build.StagingDirectory)\symbols\${{ parameters.architecture }}" -VSTSVariableName 'CompliancePath'
|
||||
displayName: Expand Compliance file - ${{ parameters.architecture }}
|
||||
@@ -1,64 +0,0 @@
|
||||
parameters:
|
||||
- name: PackageVersion
|
||||
- name: LinuxBinPath
|
||||
- name: WindowsBinPath
|
||||
- name: WindowsDesktopBinPath
|
||||
- name: AlpineBinPath
|
||||
- name: DestinationPath
|
||||
- name: ListOfPackageTypes
|
||||
type: object
|
||||
default:
|
||||
- Unified
|
||||
- PowerShell.Linux.Alpine
|
||||
- PowerShell.Linux.x64
|
||||
- PowerShell.Linux.arm32
|
||||
- PowerShell.Linux.arm64
|
||||
- PowerShell.Windows.x64
|
||||
|
||||
steps:
|
||||
|
||||
- pwsh: |
|
||||
Write-Verbose -Verbose 'LinuxBinPath path: ${{ parameters.LinuxBinPath }}'
|
||||
Write-Verbose -Verbose 'WindowsBinPath path: ${{ parameters.WindowsBinPath }}'
|
||||
Write-Verbose -Verbose 'WindowsDesktopBinPath path: ${{ parameters.WindowsDesktopBinPath }}'
|
||||
Write-Verbose -Verbose 'AlpineBinPath path: ${{ parameters.AlpineBinPath }}'
|
||||
|
||||
Import-Module -Name $env:REPOROOT\build.psm1
|
||||
Import-Module -Name $env:REPOROOT\tools\packaging
|
||||
Start-PrepForGlobalToolNupkg -LinuxBinPath '${{ parameters.LinuxBinPath }}' -WindowsBinPath '${{ parameters.WindowsBinPath }}' -WindowsDesktopBinPath '${{ parameters.WindowsDesktopBinPath }}' -AlpineBinPath '${{ parameters.AlpineBinPath }}'
|
||||
displayName: 'Preparation for Global Tools package creation.'
|
||||
|
||||
# NOTE: The Unified package must always be created first, and so must always be first in ListOfPackageTypes.
|
||||
- ${{ each value in parameters.ListOfPackageTypes }}:
|
||||
- pwsh: |
|
||||
$PackageType = '${{ value }}'
|
||||
|
||||
Write-Verbose -Verbose "PackageType: $PackageType"
|
||||
Write-Verbose -Verbose 'Destination path: ${{ parameters.PackagePath }}'
|
||||
|
||||
# Create global tool NuSpec source for package.
|
||||
Import-Module -Name $env:REPOROOT\build.psm1
|
||||
Import-Module -Name $env:REPOROOT\tools\packaging
|
||||
New-GlobalToolNupkgSource -PackageType $PackageType -PackageVersion '${{ parameters.PackageVersion }}' -LinuxBinPath '${{ parameters.LinuxBinPath }}' -WindowsBinPath '${{ parameters.WindowsBinPath }}' -WindowsDesktopBinPath '${{ parameters.WindowsDesktopBinPath }}' -AlpineBinPath '${{ parameters.AlpineBinPath }}'
|
||||
displayName: 'Create global tool NuSpec source for package.'
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem -Path env: | Out-String -width 9999 -Stream | write-Verbose -Verbose
|
||||
displayName: 'Capture environment variables after Global Tool package source is created.'
|
||||
|
||||
# NOTE: The above 'New-GlobalToolNupkgSource' task function sets the 'GlobalToolNuSpecSourcePath', 'GlobalToolPkgName',
|
||||
# and 'GlobalToolCGManifestPath' environment variables.
|
||||
- template: Sbom.yml@ComplianceRepo
|
||||
parameters:
|
||||
BuildDropPath: $(GlobalToolNuSpecSourcePath)
|
||||
Build_Repository_Uri: 'https://github.com/powershell/powershell'
|
||||
PackageName: $(GlobalToolPkgName)
|
||||
PackageVersion: ${{ parameters.PackageVersion }}
|
||||
sourceScanPath: $(GlobalToolCGManifestPath)
|
||||
displayName: SBOM for Global Tool package
|
||||
|
||||
- pwsh: |
|
||||
Import-Module -Name $env:REPOROOT\build.psm1
|
||||
Import-Module -Name $env:REPOROOT\tools\packaging
|
||||
New-GlobalToolNupkgFromSource -PackageNuSpecPath "$env:GlobalToolNuSpecSourcePath" -PackageName "$env:GlobalToolPkgName" -DestinationPath '${{ parameters.DestinationPath }}' -CGManifestPath "$env:GlobalToolCGManifestPath"
|
||||
displayName: 'Create global tool NuSpec package from NuSpec source.'
|
||||
@@ -1,8 +0,0 @@
|
||||
parameters:
|
||||
- name: "repoRoot"
|
||||
default: $(REPOROOT)
|
||||
steps:
|
||||
- template: /.pipelines/templates/insert-nuget-config-azfeed.yml@self
|
||||
parameters:
|
||||
repoRoot: $(REPOROOT)
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
parameters:
|
||||
parentJobs: []
|
||||
|
||||
jobs:
|
||||
- job: json
|
||||
variables:
|
||||
- name: runCodesignValidationInjection
|
||||
value : false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
displayName: Create Json for Blob
|
||||
dependsOn:
|
||||
${{ parameters.parentJobs }}
|
||||
condition: succeeded()
|
||||
pool:
|
||||
name: $(windowsPool)
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
|
||||
steps:
|
||||
#- task: <task type name>@<version>
|
||||
# inputs:
|
||||
# <task specific inputs>
|
||||
# displayName: '<display name of task>'
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
CreateJson: yes
|
||||
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'upload daily-build-info JSON file to Azure - ${{ parameters.architecture }}'
|
||||
inputs:
|
||||
SourcePath: '$(BuildInfoPath)'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: 'BuildInfo'
|
||||
condition: and(succeeded(), eq(variables['IS_DAILY'], 'true'))
|
||||
|
||||
- task: AzureCLI@1
|
||||
displayName: 'Make blob public'
|
||||
inputs:
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
scriptLocation: inlineScript
|
||||
inlineScript: 'az storage container set-permission --account-name $(StorageAccount) --name $(azureVersion) --public-access blob'
|
||||
condition: and(succeeded(), eq(variables['IS_DAILY'], 'true'))
|
||||
|
||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||
displayName: 'Component Detection'
|
||||
inputs:
|
||||
sourceScanPath: '$(Build.SourcesDirectory)\tools'
|
||||
snapshotForceEnabled: true
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/step/finalize.yml
|
||||
@@ -1,184 +0,0 @@
|
||||
jobs:
|
||||
- job: sign_linux_builds
|
||||
displayName: Sign all linux builds
|
||||
condition: succeeded()
|
||||
pool:
|
||||
name: PowerShell1ES
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
dependsOn: ['build_fxdependent', 'build_rpm']
|
||||
variables:
|
||||
- name: runCodesignValidationInjection
|
||||
value: false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
- group: ESRP
|
||||
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshLinuxBuild.tar.gz
|
||||
path: $(Build.ArtifactStagingDirectory)/linuxTars
|
||||
displayName: Download deb build
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshLinuxBuildMinSize.tar.gz
|
||||
path: $(Build.ArtifactStagingDirectory)/linuxTars
|
||||
displayName: Download min-size build
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshLinuxBuildArm32.tar.gz
|
||||
path: $(Build.ArtifactStagingDirectory)/linuxTars
|
||||
displayName: Download arm32 build
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshLinuxBuildArm64.tar.gz
|
||||
path: $(Build.ArtifactStagingDirectory)/linuxTars
|
||||
displayName: Download arm64 build
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshMarinerBuildAmd64.tar.gz
|
||||
path: $(Build.ArtifactStagingDirectory)/linuxTars
|
||||
displayName: Download mariner build
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshMarinerBuildArm64.tar.gz
|
||||
path: $(Build.ArtifactStagingDirectory)/linuxTars
|
||||
displayName: Download mariner arm64 build
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshLinuxBuildAlpine.tar.gz
|
||||
path: $(Build.ArtifactStagingDirectory)/linuxTars/pwshLinuxBuildAlpine.tar.gz
|
||||
displayName: Download alpine build
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshLinuxBuildAlpine.tar.gz
|
||||
path: $(Build.ArtifactStagingDirectory)/linuxTars/pwshAlpineFxdBuildAmd64.tar.gz
|
||||
displayName: Download alpine fxdependent build
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshLinuxBuildFxdependent.tar.gz
|
||||
path: $(Build.ArtifactStagingDirectory)/linuxTars/pwshLinuxBuildFxdependent.tar.gz
|
||||
displayName: Download fxdependent build
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem -Path $(Build.ArtifactStagingDirectory)/linuxTars
|
||||
displayName: Capture downloaded tars
|
||||
|
||||
- pwsh: |
|
||||
Write-Verbose -Verbose -Message "Expanding $(Build.ArtifactStagingDirectory)/linuxTars/pwshLinuxBuild.tar.gz to $(Build.ArtifactStagingDirectory)/pwshLinuxBuild"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshLinuxBuild -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/linuxTars/pwshLinuxBuild.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshLinuxBuild
|
||||
Write-Verbose -Verbose "File permisions after expanding"
|
||||
Get-ChildItem -Path $(Build.ArtifactStagingDirectory)/pwshLinuxBuild/pwsh | Select-Object -Property 'unixmode', 'size', 'name'
|
||||
|
||||
Write-Verbose -Verbose -Message "Expanding $(Build.ArtifactStagingDirectory)/linuxTars/pwshLinuxBuildMinSize.tar.gz to $(Build.ArtifactStagingDirectory)/pwshLinuxBuildMinSize"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshLinuxBuildMinSize -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/linuxTars/pwshLinuxBuildMinSize.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshLinuxBuildMinSize
|
||||
|
||||
Write-Verbose -Verbose -Message "Expanding $(Build.ArtifactStagingDirectory)/linuxTars/pwshLinuxBuildArm32.tar.gz to $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm32"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm32 -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/linuxTars/pwshLinuxBuildArm32.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm32
|
||||
|
||||
Write-Verbose -Verbose -Message "Expanding $(Build.ArtifactStagingDirectory)/linuxTars/pwshLinuxBuildArm64.tar.gz to $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm64"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm64 -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/linuxTars/pwshLinuxBuildArm64.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm64
|
||||
|
||||
Write-Verbose -Verbose -Message "Expanding $(Build.ArtifactStagingDirectory)/linuxTars/pwshMarinerBuildAmd64.tar.gz to $(Build.ArtifactStagingDirectory)/pwshMarinerBuildAmd64"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshMarinerBuildAmd64 -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/linuxTars/pwshMarinerBuildAmd64.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshMarinerBuildAmd64
|
||||
|
||||
Write-Verbose -Verbose -Message "Expanding $(Build.ArtifactStagingDirectory)/linuxTars/pwshMarinerBuildArm64.tar.gz to $(Build.ArtifactStagingDirectory)/pwshMarinerBuildArm64"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshMarinerBuildArm64 -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/linuxTars/pwshMarinerBuildArm64.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshMarinerBuildArm64
|
||||
|
||||
Write-Verbose -Verbose -Message "Expanding $(Build.ArtifactStagingDirectory)/linuxTars/pwshLinuxBuildAlpine.tar.gz/pwshLinuxBuild.tar.gz to $(Build.ArtifactStagingDirectory)/pwshLinuxBuildAlpine"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshLinuxBuildAlpine -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/linuxTars/pwshLinuxBuildAlpine.tar.gz/pwshLinuxBuild.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshLinuxBuildAlpine
|
||||
|
||||
Write-Verbose -Verbose -Message "Expanding $(Build.ArtifactStagingDirectory)/linuxTars/pwshAlpineFxdBuildAmd64.tar.gz/pwshAlpineFxdBuildAmd64.tar.gz to $(Build.ArtifactStagingDirectory)/pwshLinuxBuildAlpineFxd"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshLinuxBuildAlpineFxd -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/linuxTars/pwshAlpineFxdBuildAmd64.tar.gz/pwshAlpineFxdBuildAmd64.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshLinuxBuildAlpineFxd
|
||||
|
||||
Write-Verbose -Verbose -Message "Expanding $(Build.ArtifactStagingDirectory)/linuxTars/pwshLinuxBuildFxdependent.tar.gz/pwshLinuxBuild.tar.gz to $(Build.ArtifactStagingDirectory)/pwshLinuxBuildFxdependent"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshLinuxBuildFxdependent -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/linuxTars/pwshLinuxBuildFxdependent.tar.gz/pwshLinuxBuild.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshLinuxBuildFxdependent
|
||||
displayName: Expand builds
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- template: cloneToOfficialPath.yml
|
||||
|
||||
- template: insert-nuget-config-azfeed.yml
|
||||
parameters:
|
||||
repoRoot: $(PowerShellRoot)
|
||||
|
||||
- pwsh: |
|
||||
Set-Location $env:POWERSHELLROOT
|
||||
import-module "$env:POWERSHELLROOT/build.psm1"
|
||||
Sync-PSTags -AddRemoteIfMissing
|
||||
displayName: SyncTags
|
||||
condition: and(succeeded(), ne(variables['SkipBuild'], 'true'))
|
||||
|
||||
- checkout: ComplianceRepo
|
||||
clean: true
|
||||
|
||||
- template: shouldSign.yml
|
||||
|
||||
- template: signBuildFiles.yml
|
||||
parameters:
|
||||
binLocation: pwshLinuxBuild
|
||||
buildPrefixName: 'PowerShell Linux'
|
||||
|
||||
- template: signBuildFiles.yml
|
||||
parameters:
|
||||
binLocation: pwshLinuxBuildMinSize
|
||||
buildPrefixName: 'PowerShell Linux Minimum Size'
|
||||
|
||||
- template: signBuildFiles.yml
|
||||
parameters:
|
||||
binLocation: pwshLinuxBuildArm32
|
||||
buildPrefixName: 'PowerShell Linux Arm32'
|
||||
|
||||
- template: signBuildFiles.yml
|
||||
parameters:
|
||||
binLocation: pwshLinuxBuildArm64
|
||||
buildPrefixName: 'PowerShell Linux Arm64'
|
||||
|
||||
- template: signBuildFiles.yml
|
||||
parameters:
|
||||
binLocation: pwshMarinerBuildAmd64
|
||||
buildPrefixName: 'PowerShell Linux x64 (Mariner) Framework Dependent'
|
||||
|
||||
- template: signBuildFiles.yml
|
||||
parameters:
|
||||
binLocation: pwshMarinerBuildArm64
|
||||
buildPrefixName: 'PowerShell Linux arm64 (Mariner) Framework Dependent'
|
||||
|
||||
- template: signBuildFiles.yml
|
||||
parameters:
|
||||
binLocation: pwshLinuxBuildAlpine
|
||||
buildPrefixName: 'PowerShell Linux Alpine x64'
|
||||
|
||||
- template: signBuildFiles.yml
|
||||
parameters:
|
||||
binLocation: pwshLinuxBuildAlpineFxd
|
||||
buildPrefixName: 'PowerShell Linux Alpine Fxd x64'
|
||||
|
||||
- template: signBuildFiles.yml
|
||||
parameters:
|
||||
binLocation: pwshLinuxBuildFxdependent
|
||||
buildPrefixName: 'PowerShell Linux Framework Dependent'
|
||||
@@ -1,489 +0,0 @@
|
||||
parameters:
|
||||
buildName: ''
|
||||
uploadDisplayName: 'Upload'
|
||||
|
||||
jobs:
|
||||
- job: pkg_${{ parameters.buildName }}
|
||||
displayName: Package ${{ parameters.buildName }}
|
||||
condition: succeeded()
|
||||
pool:
|
||||
name: PowerShell1ES
|
||||
demands:
|
||||
- ImageOverride -equals PSMMSUbuntu20.04-Secure
|
||||
variables:
|
||||
- name: runCodesignValidationInjection
|
||||
value: false
|
||||
- name: build
|
||||
value: ${{ parameters.buildName }}
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
- group: ESRP
|
||||
- group: DotNetPrivateBuildAccess
|
||||
|
||||
steps:
|
||||
- ${{ if or(eq(variables.build,'deb'), eq(variables.build,'rpm')) }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: authenticode-signed
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshLinuxBuild-signed
|
||||
pattern: '**/pwshLinuxBuild.tar.gz'
|
||||
displayName: Download deb build
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: authenticode-signed
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshLinuxBuildMinSize-signed
|
||||
pattern: '**/pwshLinuxBuildMinSize.tar.gz'
|
||||
displayName: Download min-size build
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: authenticode-signed
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm32-signed
|
||||
pattern: '**/pwshLinuxBuildArm32.tar.gz'
|
||||
displayName: Download arm32 build
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: authenticode-signed
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm64-signed
|
||||
pattern: '**/pwshLinuxBuildArm64.tar.gz'
|
||||
displayName: Download arm64 build
|
||||
|
||||
- ${{ if eq(variables.build,'rpm') }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: authenticode-signed
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshMarinerBuildAmd64-signed
|
||||
pattern: '**/pwshMarinerBuildAmd64.tar.gz'
|
||||
displayName: Download mariner amd64 build
|
||||
|
||||
- ${{ if eq(variables.build,'rpm') }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: authenticode-signed
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshMarinerBuildArm64-signed
|
||||
pattern: '**/pwshMarinerBuildArm64.tar.gz'
|
||||
displayName: Download mariner arm64 build
|
||||
|
||||
- ${{ if eq(variables.build,'alpine') }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: authenticode-signed
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshLinuxBuildAlpine-signed
|
||||
pattern: '**/pwshLinuxBuildAlpine.tar.gz'
|
||||
displayName: Download alpine build
|
||||
|
||||
- ${{ if eq(variables.build,'alpine') }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: authenticode-signed
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshAlpineFxdBuildAmd64-signed
|
||||
pattern: '**/pwshAlpineFxdBuildAmd64.tar.gz'
|
||||
displayName: Download alpine framework dependent build
|
||||
|
||||
- ${{ if eq(variables.build,'fxdependent') }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: authenticode-signed
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshLinuxBuildFxdependent-signed
|
||||
pattern: '**/pwshLinuxBuildFxdependent.tar.gz'
|
||||
displayName: Download fxdependent build
|
||||
|
||||
- ${{ if or(eq(variables.build,'deb'), eq(variables.build,'rpm')) }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshLinuxBuild-meta
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshLinuxBuild-meta
|
||||
displayName: Download deb build meta
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshLinuxBuildMinSize-meta
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshLinuxBuildMinSize-meta
|
||||
displayName: Download min-size build meta
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshLinuxBuildArm32-meta
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm32-meta
|
||||
displayName: Download arm32 build meta
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshLinuxBuildArm64-meta
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm64-meta
|
||||
displayName: Download arm64 build meta
|
||||
|
||||
- ${{ if eq(variables.build,'rpm') }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshMarinerBuildAmd64-meta
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshMarinerBuildAmd64-meta
|
||||
displayName: Download mariner x64 build meta
|
||||
|
||||
- ${{ if eq(variables.build,'rpm') }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshMarinerBuildArm64-meta
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshMarinerBuildArm64-meta
|
||||
displayName: Download mariner arm64 build meta
|
||||
|
||||
- ${{ if eq(variables.build,'alpine') }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshLinuxBuildAlpine-meta
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshLinuxBuild-meta
|
||||
displayName: Download alpine build meta
|
||||
|
||||
- ${{ if eq(variables.build,'alpine') }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshAlpineFxdBuildAmd64-meta
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshAlpineFxdBuildAmd64-meta
|
||||
displayName: Download alpine build meta
|
||||
|
||||
- ${{ if eq(variables.build,'fxdependent') }} :
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifact: pwshLinuxBuildFxdependent-meta
|
||||
path: $(Build.ArtifactStagingDirectory)/pwshLinuxBuild-meta
|
||||
displayName: Download fxdependent build meta
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem '$(Build.ArtifactStagingDirectory)' | Select-Object -Property 'unixmode', 'size', 'name'
|
||||
displayName: Capture downloads
|
||||
|
||||
- pwsh: |
|
||||
if ('$(build)' -eq 'deb' -or '$(build)' -eq 'rpm') {
|
||||
Write-Verbose -Verbose "Expanding $(Build.ArtifactStagingDirectory)/pwshLinuxBuild-signed/pwshLinuxBuild.tar.gz to $(Build.ArtifactStagingDirectory)/pwshLinuxBuild"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshLinuxBuild -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/pwshLinuxBuild-signed/pwshLinuxBuild.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshLinuxBuild
|
||||
}
|
||||
|
||||
if ('$(build)' -eq 'deb') {
|
||||
Write-Verbose -Verbose "Expanding $(Build.ArtifactStagingDirectory)/pwshLinuxBuildMinSize-signed/pwshLinuxBuildMinSize.tar.gz to $(Build.ArtifactStagingDirectory)/pwshLinuxBuildMinSize"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshLinuxBuildMinSize -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/pwshLinuxBuildMinSize-signed/pwshLinuxBuildMinSize.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshLinuxBuildMinSize
|
||||
|
||||
Write-Verbose -Verbose "Expanding $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm32-signed/pwshLinuxBuildArm32.tar.gz to $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm32"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm32 -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm32-signed/pwshLinuxBuildArm32.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm32
|
||||
|
||||
Write-Verbose -Verbose "Expanding $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm64-signed/pwshLinuxBuildArm64.tar.gz to $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm64"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm64 -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm64-signed/pwshLinuxBuildArm64.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshLinuxBuildArm64
|
||||
}
|
||||
|
||||
if ('$(build)' -eq 'rpm') {
|
||||
# for mariner x64
|
||||
Write-Verbose -Verbose "Expanding $(Build.ArtifactStagingDirectory)/pwshMarinerBuildAmd64-signed/pwshMarinerBuildAmd64.tar.gz to $(Build.ArtifactStagingDirectory)/pwshMarinerBuildAmd64"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshMarinerBuildAmd64 -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/pwshMarinerBuildAmd64-signed/pwshMarinerBuildAmd64.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshMarinerBuildAmd64
|
||||
|
||||
# for mariner arm64
|
||||
Write-Verbose -Verbose "Expanding $(Build.ArtifactStagingDirectory)/pwshMarinerBuildArm64-signed/pwshMarinerBuildArm64.tar.gz to $(Build.ArtifactStagingDirectory)/pwshMarinerBuildArm64"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshMarinerBuildArm64 -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/pwshMarinerBuildArm64-signed/pwshMarinerBuildArm64.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshMarinerBuildArm64
|
||||
}
|
||||
|
||||
if ('$(build)' -eq 'alpine') {
|
||||
Write-Verbose -Verbose "Expanding $(Build.ArtifactStagingDirectory)/pwshLinuxBuildAlpine-signed/pwshLinuxBuildAlpine.tar.gz to $(Build.ArtifactStagingDirectory)/pwshLinuxBuild"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshLinuxBuild -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/pwshLinuxBuildAlpine-signed/pwshLinuxBuildAlpine.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshLinuxBuild
|
||||
|
||||
Write-Verbose -Verbose "Expanding $(Build.ArtifactStagingDirectory)/pwshAlpineFxdBuildAmd64-signed/pwshAlpineFxdBuildAmd64.tar.gz to $(Build.ArtifactStagingDirectory)/pwshAlpineFxdBuildAmd64"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshAlpineFxdBuildAmd64 -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/pwshAlpineFxdBuildAmd64-signed/pwshAlpineFxdBuildAmd64.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshAlpineFxdBuildAmd64
|
||||
}
|
||||
|
||||
if ('$(build)' -eq 'fxdependent') {
|
||||
Write-Verbose -Verbose "Expanding $(Build.ArtifactStagingDirectory)/pwshLinuxBuildFxdependent-signed/pwshLinuxBuildFxdependent.tar.gz to $(Build.ArtifactStagingDirectory)/pwshLinuxBuild"
|
||||
New-Item -Path $(Build.ArtifactStagingDirectory)/pwshLinuxBuild -ItemType Directory
|
||||
tar -xf $(Build.ArtifactStagingDirectory)/pwshLinuxBuildFxdependent-signed/pwshLinuxBuildFxdependent.tar.gz -C $(Build.ArtifactStagingDirectory)/pwshLinuxBuild
|
||||
}
|
||||
displayName: Expand all signed tar.gz
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem '$(Build.ArtifactStagingDirectory)' | Select-Object -Property 'unixmode', 'size', 'name'
|
||||
displayName: Capture expanded
|
||||
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- checkout: ComplianceRepo
|
||||
clean: true
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- pwsh: |
|
||||
# create folder
|
||||
sudo mkdir /PowerShell
|
||||
|
||||
# make the current user the owner
|
||||
sudo chown $env:USER /PowerShell
|
||||
displayName: 'Create /PowerShell'
|
||||
|
||||
- template: cloneToOfficialPath.yml
|
||||
|
||||
- template: insert-nuget-config-azfeed.yml
|
||||
parameters:
|
||||
repoRoot: $(PowerShellRoot)
|
||||
|
||||
- powershell: |
|
||||
import-module "$env:POWERSHELLROOT/build.psm1"
|
||||
Sync-PSTags -AddRemoteIfMissing
|
||||
displayName: SyncTags
|
||||
condition: and(succeeded(), ne(variables['SkipBuild'], 'true'))
|
||||
workingDirectory: $(PowerShellRoot)
|
||||
|
||||
- powershell: |
|
||||
Import-Module "$env:POWERSHELLROOT/build.psm1"
|
||||
|
||||
Start-PSBootstrap -Scenario Package
|
||||
displayName: 'Bootstrap'
|
||||
condition: and(succeeded(), ne(variables['SkipBuild'], 'true'))
|
||||
workingDirectory: $(PowerShellRoot)
|
||||
env:
|
||||
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
|
||||
|
||||
- powershell: |
|
||||
try {
|
||||
Import-Module "$env:POWERSHELLROOT/build.psm1"
|
||||
Import-Module "$env:POWERSHELLROOT/tools/packaging"
|
||||
|
||||
$metadata = Get-Content "$env:POWERSHELLROOT/tools/metadata.json" -Raw | ConvertFrom-Json
|
||||
|
||||
# LTSRelease.Package indicates that the release should be packaged as an LTS
|
||||
$LTS = $metadata.LTSRelease.Package
|
||||
Write-Verbose -Verbose -Message "LTS is set to: $LTS"
|
||||
|
||||
Invoke-AzDevOpsLinuxPackageCreation -ReleaseTag '$(ReleaseTagVar)' -BuildType '$(build)'
|
||||
|
||||
if ($LTS) {
|
||||
Write-Verbose -Verbose "Packaging LTS"
|
||||
Invoke-AzDevOpsLinuxPackageCreation -LTS -ReleaseTag '$(ReleaseTagVar)' -BuildType '$(build)'
|
||||
}
|
||||
} catch {
|
||||
Get-Error
|
||||
throw
|
||||
}
|
||||
displayName: 'Package'
|
||||
condition: and(succeeded(), ne(variables['SkipBuild'], 'true'))
|
||||
workingDirectory: $(PowerShellRoot)
|
||||
|
||||
- powershell: |
|
||||
$linuxPackages = Get-ChildItem "$env:POWERSHELLROOT/powershell*" -Include *.deb,*.rpm,*.tar.gz
|
||||
|
||||
$bucket = 'release'
|
||||
foreach ($linuxPackage in $linuxPackages)
|
||||
{
|
||||
$filePath = $linuxPackage.FullName
|
||||
Write-Verbose "Publishing $filePath to $bucket" -Verbose
|
||||
Write-Host "##vso[artifact.upload containerfolder=$bucket;artifactname=$bucket]$filePath"
|
||||
}
|
||||
displayName: Publish artifacts
|
||||
condition: and(succeeded(), ne(variables['SkipBuild'], 'true'))
|
||||
workingDirectory: $(PowerShellRoot)
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/step/finalize.yml
|
||||
|
||||
- job: upload_${{ parameters.buildName }}
|
||||
displayName: ${{ parameters.uploadDisplayName }} ${{ parameters.buildName }}
|
||||
dependsOn: pkg_${{ parameters.buildName }}
|
||||
condition: succeeded()
|
||||
pool:
|
||||
name: PowerShell1ES
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
variables:
|
||||
- name: buildName
|
||||
value: ${{ parameters.buildName }}
|
||||
- group: ESRP
|
||||
- name: runCodesignValidationInjection
|
||||
value: false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
- name: skipComponentGovernanceDetection
|
||||
value: true
|
||||
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- checkout: ComplianceRepo
|
||||
clean: true
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
- template: shouldSign.yml
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: 'Download Deb Artifacts'
|
||||
inputs:
|
||||
downloadType: specific
|
||||
itemPattern: '**/*.deb'
|
||||
downloadPath: '$(System.ArtifactsDirectory)\finished'
|
||||
condition: and(eq(variables['buildName'], 'DEB'), succeeded())
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: 'Download tar.gz Artifacts copy'
|
||||
inputs:
|
||||
downloadType: specific
|
||||
itemPattern: '**/*.tar.gz'
|
||||
downloadPath: '$(System.ArtifactsDirectory)\finished'
|
||||
|
||||
- powershell: |
|
||||
Write-Host 'We handle the min-size package only when uploading for deb build.'
|
||||
Write-Host '- For deb build, the min-size package is moved to a separate folder "finished\minSize",'
|
||||
Write-Host ' so that the min-size package can be uploaded to a different Az Blob container.'
|
||||
Write-Host '- For other builds, the min-size package is removed after being downloaded, so that it'
|
||||
Write-Host ' does not get accidentally uploaded to the wrong Az Blob container.'
|
||||
|
||||
$minSizePkg = '$(System.ArtifactsDirectory)\finished\release\*-gc.tar.gz'
|
||||
if (Test-Path -Path $minSizePkg)
|
||||
{
|
||||
if ('$(buildName)' -eq 'DEB')
|
||||
{
|
||||
$minSizeDir = '$(System.ArtifactsDirectory)\finished\minSize'
|
||||
New-Item -Path $minSizeDir -Type Directory -Force > $null
|
||||
Move-Item -Path $minSizePkg -Destination $minSizeDir
|
||||
|
||||
Write-Host "`nCapture the min-size package moved to the target folder."
|
||||
Get-ChildItem -Path $minSizeDir
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Host '$(buildName): Remove the min-size package.'
|
||||
Remove-Item -Path $minSizePkg -Force
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Host 'min-size package not found, so skip this step.'
|
||||
}
|
||||
displayName: 'Move minSize package to separate folder'
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: 'Download rpm Artifacts copy'
|
||||
inputs:
|
||||
downloadType: specific
|
||||
itemPattern: '**/*.rpm'
|
||||
downloadPath: '$(System.ArtifactsDirectory)\rpm'
|
||||
condition: and(eq(variables['buildName'], 'RPM'), succeeded())
|
||||
|
||||
- template: EsrpScan.yml@ComplianceRepo
|
||||
parameters:
|
||||
scanPath: $(System.ArtifactsDirectory)
|
||||
pattern: |
|
||||
**\*.rpm
|
||||
**\*.deb
|
||||
**\*.tar.gz
|
||||
|
||||
- ${{ if eq(variables['buildName'], 'RPM') }}:
|
||||
- template: EsrpSign.yml@ComplianceRepo
|
||||
parameters:
|
||||
buildOutputPath: $(System.ArtifactsDirectory)\rpm
|
||||
signOutputPath: $(Build.StagingDirectory)\signedPackages
|
||||
certificateId: "CP-450779-Pgp"
|
||||
pattern: |
|
||||
**\*.rh.*.rpm
|
||||
useMinimatch: true
|
||||
shouldSign: $(SHOULD_SIGN)
|
||||
displayName: Sign RedHat RPM
|
||||
OutputMode: AlwaysCopy
|
||||
|
||||
- ${{ if eq(variables['buildName'], 'RPM') }}:
|
||||
- template: EsrpSign.yml@ComplianceRepo
|
||||
parameters:
|
||||
# Sign in-place, previous task copied the files to this folder
|
||||
buildOutputPath: $(Build.StagingDirectory)\signedPackages
|
||||
signOutputPath: $(Build.StagingDirectory)\signedPackages
|
||||
certificateId: "CP-459159-Pgp"
|
||||
pattern: |
|
||||
**\*.cm.*.rpm
|
||||
**\*.cm?.*.rpm
|
||||
useMinimatch: true
|
||||
shouldSign: $(SHOULD_SIGN)
|
||||
displayName: Sign Mariner RPM
|
||||
OutputMode: NeverCopy
|
||||
|
||||
# requires windows
|
||||
- ${{ if ne(variables['buildName'], 'RPM') }}:
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'Upload to Azure - DEB and tar.gz'
|
||||
inputs:
|
||||
SourcePath: '$(System.ArtifactsDirectory)\finished\release\*'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: '$(AzureVersion)'
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- template: upload-final-results.yml
|
||||
parameters:
|
||||
artifactPath: $(System.ArtifactsDirectory)\finished\release
|
||||
|
||||
# requires windows
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'Upload to Azure - min-size package for Guest Config'
|
||||
inputs:
|
||||
SourcePath: '$(System.ArtifactsDirectory)\finished\minSize\*'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: '$(AzureVersion)-gc'
|
||||
condition: and(eq(variables['buildName'], 'DEB'), succeeded())
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- template: upload-final-results.yml
|
||||
parameters:
|
||||
artifactPath: $(System.ArtifactsDirectory)\finished\minSize
|
||||
condition: and(eq(variables['buildName'], 'DEB'), succeeded())
|
||||
|
||||
# requires windows
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'Upload to Azure - RPM - Unsigned'
|
||||
inputs:
|
||||
SourcePath: '$(System.ArtifactsDirectory)\rpm\release\*'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: '$(AzureVersion)'
|
||||
condition: and(and(succeeded(), ne(variables['SHOULD_SIGN'], 'true')),eq(variables['buildName'], 'RPM'))
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
# requires windows
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'Upload to Azure - RPM - Signed'
|
||||
inputs:
|
||||
SourcePath: '$(Build.StagingDirectory)\signedPackages\release\*'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: '$(AzureVersion)'
|
||||
condition: and(and(succeeded(), eq(variables['SHOULD_SIGN'], 'true')),eq(variables['buildName'], 'RPM'))
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- template: upload-final-results.yml
|
||||
parameters:
|
||||
artifactPath: $(System.ArtifactsDirectory)\rpm\release
|
||||
condition: and(and(succeeded(), ne(variables['SHOULD_SIGN'], 'true')),eq(variables['buildName'], 'RPM'))
|
||||
|
||||
- template: upload-final-results.yml
|
||||
parameters:
|
||||
artifactPath: '$(Build.StagingDirectory)\signedPackages\release'
|
||||
condition: and(and(succeeded(), eq(variables['SHOULD_SIGN'], 'true')),eq(variables['buildName'], 'RPM'))
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/step/finalize.yml
|
||||
@@ -1,313 +0,0 @@
|
||||
parameters:
|
||||
buildName: ''
|
||||
uploadDisplayName: 'Upload'
|
||||
parentJob: ''
|
||||
|
||||
jobs:
|
||||
- job: build_${{ parameters.buildName }}
|
||||
displayName: Build ${{ parameters.buildName }}
|
||||
condition: succeeded()
|
||||
pool:
|
||||
name: PowerShell1ES
|
||||
demands:
|
||||
- ImageOverride -equals PSMMSUbuntu20.04-Secure
|
||||
dependsOn: ${{ parameters.parentJob }}
|
||||
variables:
|
||||
- name: runCodesignValidationInjection
|
||||
value: false
|
||||
- name: build
|
||||
value: ${{ parameters.buildName }}
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
- group: ESRP
|
||||
- group: DotNetPrivateBuildAccess
|
||||
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- checkout: ComplianceRepo
|
||||
clean: true
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- pwsh: |
|
||||
# create folder
|
||||
sudo mkdir /PowerShell
|
||||
|
||||
# make the current user the owner
|
||||
sudo chown $env:USER /PowerShell
|
||||
displayName: 'Create /PowerShell'
|
||||
|
||||
- template: cloneToOfficialPath.yml
|
||||
|
||||
- template: insert-nuget-config-azfeed.yml
|
||||
parameters:
|
||||
repoRoot: $(PowerShellRoot)
|
||||
|
||||
- powershell: |
|
||||
import-module "$env:POWERSHELLROOT/build.psm1"
|
||||
Sync-PSTags -AddRemoteIfMissing
|
||||
displayName: SyncTags
|
||||
condition: and(succeeded(), ne(variables['SkipBuild'], 'true'))
|
||||
workingDirectory: $(PowerShellRoot)
|
||||
|
||||
- powershell: |
|
||||
Import-Module "$env:POWERSHELLROOT/build.psm1"
|
||||
|
||||
Start-PSBootstrap -Scenario Package
|
||||
displayName: 'Bootstrap'
|
||||
condition: and(succeeded(), ne(variables['SkipBuild'], 'true'))
|
||||
workingDirectory: $(PowerShellRoot)
|
||||
env:
|
||||
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
|
||||
|
||||
- pwsh: |
|
||||
try {
|
||||
Import-Module "$env:POWERSHELLROOT/build.psm1"
|
||||
Import-Module "$env:POWERSHELLROOT/tools/packaging"
|
||||
|
||||
Invoke-AzDevOpsLinuxPackageBuild -ReleaseTag '$(ReleaseTagVar)' -BuildType '$(build)'
|
||||
|
||||
Write-Verbose -Verbose "File permisions after building"
|
||||
Get-ChildItem -Path $(System.ArtifactsDirectory)/pwshLinuxBuild/pwsh | Select-Object -Property 'unixmode', 'size', 'name'
|
||||
|
||||
} catch {
|
||||
Get-Error
|
||||
throw
|
||||
}
|
||||
displayName: 'Build'
|
||||
condition: and(succeeded(), ne(variables['SkipBuild'], 'true'))
|
||||
workingDirectory: $(PowerShellRoot)
|
||||
|
||||
- template: Sbom.yml@ComplianceRepo
|
||||
parameters:
|
||||
BuildDropPath: '$(System.ArtifactsDirectory)/pwshLinuxBuild'
|
||||
Build_Repository_Uri: $(Github_Build_Repository_Uri)
|
||||
displayName: ${{ parameters.buildName }} SBOM
|
||||
PackageName: PowerShell Linux
|
||||
PackageVersion: $(Version)
|
||||
sourceScanPath: '$(PowerShellRoot)/tools'
|
||||
|
||||
- ${{ if eq(variables.build,'rpm') }} :
|
||||
- template: Sbom.yml@ComplianceRepo
|
||||
parameters:
|
||||
BuildDropPath: '$(System.ArtifactsDirectory)/pwshMarinerBuildAmd64'
|
||||
Build_Repository_Uri: $(Github_Build_Repository_Uri)
|
||||
displayName: Mariner x64 SBOM
|
||||
PackageName: PowerShell Linux Framework Dependent
|
||||
PackageVersion: $(Version)
|
||||
sourceScanPath: '$(PowerShellRoot)/tools'
|
||||
|
||||
- ${{ if eq(variables.build,'rpm') }} :
|
||||
- template: Sbom.yml@ComplianceRepo
|
||||
parameters:
|
||||
BuildDropPath: '$(System.ArtifactsDirectory)/pwshMarinerBuildArm64'
|
||||
Build_Repository_Uri: $(Github_Build_Repository_Uri)
|
||||
displayName: Mariner arm64 SBOM
|
||||
PackageName: PowerShell Linux Framework Dependent
|
||||
PackageVersion: $(Version)
|
||||
sourceScanPath: '$(PowerShellRoot)/tools'
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- template: Sbom.yml@ComplianceRepo
|
||||
parameters:
|
||||
BuildDropPath: '$(System.ArtifactsDirectory)/pwshLinuxBuildMinSize'
|
||||
Build_Repository_Uri: $(Github_Build_Repository_Uri)
|
||||
displayName: MinSize SBOM
|
||||
PackageName: PowerShell Linux Minimum Size
|
||||
PackageVersion: $(Version)
|
||||
sourceScanPath: '$(PowerShellRoot)/tools'
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- template: Sbom.yml@ComplianceRepo
|
||||
parameters:
|
||||
BuildDropPath: '$(System.ArtifactsDirectory)/pwshLinuxBuildArm32'
|
||||
Build_Repository_Uri: $(Github_Build_Repository_Uri)
|
||||
displayName: Arm32 SBOM
|
||||
PackageName: PowerShell Linux Arm32
|
||||
PackageVersion: $(Version)
|
||||
sourceScanPath: '$(PowerShellRoot)/tools'
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- template: Sbom.yml@ComplianceRepo
|
||||
parameters:
|
||||
BuildDropPath: '$(System.ArtifactsDirectory)/pwshLinuxBuildArm64'
|
||||
Build_Repository_Uri: $(Github_Build_Repository_Uri)
|
||||
displayName: Arm64 SBOM
|
||||
PackageName: PowerShell Linux Arm64
|
||||
PackageVersion: $(Version)
|
||||
sourceScanPath: '$(PowerShellRoot)/tools'
|
||||
|
||||
- ${{ if eq(variables.build,'alpine') }} :
|
||||
- template: Sbom.yml@ComplianceRepo
|
||||
parameters:
|
||||
BuildDropPath: '$(System.ArtifactsDirectory)/pwshAlpineFxdBuildAmd64'
|
||||
Build_Repository_Uri: $(Github_Build_Repository_Uri)
|
||||
displayName: Alpine FXD SBOM
|
||||
PackageName: PowerShell Alpine Framework Dependent AMD64
|
||||
PackageVersion: $(Version)
|
||||
sourceScanPath: '$(PowerShellRoot)/tools'
|
||||
|
||||
- pwsh: |
|
||||
Set-Location '$(System.ArtifactsDirectory)/pwshLinuxBuild'
|
||||
Write-Verbose -Verbose "File permisions before compressing"
|
||||
Get-ChildItem -Path $(Build.ArtifactStagingDirectory)/pwshLinuxBuild/pwsh | Select-Object -Property 'unixmode', 'size', 'name'
|
||||
tar -czvf $(System.ArtifactsDirectory)/pwshLinuxBuild.tar.gz *
|
||||
displayName: Compress pwshLinuxBuild
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- pwsh: |
|
||||
Set-Location '$(System.ArtifactsDirectory)/pwshLinuxBuildMinSize'
|
||||
tar -czvf $(System.ArtifactsDirectory)/pwshLinuxBuildMinSize.tar.gz *
|
||||
Set-Location '$(System.ArtifactsDirectory)/pwshLinuxBuildArm32'
|
||||
tar -czvf $(System.ArtifactsDirectory)/pwshLinuxBuildArm32.tar.gz *
|
||||
Set-Location '$(System.ArtifactsDirectory)/pwshLinuxBuildArm64'
|
||||
tar -czvf $(System.ArtifactsDirectory)/pwshLinuxBuildArm64.tar.gz *
|
||||
displayName: Compress deb
|
||||
|
||||
- ${{ if eq(variables.build,'rpm') }} :
|
||||
- pwsh: |
|
||||
Set-Location '$(System.ArtifactsDirectory)/pwshMarinerBuildAmd64'
|
||||
tar -czvf $(System.ArtifactsDirectory)/pwshMarinerBuildAmd64.tar.gz *
|
||||
displayName: Compress pwshMarinerBuildAmd64
|
||||
|
||||
- ${{ if eq(variables.build,'alpine') }} :
|
||||
- pwsh: |
|
||||
Set-Location '$(System.ArtifactsDirectory)/pwshAlpineFxdBuildAmd64'
|
||||
tar -czvf $(System.ArtifactsDirectory)/pwshAlpineFxdBuildAmd64.tar.gz *
|
||||
displayName: Compress pwshAlpineFxdBuildAmd64
|
||||
|
||||
- ${{ if eq(variables.build,'rpm') }} :
|
||||
- pwsh: |
|
||||
Set-Location '$(System.ArtifactsDirectory)/pwshMarinerBuildArm64'
|
||||
tar -czvf $(System.ArtifactsDirectory)/pwshMarinerBuildArm64.tar.gz *
|
||||
displayName: Compress pwshMarinerBuildArm64
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshLinuxBuild.tar.gz'
|
||||
artifactName: pwshLinuxBuild.tar.gz
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshLinuxBuild-meta'
|
||||
artifactName: pwshLinuxBuild-meta
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshLinuxBuildMinSize.tar.gz'
|
||||
artifactName: pwshLinuxBuildMinSize.tar.gz
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshLinuxBuildMinSize-meta'
|
||||
artifactName: pwshLinuxBuildMinSize-meta
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshLinuxBuildArm32.tar.gz'
|
||||
artifactName: pwshLinuxBuildArm32.tar.gz
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshLinuxBuildArm32-meta'
|
||||
artifactName: pwshLinuxBuildArm32-meta
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshLinuxBuildArm64.tar.gz'
|
||||
artifactName: pwshLinuxBuildArm64.tar.gz
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'deb') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshLinuxBuildArm64-meta'
|
||||
artifactName: pwshLinuxBuildArm64-meta
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'rpm') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshMarinerBuildAmd64.tar.gz'
|
||||
artifactName: pwshMarinerBuildAmd64.tar.gz
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'rpm') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshMarinerBuildAmd64-meta'
|
||||
artifactName: pwshMarinerBuildAmd64-meta
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'rpm') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshMarinerBuildArm64.tar.gz'
|
||||
artifactName: pwshMarinerBuildArm64.tar.gz
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'rpm') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshMarinerBuildArm64-meta'
|
||||
artifactName: pwshMarinerBuildArm64-meta
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'alpine') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshLinuxBuild.tar.gz'
|
||||
artifactName: pwshLinuxBuildAlpine.tar.gz
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'alpine') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshLinuxBuild-meta'
|
||||
artifactName: pwshLinuxBuildAlpine-meta
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'alpine') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshAlpineFxdBuildAmd64.tar.gz'
|
||||
artifactName: pwshAlpineFxdBuildAmd64.tar.gz
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'alpine') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshAlpineFxdBuildAmd64-meta'
|
||||
artifactName: pwshAlpineFxdBuildAmd64-meta
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'fxdependent') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshLinuxBuild.tar.gz'
|
||||
artifactName: pwshLinuxBuildFxdependent.tar.gz
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if eq(variables.build,'fxdependent') }} :
|
||||
- task: PublishPipelineArtifact@1
|
||||
inputs:
|
||||
path: '$(System.ArtifactsDirectory)/pwshLinuxBuild-meta'
|
||||
artifactName: pwshLinuxBuildFxdependent-meta
|
||||
retryCountOnTaskFailure: 2
|
||||
@@ -1,121 +0,0 @@
|
||||
parameters:
|
||||
buildArchitecture: 'x64'
|
||||
|
||||
jobs:
|
||||
- job: MacFileSigningJob_${{ parameters.buildArchitecture }}
|
||||
displayName: macOS File signing ${{ parameters.buildArchitecture }}
|
||||
condition: succeeded()
|
||||
pool:
|
||||
name: PowerShell1ES
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
|
||||
variables:
|
||||
- group: ESRP
|
||||
- name: runCodesignValidationInjection
|
||||
value: false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
- name: repoFolder
|
||||
value: PowerShell
|
||||
- name: repoRoot
|
||||
value: $(Agent.BuildDirectory)\$(repoFolder)
|
||||
- name: complianceRepoFolder
|
||||
value: compliance
|
||||
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
path: $(repoFolder)
|
||||
|
||||
- checkout: ComplianceRepo
|
||||
clean: true
|
||||
path: $(complianceRepoFolder)
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- template: shouldSign.yml
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
inputs:
|
||||
artifactName: 'macosBinResults'
|
||||
itemPattern: '**/*.zip'
|
||||
downloadPath: '$(System.ArtifactsDirectory)\Symbols'
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem "$(System.ArtifactsDirectory)\*" -Recurse
|
||||
displayName: 'Capture Downloaded Artifacts'
|
||||
# Diagnostics is not critical it passes every time it runs
|
||||
continueOnError: true
|
||||
|
||||
- pwsh: |
|
||||
$zipPath = Get-Item '$(System.ArtifactsDirectory)\Symbols\macosBinResults\*symbol*${{ parameters.buildArchitecture }}*.zip'
|
||||
Write-Verbose -Verbose "Zip Path: $zipPath"
|
||||
|
||||
$expandedFolder = $zipPath.BaseName
|
||||
Write-Host "sending.. vso[task.setvariable variable=SymbolsFolder]$expandedFolder"
|
||||
Write-Host "##vso[task.setvariable variable=SymbolsFolder]$expandedFolder"
|
||||
|
||||
Expand-Archive -Path $zipPath -Destination "$(System.ArtifactsDirectory)\$expandedFolder" -Force
|
||||
displayName: Expand symbols zip
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem "$(System.ArtifactsDirectory)\*" -Recurse
|
||||
displayName: 'Capture artifacts dir Binaries'
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem "$(System.ArtifactsDirectory)\$(SymbolsFolder)" -Recurse -Include pwsh, *.dylib
|
||||
displayName: 'Capture Expanded Binaries'
|
||||
# Diagnostics is not critical it passes every time it runs
|
||||
continueOnError: true
|
||||
|
||||
- pwsh: |
|
||||
$null = new-item -type directory -path "$(Build.StagingDirectory)\macos"
|
||||
$zipFile = "$(Build.StagingDirectory)\macos\powershell-files-$(Version)-osx-${{ parameters.buildArchitecture }}.zip"
|
||||
Get-ChildItem "$(System.ArtifactsDirectory)\$(SymbolsFolder)" -Recurse -Include pwsh, *.dylib |
|
||||
Compress-Archive -Destination $zipFile
|
||||
Write-Host $zipFile
|
||||
displayName: 'Compress macOS binary files'
|
||||
|
||||
- template: EsrpSign.yml@ComplianceRepo
|
||||
parameters:
|
||||
buildOutputPath: $(Build.StagingDirectory)\macos
|
||||
signOutputPath: $(Build.StagingDirectory)\signedMacOSPackages
|
||||
certificateId: "CP-401337-Apple"
|
||||
pattern: |
|
||||
**\*.zip
|
||||
useMinimatch: true
|
||||
shouldSign: $(SHOULD_SIGN)
|
||||
displayName: Sign macOS Binaries
|
||||
|
||||
- pwsh: |
|
||||
$destination = "$(System.ArtifactsDirectory)\azureMacOs_${{ parameters.buildArchitecture }}"
|
||||
New-Item -Path $destination -Type Directory
|
||||
$zipPath = Get-ChildItem "$(Build.StagingDirectory)\signedMacOSPackages\powershell-*.zip" -Recurse | select-object -expandproperty fullname
|
||||
foreach ($z in $zipPath) { Expand-Archive -Path $z -DestinationPath $destination }
|
||||
displayName: 'Extract and copy macOS artifacts for upload'
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- template: upload-final-results.yml
|
||||
parameters:
|
||||
artifactPath: $(System.ArtifactsDirectory)\azureMacOs_${{ parameters.buildArchitecture }}
|
||||
artifactFilter: "*"
|
||||
artifactName: signedMacOsBins_${{ parameters.buildArchitecture }}
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- ${{ if eq(variables['SHOULD_SIGN'], 'true') }}:
|
||||
- template: EsrpScan.yml@ComplianceRepo
|
||||
parameters:
|
||||
scanPath: $(System.ArtifactsDirectory)\azureMacOs_${{ parameters.buildArchitecture }}
|
||||
pattern: |
|
||||
**\*
|
||||
|
||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||
displayName: 'Component Detection'
|
||||
inputs:
|
||||
sourceScanPath: '$(repoRoot)\tools'
|
||||
snapshotForceEnabled: true
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/step/finalize.yml
|
||||
@@ -1,143 +0,0 @@
|
||||
parameters:
|
||||
parentJob: ''
|
||||
buildArchitecture: x64
|
||||
|
||||
jobs:
|
||||
- job: package_macOS_${{ parameters.buildArchitecture }}
|
||||
displayName: Package macOS ${{ parameters.buildArchitecture }}
|
||||
condition: succeeded()
|
||||
pool:
|
||||
vmImage: macos-latest
|
||||
variables:
|
||||
# Turn off Homebrew analytics
|
||||
- name: HOMEBREW_NO_ANALYTICS
|
||||
value: 1
|
||||
- name: runCodesignValidationInjection
|
||||
value: false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
- group: DotNetPrivateBuildAccess
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- pwsh: |
|
||||
# create folder
|
||||
sudo mkdir "$(Agent.TempDirectory)/PowerShell"
|
||||
|
||||
# make the current user the owner
|
||||
sudo chown $env:USER "$(Agent.TempDirectory)/PowerShell"
|
||||
displayName: 'Create $(Agent.TempDirectory)/PowerShell'
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- template: shouldSign.yml
|
||||
|
||||
- template: cloneToOfficialPath.yml
|
||||
parameters:
|
||||
nativePathRoot: '$(Agent.TempDirectory)'
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download macosBinResults
|
||||
inputs:
|
||||
artifactName: 'macosBinResults'
|
||||
itemPattern: '**/*${{ parameters.buildArchitecture }}.zip'
|
||||
downloadPath: '$(System.ArtifactsDirectory)/Symbols'
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download signedMacOsBins
|
||||
inputs:
|
||||
artifactName: 'signedMacOsBins_${{ parameters.buildArchitecture }}'
|
||||
itemPattern: '**/*'
|
||||
downloadPath: '$(System.ArtifactsDirectory)/macOsBins'
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem "$(System.ArtifactsDirectory)\*" -Recurse
|
||||
displayName: 'Capture Downloaded Artifacts'
|
||||
# Diagnostics is not critical it passes every time it runs
|
||||
continueOnError: true
|
||||
|
||||
- pwsh: |
|
||||
$zipPath = Get-Item '$(System.ArtifactsDirectory)\Symbols\macosBinResults\*symbol*${{ parameters.buildArchitecture }}.zip'
|
||||
Write-Verbose -Verbose "Zip Path: $zipPath"
|
||||
|
||||
$expandedFolder = $zipPath.BaseName
|
||||
Write-Host "sending.. vso[task.setvariable variable=SymbolsFolder]$expandedFolder"
|
||||
Write-Host "##vso[task.setvariable variable=SymbolsFolder]$expandedFolder"
|
||||
|
||||
Expand-Archive -Path $zipPath -Destination "$(System.ArtifactsDirectory)\$expandedFolder" -Force
|
||||
displayName: Expand symbols zip
|
||||
|
||||
- pwsh: |
|
||||
Import-Module $(PowerShellRoot)/build.psm1 -Force
|
||||
Import-Module $(PowerShellRoot)/tools/packaging -Force
|
||||
$signedFilesPath = '$(System.ArtifactsDirectory)/macOsBins/signedMacOsBins_${{ parameters.buildArchitecture }}/'
|
||||
$BuildPath = '$(System.ArtifactsDirectory)\$(SymbolsFolder)'
|
||||
|
||||
Update-PSSignedBuildFolder -BuildPath $BuildPath -SignedFilesPath $SignedFilesPath
|
||||
displayName: Merge signed files with Build
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- template: Sbom.yml@ComplianceRepo
|
||||
parameters:
|
||||
BuildDropPath: '$(System.ArtifactsDirectory)/$(SymbolsFolder)'
|
||||
Build_Repository_Uri: $(Github_Build_Repository_Uri)
|
||||
PackageName: PowerShell macOS ${{ parameters.buildArchitecture }}
|
||||
PackageVersion: $(Version)
|
||||
sourceScanPath: '$(PowerShellRoot)/tools'
|
||||
|
||||
- pwsh: |
|
||||
Import-Module $(PowerShellRoot)/build.psm1 -Force
|
||||
Import-Module $(PowerShellRoot)/tools/packaging -Force
|
||||
|
||||
$destFolder = '$(System.ArtifactsDirectory)\signedZip'
|
||||
$BuildPath = '$(System.ArtifactsDirectory)\$(SymbolsFolder)'
|
||||
|
||||
$null = New-Item -ItemType Directory -Path $destFolder -Force
|
||||
|
||||
$BuildPackagePath = New-PSBuildZip -BuildPath $BuildPath -DestinationFolder $destFolder
|
||||
|
||||
Write-Verbose -Verbose "New-PSSignedBuildZip returned `$BuildPackagePath as: $BuildPackagePath"
|
||||
Write-Host "##vso[artifact.upload containerfolder=results;artifactname=results]$BuildPackagePath"
|
||||
|
||||
$vstsCommandString = "vso[task.setvariable variable=BuildPackagePath]$BuildPackagePath"
|
||||
Write-Host ("sending " + $vstsCommandString)
|
||||
Write-Host "##$vstsCommandString"
|
||||
displayName: Compress signed files
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
|
||||
- pwsh: |
|
||||
try {
|
||||
tools/releaseBuild/macOS/PowerShellPackageVsts.ps1 -location $(PowerShellRoot) -BootStrap
|
||||
} catch {
|
||||
Get-Error
|
||||
throw
|
||||
}
|
||||
displayName: 'Bootstrap VM'
|
||||
env:
|
||||
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
|
||||
|
||||
- pwsh: |
|
||||
# Add -SkipReleaseChecks as a mitigation to unblock release.
|
||||
# macos-10.15 does not allow creating a folder under root. Hence, moving the folder.
|
||||
try {
|
||||
$(Build.SourcesDirectory)/tools/releaseBuild/macOS/PowerShellPackageVsts.ps1 -ReleaseTag $(ReleaseTagVar) -Destination $(System.ArtifactsDirectory) -location $(PowerShellRoot) -ArtifactName macosPkgResults -BuildZip $(BuildPackagePath) -ExtraPackage "tar" -Runtime 'osx-${{ parameters.buildArchitecture }}' -SkipReleaseChecks
|
||||
} catch {
|
||||
Get-Error
|
||||
throw
|
||||
}
|
||||
displayName: 'Package'
|
||||
env:
|
||||
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
|
||||
|
||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||
displayName: 'Component Detection'
|
||||
inputs:
|
||||
sourceScanPath: '$(PowerShellRoot)/tools'
|
||||
snapshotForceEnabled: true
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/step/finalize.yml
|
||||
@@ -1,135 +0,0 @@
|
||||
parameters:
|
||||
buildArchitecture: x64
|
||||
|
||||
jobs:
|
||||
- job: MacPackageSigningJob_${{ parameters.buildArchitecture }}
|
||||
displayName: macOS Package signing ${{ parameters.buildArchitecture }}
|
||||
condition: succeeded()
|
||||
pool:
|
||||
name: PowerShell1ES
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
variables:
|
||||
- group: ESRP
|
||||
- name: runCodesignValidationInjection
|
||||
value: false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
- name: repoFolder
|
||||
value: PowerShell
|
||||
- name: repoRoot
|
||||
value: $(Agent.BuildDirectory)\$(repoFolder)
|
||||
- name: complianceRepoFolder
|
||||
value: compliance
|
||||
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
path: $(repoFolder)
|
||||
|
||||
- checkout: ComplianceRepo
|
||||
clean: true
|
||||
path: $(complianceRepoFolder)
|
||||
|
||||
- template: shouldSign.yml
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
inputs:
|
||||
artifactName: 'macosPkgResults'
|
||||
itemPattern: '**/*'
|
||||
downloadPath: '$(System.ArtifactsDirectory)'
|
||||
|
||||
- pwsh: |
|
||||
dir "$(System.ArtifactsDirectory)\*" -Recurse
|
||||
displayName: 'Capture Downloaded Artifacts'
|
||||
# Diagnostics is not critical it passes every time it runs
|
||||
continueOnError: true
|
||||
|
||||
- pwsh: |
|
||||
$null = new-item -type directory -path "$(Build.StagingDirectory)\macos"
|
||||
$zipFile = "$(Build.StagingDirectory)\macos\powershell-$(Version)-osx-${{ parameters.buildArchitecture }}.zip"
|
||||
Compress-Archive -Path "$(System.ArtifactsDirectory)\macosPkgResults\powershell-$(Version)-osx-${{ parameters.buildArchitecture }}.pkg" -Destination $zipFile
|
||||
Write-Host $zipFile
|
||||
|
||||
$ltsPkgPath = "$(System.ArtifactsDirectory)\macosPkgResults\powershell-lts-$(Version)-osx-${{ parameters.buildArchitecture }}.pkg"
|
||||
|
||||
if(Test-Path $ltsPkgPath)
|
||||
{
|
||||
$ltsZipFile = "$(Build.StagingDirectory)\macos\powershell-lts-$(Version)-osx-${{ parameters.buildArchitecture }}.zip"
|
||||
Compress-Archive -Path $ltsPkgPath -Destination $ltsZipFile
|
||||
Write-Host $ltsZipFile
|
||||
}
|
||||
displayName: 'Compress macOS Package'
|
||||
|
||||
- template: EsrpSign.yml@ComplianceRepo
|
||||
parameters:
|
||||
buildOutputPath: $(Build.StagingDirectory)\macos
|
||||
signOutputPath: $(Build.StagingDirectory)\signedMacOSPackages
|
||||
certificateId: "CP-401337-Apple"
|
||||
pattern: |
|
||||
**\*.zip
|
||||
useMinimatch: true
|
||||
shouldSign: $(SHOULD_SIGN)
|
||||
displayName: Sign pkg
|
||||
|
||||
- template: upload-final-results.yml
|
||||
parameters:
|
||||
artifactPath: $(System.ArtifactsDirectory)\macosPkgResults
|
||||
artifactFilter: "*${{ parameters.buildArchitecture }}.tar.gz"
|
||||
|
||||
- pwsh: |
|
||||
$destination = "$(System.ArtifactsDirectory)\azureMacOs"
|
||||
New-Item -Path $destination -Type Directory
|
||||
$zipPath = dir "$(Build.StagingDirectory)\signedMacOSPackages\powershell-*.zip" -Recurse | select-object -expandproperty fullname
|
||||
foreach ($z in $zipPath) { Expand-Archive -Path $z -DestinationPath $destination }
|
||||
$targzPath = dir "$(System.ArtifactsDirectory)\*osx*.tar.gz" -Recurse | select-object -expandproperty fullname
|
||||
Copy-Item -Path $targzPath -Destination $destination
|
||||
displayName: 'Extract and copy macOS artifacts for upload'
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- template: upload-final-results.yml
|
||||
parameters:
|
||||
artifactPath: $(System.ArtifactsDirectory)\azureMacOs
|
||||
artifactFilter: "*.pkg"
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- pwsh: |
|
||||
$null = new-item -type directory -path "$(Build.StagingDirectory)\macos-unsigned"
|
||||
Copy-Item -Path "$(System.ArtifactsDirectory)\macosPkgResults\powershell-$(Version)-osx-x64.pkg" -Destination "$(Build.StagingDirectory)\macos-unsigned"
|
||||
Copy-Item -Path "$(System.ArtifactsDirectory)\macosPkgResults\powershell-$(Version)-osx-x64.tar.gz" -Destination "$(Build.StagingDirectory)\macos-unsigned"
|
||||
displayName: 'Create unsigned folder to upload'
|
||||
condition: and(succeeded(), ne(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'AzureBlob File Copy - unsigned'
|
||||
inputs:
|
||||
SourcePath: '$(Build.StagingDirectory)\macos-unsigned\*'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: '$(AzureVersion)'
|
||||
condition: and(succeeded(), ne(variables['SHOULD_SIGN'], 'true'))
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'AzureBlob File Copy - signed'
|
||||
inputs:
|
||||
SourcePath: '$(System.ArtifactsDirectory)\azureMacOs\*'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: '$(AzureVersion)'
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||
displayName: 'Component Detection'
|
||||
inputs:
|
||||
sourceScanPath: '$(repoRoot)/tools'
|
||||
snapshotForceEnabled: true
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/step/finalize.yml
|
||||
@@ -1,68 +0,0 @@
|
||||
parameters:
|
||||
buildArchitecture: 'x64'
|
||||
|
||||
jobs:
|
||||
- job: build_macOS_${{ parameters.buildArchitecture }}
|
||||
displayName: Build macOS ${{ parameters.buildArchitecture }}
|
||||
condition: succeeded()
|
||||
pool:
|
||||
vmImage: macos-latest
|
||||
variables:
|
||||
# Turn off Homebrew analytics
|
||||
- name: HOMEBREW_NO_ANALYTICS
|
||||
value: 1
|
||||
- name: runCodesignValidationInjection
|
||||
value: false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
- group: DotNetPrivateBuildAccess
|
||||
steps:
|
||||
#- task: <task type name>@<version>
|
||||
# inputs:
|
||||
# <task specific inputs>
|
||||
# displayName: '<display name of task>'
|
||||
- checkout: self
|
||||
clean: true
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- pwsh: |
|
||||
# create folder
|
||||
sudo mkdir "$(Agent.TempDirectory)/PowerShell"
|
||||
|
||||
# make the current user the owner
|
||||
sudo chown $env:USER "$(Agent.TempDirectory)/PowerShell"
|
||||
displayName: 'Create $(Agent.TempDirectory)/PowerShell'
|
||||
|
||||
- template: cloneToOfficialPath.yml
|
||||
parameters:
|
||||
nativePathRoot: '$(Agent.TempDirectory)'
|
||||
|
||||
- pwsh: |
|
||||
tools/releaseBuild/macOS/PowerShellPackageVsts.ps1 -location $(PowerShellRoot) -BootStrap
|
||||
displayName: 'Bootstrap VM'
|
||||
env:
|
||||
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/insert-nuget-config-azfeed.yml
|
||||
parameters:
|
||||
repoRoot: $(PowerShellRoot)
|
||||
|
||||
- pwsh: |
|
||||
$env:AzDevOpsFeedPAT2 = '$(powershellPackageReadPat)'
|
||||
# Add -SkipReleaseChecks as a mitigation to unblock release.
|
||||
# macos-10.15 does not allow creating a folder under root. Hence, moving the folder.
|
||||
$(Build.SourcesDirectory)/tools/releaseBuild/macOS/PowerShellPackageVsts.ps1 -ReleaseTag $(ReleaseTagVar) -Destination $(System.ArtifactsDirectory) -Symbols -location $(PowerShellRoot) -Build -ArtifactName macosBinResults -Runtime 'osx-${{ parameters.buildArchitecture }}' -SkipReleaseChecks
|
||||
$env:AzDevOpsFeedPAT2 = $null
|
||||
displayName: 'Build'
|
||||
env:
|
||||
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
|
||||
|
||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||
displayName: 'Component Detection'
|
||||
inputs:
|
||||
sourceScanPath: '$(Build.SourcesDirectory)/tools'
|
||||
snapshotForceEnabled: true
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/step/finalize.yml
|
||||
@@ -1,290 +0,0 @@
|
||||
parameters:
|
||||
parentJobs: []
|
||||
|
||||
jobs:
|
||||
- job: build_nuget
|
||||
dependsOn:
|
||||
${{ parameters.parentJobs }}
|
||||
displayName: Build NuGet packages
|
||||
condition: succeeded()
|
||||
pool:
|
||||
name: $(windowsPool)
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
|
||||
timeoutInMinutes: 90
|
||||
|
||||
variables:
|
||||
- name: runCodesignValidationInjection
|
||||
value: false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
- name: build
|
||||
value: ${{ parameters.buildName }}
|
||||
- group: ESRP
|
||||
- name: GenAPIToolPath
|
||||
value: '$(System.ArtifactsDirectory)/GenAPI'
|
||||
- name: PackagePath
|
||||
value: '$(System.ArtifactsDirectory)/UnifiedPackagePath'
|
||||
- name: winFxdPath
|
||||
value: '$(System.ArtifactsDirectory)/winFxd'
|
||||
- name: winFxdWinDesktopPath
|
||||
value: '$(System.ArtifactsDirectory)/winFxdWinDesktop'
|
||||
- name: linuxFxdPath
|
||||
value: '$(System.ArtifactsDirectory)/linuxFxd'
|
||||
- name: alpineFxdPath
|
||||
value: '$(System.ArtifactsDirectory)/alpineFxd'
|
||||
- group: DotNetPrivateBuildAccess
|
||||
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- checkout: ComplianceRepo
|
||||
clean: true
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- powershell: |
|
||||
$content = Get-Content "$env:REPOROOT/global.json" -Raw | ConvertFrom-Json
|
||||
$vstsCommandString = "vso[task.setvariable variable=SDKVersion]$($content.sdk.version)"
|
||||
Write-Host "sending " + $vstsCommandString
|
||||
Write-Host "##$vstsCommandString"
|
||||
displayName: 'Find SDK version from global.json'
|
||||
|
||||
- pwsh: |
|
||||
Import-Module "$env:REPOROOT/build.psm1" -Force
|
||||
# We just need .NET but we fixed this in an urgent situation.
|
||||
Start-PSBootStrap -Verbose
|
||||
displayName: Bootstrap
|
||||
env:
|
||||
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: 'Download PowerShell build artifacts - finalResults'
|
||||
inputs:
|
||||
buildType: current
|
||||
downloadType: single
|
||||
artifactName: finalResults
|
||||
downloadPath: '$(System.ArtifactsDirectory)'
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: 'Download PowerShell build artifacts - macosPkgResults'
|
||||
inputs:
|
||||
buildType: current
|
||||
downloadType: single
|
||||
artifactName: macosPkgResults
|
||||
downloadPath: '$(System.ArtifactsDirectory)'
|
||||
|
||||
- powershell: 'Get-ChildItem $(System.ArtifactsDirectory) -recurse'
|
||||
displayName: 'Capture downloaded artifacts'
|
||||
|
||||
- powershell: |
|
||||
$packagePath = (Join-Path $(System.ArtifactsDirectory) packages)
|
||||
New-Item $packagePath -ItemType Directory -Force > $null
|
||||
$packages = Get-ChildItem $(System.ArtifactsDirectory) -Include *.zip, *.tar.gz -Recurse
|
||||
$packages | ForEach-Object { Copy-Item $_.FullName -Destination $packagePath -Verbose }
|
||||
Get-ChildItem $packagePath -Recurse
|
||||
displayName: 'Conflate packages to same folder'
|
||||
|
||||
- task: ExtractFiles@1
|
||||
displayName: 'Extract files win-fxdependent'
|
||||
inputs:
|
||||
archiveFilePatterns: '$(System.ArtifactsDirectory)/packages/PowerShell-*-win-fxdependent.zip'
|
||||
destinationFolder: '$(winFxdPath)'
|
||||
|
||||
- task: ExtractFiles@1
|
||||
displayName: 'Extract files win-fxdependentWinDesktop'
|
||||
inputs:
|
||||
archiveFilePatterns: '$(System.ArtifactsDirectory)/packages/PowerShell-*-win-fxdependentWinDesktop.zip'
|
||||
destinationFolder: '$(winFxdWinDesktopPath)'
|
||||
|
||||
- task: ExtractFiles@1
|
||||
displayName: 'Extract files linux-fxdependent'
|
||||
inputs:
|
||||
archiveFilePatterns: '$(System.ArtifactsDirectory)/packages/powershell-*-linux-x64-fxdependent.tar.gz'
|
||||
destinationFolder: '$(linuxFxdPath)'
|
||||
|
||||
- task: ExtractFiles@1
|
||||
displayName: 'Extract files alpine-fxdependent'
|
||||
inputs:
|
||||
archiveFilePatterns: '$(System.ArtifactsDirectory)/packages/powershell-*-linux-x64-musl-noopt-fxdependent.tar.gz'
|
||||
destinationFolder: '$(alpineFxdPath)'
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- template: shouldSign.yml
|
||||
|
||||
- task: NuGetToolInstaller@1
|
||||
displayName: 'Install NuGet.exe'
|
||||
|
||||
# Create nuget packages along with SBOM manifests.
|
||||
- template: nuget-pkg-sbom.yml
|
||||
parameters:
|
||||
PackageVersion: $(Version)
|
||||
PackagePath: $(PackagePath)
|
||||
WinFxdPath: $(winFxdPath)
|
||||
LinuxFxdPath: $(linuxFxdPath)
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem $(linuxFxdPath)
|
||||
Get-ChildItem $(winFxdPath)
|
||||
Get-ChildItem $(winFxdWinDesktopPath)
|
||||
Get-ChildItem $(alpineFxdPath)
|
||||
displayName: Capture fxd folders
|
||||
|
||||
# Create Global Tool packages along with SBOM manifests
|
||||
- template: global-tool-pkg-sbom.yml
|
||||
parameters:
|
||||
PackageVersion: $(Version)
|
||||
LinuxBinPath: $(linuxFxdPath)
|
||||
WindowsBinPath: $(winFxdPath)
|
||||
WindowsDesktopBinPath: $(winFxdWinDesktopPath)
|
||||
AlpineBinPath: $(alpineFxdPath)
|
||||
DestinationPath: $(PackagePath)\globaltool
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem "$(PackagePath)" -Recurse
|
||||
displayName: Capture generated packages
|
||||
|
||||
- template: EsrpSign.yml@ComplianceRepo
|
||||
parameters:
|
||||
buildOutputPath: $(PackagePath)
|
||||
signOutputPath: $(System.ArtifactsDirectory)\signed
|
||||
certificateId: "CP-401405"
|
||||
pattern: |
|
||||
**\*.nupkg
|
||||
useMinimatch: true
|
||||
shouldSign: $(SHOULD_SIGN)
|
||||
displayName: Sign NuPkg
|
||||
|
||||
- pwsh: |
|
||||
if (-not (Test-Path '$(System.ArtifactsDirectory)\signed\')) { $null = New-Item -ItemType Directory -Path '$(System.ArtifactsDirectory)\signed\' }
|
||||
Copy-Item -Path '$(PackagePath)\*.nupkg' -Destination '$(System.ArtifactsDirectory)\signed\' -Verbose -Force
|
||||
Copy-Item -Path '$(PackagePath)\globaltool\*.nupkg' -Destination '$(System.ArtifactsDirectory)\signed\' -Verbose -Force
|
||||
displayName: Fake copy when not signing
|
||||
condition: eq(variables['SHOULD_SIGN'], 'false')
|
||||
|
||||
- pwsh: |
|
||||
Import-Module "${env:REPOROOT}\build.psm1" -Force
|
||||
Get-ChildItem -Recurse "$(System.ArtifactsDirectory)\signed\*.nupkg" -Verbose | ForEach-Object { Start-NativeExecution -sb { nuget.exe verify -All $_.FullName } }
|
||||
displayName: Verify all packages are signed
|
||||
condition: eq(variables['SHOULD_SIGN'], 'true')
|
||||
|
||||
- task: securedevelopmentteam.vss-secure-development-tools.build-task-antimalware.AntiMalware@3
|
||||
displayName: 'Run MpCmdRun.exe'
|
||||
inputs:
|
||||
FileDirPath: '$(PackagePath)'
|
||||
TreatStaleSignatureAs: Warning
|
||||
|
||||
- task: securedevelopmentteam.vss-secure-development-tools.build-task-publishsecurityanalysislogs.PublishSecurityAnalysisLogs@2
|
||||
displayName: 'Publish Security Analysis Logs'
|
||||
|
||||
- template: upload-final-results.yml
|
||||
parameters:
|
||||
artifactPath: '$(System.ArtifactsDirectory)\signed'
|
||||
|
||||
- pwsh: |
|
||||
if (-not (Test-Path "$(System.ArtifactsDirectory)\signed\globaltool"))
|
||||
{
|
||||
$null = New-Item -Path "$(System.ArtifactsDirectory)\signed\globaltool" -ItemType Directory -Force
|
||||
}
|
||||
|
||||
Move-Item -Path "$(System.ArtifactsDirectory)\signed\PowerShell.*" -Destination "$(System.ArtifactsDirectory)\signed\globaltool" -Force
|
||||
Get-ChildItem "$(System.ArtifactsDirectory)\signed\globaltool" -Recurse
|
||||
displayName: Move global tool packages to subfolder and capture
|
||||
|
||||
- pwsh: |
|
||||
$packagePath = (Join-Path $(System.ArtifactsDirectory) checksum)
|
||||
New-Item $packagePath -ItemType Directory -Force > $null
|
||||
$srcPaths = @("$(System.ArtifactsDirectory)\finalResults", "$(System.ArtifactsDirectory)\macosPkgResults", "$(System.ArtifactsDirectory)\signed")
|
||||
|
||||
$packages = Get-ChildItem -Path $srcPaths -Include *.zip, *.tar.gz, *.msi*, *.pkg, *.deb, *.rpm -Exclude "PowerShell-Symbols*" -Recurse
|
||||
$packages | ForEach-Object { Copy-Item $_.FullName -Destination $packagePath -Verbose }
|
||||
|
||||
$packagePathList = Get-ChildItem $packagePath -Recurse | Select-Object -ExpandProperty FullName | Out-String
|
||||
Write-Verbose -Verbose $packagePathList
|
||||
|
||||
$checksums = Get-ChildItem -Path $packagePath -Exclude "SHA512SUMS" |
|
||||
ForEach-Object {
|
||||
Write-Verbose -Verbose "Generating checksum file for $($_.FullName)"
|
||||
$packageName = $_.Name
|
||||
$hash = (Get-FileHash -Path $_.FullName -Algorithm SHA512).Hash.ToLower()
|
||||
|
||||
# the '*' before the packagename signifies it is a binary
|
||||
"$hash *$packageName"
|
||||
}
|
||||
|
||||
$checksums | Out-File -FilePath "$packagePath\SHA512SUMS" -Force
|
||||
|
||||
|
||||
$fileContent = Get-Content -Path "$packagePath\SHA512SUMS" -Raw | Out-String
|
||||
Write-Verbose -Verbose -Message $fileContent
|
||||
|
||||
Copy-Item -Path "$packagePath\SHA512SUMS" -Destination '$(System.ArtifactsDirectory)\signed\' -verbose
|
||||
displayName: Generate checksum file for packages
|
||||
|
||||
- pwsh: |
|
||||
$packagePath = (Join-Path $(System.ArtifactsDirectory) checksum_gbltool)
|
||||
New-Item $packagePath -ItemType Directory -Force > $null
|
||||
$srcPaths = @("$(System.ArtifactsDirectory)\signed\globaltool")
|
||||
$packages = Get-ChildItem -Path $srcPaths -Include *.nupkg -Recurse
|
||||
$packages | ForEach-Object { Copy-Item $_.FullName -Destination $packagePath -Verbose }
|
||||
|
||||
$packagePathList = Get-ChildItem $packagePath -Recurse | Select-Object -ExpandProperty FullName | Out-String
|
||||
Write-Verbose -Verbose $packagePathList
|
||||
|
||||
$checksums = Get-ChildItem -Path $packagePath -Exclude "SHA512SUMS" |
|
||||
ForEach-Object {
|
||||
Write-Verbose -Verbose "Generating checksum file for $($_.FullName)"
|
||||
$packageName = $_.Name
|
||||
$hash = (Get-FileHash -Path $_.FullName -Algorithm SHA512).Hash.ToLower()
|
||||
|
||||
# the '*' before the packagename signifies it is a binary
|
||||
"$hash *$packageName"
|
||||
}
|
||||
|
||||
$checksums | Out-File -FilePath "$packagePath\SHA512SUMS" -Force
|
||||
|
||||
$fileContent = Get-Content -Path "$packagePath\SHA512SUMS" -Raw | Out-String
|
||||
Write-Verbose -Verbose -Message $fileContent
|
||||
|
||||
Copy-Item -Path "$packagePath\SHA512SUMS" -Destination '$(System.ArtifactsDirectory)\signed\globaltool\' -verbose
|
||||
displayName: Generate checksum for global tools
|
||||
|
||||
- template: upload-final-results.yml
|
||||
parameters:
|
||||
artifactPath: '$(System.ArtifactsDirectory)\checksum'
|
||||
artifactFilter: SHA512SUMS
|
||||
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'Upload NuGet packages to Azure'
|
||||
inputs:
|
||||
SourcePath: '$(System.ArtifactsDirectory)\signed\*'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: '$(AzureVersion)-nuget'
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'Upload global tool packages to Azure'
|
||||
inputs:
|
||||
sourcePath: '$(System.ArtifactsDirectory)\signed\globaltool\*'
|
||||
azureSubscription: '$(GlobalToolSubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(GlobalToolStorageAccount)'
|
||||
ContainerName: 'tool-private'
|
||||
blobPrefix: '$(Version)'
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||
displayName: 'Component Detection'
|
||||
inputs:
|
||||
sourceScanPath: '$(PackagePath)'
|
||||
@@ -1,102 +0,0 @@
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
source: specific
|
||||
project: PowerShellCore
|
||||
pipeline: '696'
|
||||
preferTriggeringPipeline: true
|
||||
runVersion: latestFromBranch
|
||||
runBranch: '$(Build.SourceBranch)'
|
||||
artifact: BuildInfoJson
|
||||
path: '$(Pipeline.Workspace)/releasePipeline/BuildInfoJson'
|
||||
|
||||
- pwsh: |
|
||||
Import-Module '$(Build.SourcesDirectory)/tools/ci.psm1'
|
||||
$jsonFile = Get-Item "$ENV:PIPELINE_WORKSPACE/releasePipeline/BuildInfoJson/*.json"
|
||||
$fileName = Split-Path $jsonFile -Leaf
|
||||
|
||||
$dateTime = [datetime]::UtcNow
|
||||
$dateTime = [datetime]::new($dateTime.Ticks - ($dateTime.Ticks % [timespan]::TicksPerSecond), $dateTime.Kind)
|
||||
|
||||
$metadata = Get-Content ./tools/metadata.json | ConvertFrom-Json
|
||||
$stableRelease = $metadata.StableRelease.Latest
|
||||
$ltsRelease = $metadata.LTSRelease.Latest
|
||||
|
||||
Write-Verbose -Verbose "Writing $jsonFile contents:"
|
||||
$buildInfoJsonContent = Get-Content $jsonFile -Encoding UTF8NoBom -Raw
|
||||
Write-Verbose -Verbose $buildInfoJsonContent
|
||||
|
||||
$buildInfo = $buildInfoJsonContent | ConvertFrom-Json
|
||||
$buildInfo.ReleaseDate = $dateTime
|
||||
|
||||
$targetFile = "$ENV:PIPELINE_WORKSPACE/$fileName"
|
||||
ConvertTo-Json -InputObject $buildInfo | Out-File $targetFile -Encoding ascii
|
||||
|
||||
if ($stableRelease -or $fileName -eq "preview.json") {
|
||||
Set-BuildVariable -Name CopyMainBuildInfo -Value YES
|
||||
} else {
|
||||
Set-BuildVariable -Name CopyMainBuildInfo -Value NO
|
||||
}
|
||||
|
||||
Set-BuildVariable -Name BuildInfoJsonFile -Value $targetFile
|
||||
|
||||
## Create 'lts.json' if it's the latest stable and also a LTS release.
|
||||
|
||||
if ($fileName -eq "stable.json") {
|
||||
if ($ltsRelease) {
|
||||
$ltsFile = "$ENV:PIPELINE_WORKSPACE/lts.json"
|
||||
Copy-Item -Path $targetFile -Destination $ltsFile -Force
|
||||
Set-BuildVariable -Name LtsBuildInfoJsonFile -Value $ltsFile
|
||||
Set-BuildVariable -Name CopyLTSBuildInfo -Value YES
|
||||
} else {
|
||||
Set-BuildVariable -Name CopyLTSBuildInfo -Value NO
|
||||
}
|
||||
|
||||
$releaseTag = $buildInfo.ReleaseTag
|
||||
$version = $releaseTag -replace '^v'
|
||||
$semVersion = [System.Management.Automation.SemanticVersion] $version
|
||||
|
||||
$versionFile = "$ENV:PIPELINE_WORKSPACE/$($semVersion.Major)-$($semVersion.Minor).json"
|
||||
Copy-Item -Path $targetFile -Destination $versionFile -Force
|
||||
Set-BuildVariable -Name VersionBuildInfoJsonFile -Value $versionFile
|
||||
Set-BuildVariable -Name CopyVersionBuildInfo -Value YES
|
||||
} else {
|
||||
Set-BuildVariable -Name CopyVersionBuildInfo -Value NO
|
||||
}
|
||||
displayName: Download and Capture NuPkgs
|
||||
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'AzureBlob build info JSON file Copy'
|
||||
inputs:
|
||||
SourcePath: '$(BuildInfoJsonFile)'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: BuildInfo
|
||||
condition: and(succeeded(), eq(variables['CopyMainBuildInfo'], 'YES'))
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'AzureBlob build info ''lts.json'' Copy when needed'
|
||||
inputs:
|
||||
SourcePath: '$(LtsBuildInfoJsonFile)'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: BuildInfo
|
||||
condition: and(succeeded(), eq(variables['CopyLTSBuildInfo'], 'YES'))
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'AzureBlob build info ''Major-Minor.json'' Copy when needed'
|
||||
inputs:
|
||||
SourcePath: '$(VersionBuildInfoJsonFile)'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: BuildInfo
|
||||
condition: and(succeeded(), eq(variables['CopyVersionBuildInfo'], 'YES'))
|
||||
retryCountOnTaskFailure: 2
|
||||
@@ -1,56 +0,0 @@
|
||||
parameters:
|
||||
- name: sourceContainerName
|
||||
type: string
|
||||
default: 'source-container'
|
||||
|
||||
- name: destinationContainerName
|
||||
type: string
|
||||
default: 'destination-container'
|
||||
|
||||
- name: sourceStorageAccountName
|
||||
type: string
|
||||
default: 'source-storage-account'
|
||||
|
||||
- name: destinationStorageAccountName
|
||||
type: string
|
||||
default: 'destination-storage-account'
|
||||
|
||||
- name: blobPrefix
|
||||
type: string
|
||||
default: '$(Version)'
|
||||
|
||||
steps:
|
||||
- template: release-SetReleaseTagAndContainerName.yml
|
||||
|
||||
- pwsh: |
|
||||
Import-module '$(BUILD.SOURCESDIRECTORY)/build.psm1'
|
||||
Install-AzCopy
|
||||
displayName: Install AzCopy
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- pwsh: |
|
||||
Import-module '$(BUILD.SOURCESDIRECTORY)/build.psm1'
|
||||
$azcopy = Find-AzCopy
|
||||
Write-Verbose -Verbose "Found AzCopy: $azcopy"
|
||||
|
||||
$sourceContainerName = "${{ parameters.sourceContainerName }}"
|
||||
$destinationContainerName = "${{ parameters.destinationContainerName }}"
|
||||
$sourceStorageAccountName = "${{ parameters.sourceStorageAccountName }}"
|
||||
$destinationStorageAccountName = "${{ parameters.destinationStorageAccountName }}"
|
||||
$blobPrefix = "${{ parameters.blobPrefix }}"
|
||||
|
||||
$sourceBlobUrl = "https://${sourceStorageAccountName}.blob.core.windows.net/${sourceContainerName}/${blobPrefix}"
|
||||
Write-Verbose -Verbose "Source blob url: $sourceBlobUrl"
|
||||
$destinationBlobUrl = "https://${destinationStorageAccountName}.blob.core.windows.net/${destinationContainerName}"
|
||||
Write-Verbose -Verbose "Destination blob url: $destinationBlobUrl"
|
||||
|
||||
& $azcopy cp $sourceBlobUrl $destinationBlobUrl --recursive
|
||||
|
||||
$packagesPath = Get-ChildItem -Path $(System.ArtifactsDirectory)\*.deb -Recurse -File | Select-Object -First 1 -ExpandProperty DirectoryName
|
||||
Write-Host "sending -- vso[task.setvariable variable=PackagesRoot]$packagesPath"
|
||||
Write-Host "##vso[task.setvariable variable=PackagesRoot]$packagesPath"
|
||||
|
||||
displayName: Copy blobs
|
||||
retryCountOnTaskFailure: 2
|
||||
env:
|
||||
AZCOPY_AUTO_LOGIN_TYPE: MSI
|
||||
@@ -1,110 +0,0 @@
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- download: none
|
||||
|
||||
- template: release-SetReleaseTagAndContainerName.yml
|
||||
|
||||
- pwsh: |
|
||||
Import-module '$(BUILD.SOURCESDIRECTORY)/PowerShell/build.psm1'
|
||||
Install-AzCopy
|
||||
displayName: Install AzCopy
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- pwsh: |
|
||||
Import-module '$(BUILD.SOURCESDIRECTORY)/PowerShell/build.psm1'
|
||||
$azcopy = Find-AzCopy
|
||||
Write-Verbose -Verbose "Found AzCopy: $azcopy"
|
||||
|
||||
& $azcopy cp https://$(StorageAccount).blob.core.windows.net/$(AzureVersion) $(System.ArtifactsDirectory) --recursive
|
||||
|
||||
$packagesPath = Get-ChildItem -Path $(System.ArtifactsDirectory)\*.deb -Recurse -File | Select-Object -First 1 -ExpandProperty DirectoryName
|
||||
Write-Host "sending -- vso[task.setvariable variable=PackagesRoot]$packagesPath"
|
||||
Write-Host "##vso[task.setvariable variable=PackagesRoot]$packagesPath"
|
||||
|
||||
displayName: Download Azure Artifacts
|
||||
retryCountOnTaskFailure: 2
|
||||
env:
|
||||
AZCOPY_AUTO_LOGIN_TYPE: MSI
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem $(System.ArtifactsDirectory)\* -recurse | Select-Object -ExpandProperty FullName
|
||||
displayName: Capture downloaded artifacts
|
||||
|
||||
- pwsh: |
|
||||
git clone https://$(AzureDevOpsPat)@mscodehub.visualstudio.com/PowerShellCore/_git/Internal-PowerShellTeam-Tools '$(Pipeline.Workspace)/tools'
|
||||
displayName: Clone Internal-Tools repository
|
||||
|
||||
- pwsh: |
|
||||
$Path = "$(PackagesRoot)"
|
||||
$OutputPath = Join-Path $Path ‘hashes.sha256’
|
||||
$srcPaths = @($Path)
|
||||
$packages = Get-ChildItem -Path $srcPaths -Include * -Recurse -File
|
||||
$checksums = $packages |
|
||||
ForEach-Object {
|
||||
Write-Verbose -Verbose "Generating checksum file for $($_.FullName)"
|
||||
$packageName = $_.Name
|
||||
$hash = (Get-FileHash -Path $_.FullName -Algorithm SHA256).Hash.ToLower()
|
||||
# the '*' before the packagename signifies it is a binary
|
||||
"$hash *$packageName"
|
||||
}
|
||||
$checksums | Out-File -FilePath $OutputPath -Force
|
||||
$fileContent = Get-Content -Path $OutputPath -Raw | Out-String
|
||||
Write-Verbose -Verbose -Message $fileContent
|
||||
displayName: Add sha256 hashes
|
||||
|
||||
- checkout: ComplianceRepo
|
||||
|
||||
- pwsh: |
|
||||
$releaseVersion = '$(ReleaseTag)' -replace '^v',''
|
||||
$vstsCommandString = "vso[task.setvariable variable=ReleaseVersion]$releaseVersion"
|
||||
Write-Host "sending " + $vstsCommandString
|
||||
Write-Host "##$vstsCommandString"
|
||||
displayName: 'Set release version'
|
||||
|
||||
- template: Sbom.yml@ComplianceRepo
|
||||
parameters:
|
||||
BuildDropPath: '$(PackagesRoot)'
|
||||
Build_Repository_Uri: 'https://github.com/powershell/powershell.git'
|
||||
displayName: PowerShell Hashes SBOM
|
||||
packageName: PowerShell Artifact Hashes
|
||||
packageVersion: $(ReleaseVersion)
|
||||
sourceScanPath: '$(PackagesRoot)'
|
||||
|
||||
- pwsh: |
|
||||
Import-module '$(Pipeline.Workspace)/tools/Scripts/GitHubRelease.psm1'
|
||||
$releaseVersion = '$(ReleaseTag)' -replace '^v',''
|
||||
$semanticVersion = [System.Management.Automation.SemanticVersion]$releaseVersion
|
||||
|
||||
$isPreview = $semanticVersion.PreReleaseLabel -ne $null
|
||||
|
||||
$fileName = if ($isPreview) {
|
||||
"preview.md"
|
||||
}
|
||||
else {
|
||||
$semanticVersion.Major.ToString() + "." + $semanticVersion.Minor.ToString() + ".md"
|
||||
}
|
||||
|
||||
$filePath = "$env:BUILD_SOURCESDIRECTORY/PowerShell/CHANGELOG/$fileName"
|
||||
Write-Verbose -Verbose "Selected Log file: $filePath"
|
||||
|
||||
if (-not (Test-Path $filePath)) {
|
||||
throw "$filePath not found"
|
||||
}
|
||||
|
||||
$changelog = Get-Content -Path $filePath
|
||||
|
||||
$startPattern = "^## \[" + ([regex]::Escape($releaseVersion)) + "\]"
|
||||
$endPattern = "^## \[{0}\.{1}\.{2}*" -f $semanticVersion.Major, $semanticVersion.Minor, $semanticVersion.Patch
|
||||
|
||||
$clContent = $changelog | ForEach-Object {
|
||||
if ($_ -match $startPattern) { $outputLine = $true }
|
||||
elseif ($_ -match $endPattern) { $outputLine = $false }
|
||||
if ($outputLine) { $_}
|
||||
} | Out-String
|
||||
|
||||
Write-Verbose -Verbose "Selected content: `n$clContent"
|
||||
|
||||
Publish-ReleaseDraft -Tag '$(ReleaseTag)' -Name '$(ReleaseTag) Release of PowerShell' -Description $clContent -User PowerShell -Repository PowerShell -PackageFolder $(PackagesRoot) -Token $(GitHubReleasePat)
|
||||
displayName: Publish Release Draft
|
||||
@@ -1,149 +0,0 @@
|
||||
parameters:
|
||||
jobName: ""
|
||||
displayName: ""
|
||||
imageName: ""
|
||||
globalToolExeName: 'pwsh.exe'
|
||||
globalToolPackageName: 'PowerShell.Windows.x64'
|
||||
|
||||
|
||||
jobs:
|
||||
- job: ${{ parameters.jobName }}
|
||||
displayName: ${{ parameters.displayName }}
|
||||
pool:
|
||||
# test
|
||||
vmImage: ${{ parameters.imageName }}
|
||||
variables:
|
||||
- group: DotNetPrivateBuildAccess
|
||||
|
||||
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: '**/*.nupkg'
|
||||
path: '$(Pipeline.Workspace)/releasePipeline/finalResults'
|
||||
|
||||
- pwsh: |
|
||||
$dotnetMetadataPath = "$(Build.SourcesDirectory)/DotnetRuntimeMetadata.json"
|
||||
$dotnetMetadataJson = Get-Content $dotnetMetadataPath -Raw | ConvertFrom-Json
|
||||
|
||||
# Channel is like: $Channel = "5.0.1xx-preview2"
|
||||
$Channel = $dotnetMetadataJson.sdk.channel
|
||||
|
||||
$sdkVersion = (Get-Content "$(Build.SourcesDirectory)/global.json" -Raw | ConvertFrom-Json).sdk.version
|
||||
Import-Module "$(Build.SourcesDirectory)/build.psm1" -Force
|
||||
|
||||
Find-Dotnet
|
||||
|
||||
if(-not (Get-PackageSource -Name 'dotnet' -ErrorAction SilentlyContinue))
|
||||
{
|
||||
$nugetFeed = ([xml](Get-Content $(Build.SourcesDirectory)/nuget.config -Raw)).Configuration.packagesources.add | Where-Object { $_.Key -eq 'dotnet' } | Select-Object -ExpandProperty Value
|
||||
if ($nugetFeed) {
|
||||
Register-PackageSource -Name 'dotnet' -Location $nugetFeed -ProviderName NuGet
|
||||
Write-Verbose -Message "Register new package source 'dotnet'" -verbose
|
||||
}
|
||||
}
|
||||
|
||||
## Install latest version from the channel
|
||||
|
||||
#Install-Dotnet -Channel "$Channel" -Version $sdkVersion
|
||||
Start-PSBootstrap
|
||||
|
||||
Write-Verbose -Message "Installing .NET SDK completed." -Verbose
|
||||
|
||||
displayName: Install .NET
|
||||
env:
|
||||
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
|
||||
|
||||
- pwsh: |
|
||||
$branch = $ENV:BUILD_SOURCEBRANCH
|
||||
$version = $branch -replace '^.*(release[-/])v'
|
||||
$vstsCommandString = "vso[task.setvariable variable=PowerShellVersion]$version"
|
||||
Write-Verbose -Message "Version is $version" -Verbose
|
||||
Write-Host -Object "##$vstsCommandString"
|
||||
displayName: Set PowerShell Version
|
||||
|
||||
- pwsh: |
|
||||
$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
|
||||
Import-Module "$(Build.SourcesDirectory)/build.psm1" -Force
|
||||
Start-PSBootstrap
|
||||
|
||||
$toolPath = New-Item -ItemType Directory "$(System.DefaultWorkingDirectory)/toolPath" | Select-Object -ExpandProperty FullName
|
||||
|
||||
dotnet tool install --add-source "$ENV:PIPELINE_WORKSPACE/releasePipeline/finalResults" --tool-path $toolPath --version '$(PowerShellVersion)' '${{ parameters.globalToolPackageName }}'
|
||||
|
||||
Get-ChildItem -Path $toolPath
|
||||
|
||||
displayName: Install global tool
|
||||
env:
|
||||
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
|
||||
|
||||
- pwsh: |
|
||||
$toolPath = "$(System.DefaultWorkingDirectory)/toolPath/${{ parameters.globalToolExeName }}"
|
||||
|
||||
if (-not (Test-Path $toolPath))
|
||||
{
|
||||
throw "Tool is not installed at $toolPath"
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Verbose -Verbose "Tool found at: $toolPath"
|
||||
}
|
||||
displayName: Validate tool is installed
|
||||
|
||||
- pwsh: |
|
||||
Import-Module "$(Build.SourcesDirectory)/build.psm1" -Force
|
||||
Start-PSBootstrap
|
||||
|
||||
$exeName = if ($IsWindows) { "pwsh.exe" } else { "pwsh" }
|
||||
|
||||
$toolPath = "$(System.DefaultWorkingDirectory)/toolPath/${{ parameters.globalToolExeName }}"
|
||||
|
||||
$source = (get-command -Type Application -Name dotnet | Select-Object -First 1 -ExpandProperty source)
|
||||
$target = (Get-ChildItem $source).target
|
||||
|
||||
# If we find a symbolic link for dotnet, then we need to split the filename off the target.
|
||||
if ($target) {
|
||||
Write-Verbose -Verbose "Splitting target: $target"
|
||||
$target = Split-Path $target
|
||||
}
|
||||
|
||||
Write-Verbose -Verbose "target is set as $target"
|
||||
|
||||
$env:DOTNET_ROOT = (resolve-path -Path (Join-Path (split-path $source) $target)).ProviderPath
|
||||
|
||||
Write-Verbose -Verbose "DOTNET_ROOT: $env:DOTNET_ROOT"
|
||||
Get-ChildItem $env:DOTNET_ROOT
|
||||
|
||||
$versionFound = & $toolPath -c '$PSVersionTable.PSVersion.ToString()'
|
||||
|
||||
if ( '$(PowerShellVersion)' -ne $versionFound)
|
||||
{
|
||||
throw "Expected version of global tool not found. Installed version is $versionFound"
|
||||
}
|
||||
else
|
||||
{
|
||||
write-verbose -verbose "Found expected version: $versionFound"
|
||||
}
|
||||
|
||||
$dateYear = & $toolPath -c '(Get-Date).Year'
|
||||
|
||||
if ( $dateYear -ne [DateTime]::Now.Year)
|
||||
{
|
||||
throw "Get-Date returned incorrect year: $dateYear"
|
||||
}
|
||||
else
|
||||
{
|
||||
write-verbose -verbose "Got expected year: $dateYear"
|
||||
}
|
||||
displayName: Basic validation
|
||||
env:
|
||||
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
|
||||
@@ -1,20 +0,0 @@
|
||||
steps:
|
||||
- download: none
|
||||
|
||||
- template: release-SetReleaseTagAndContainerName.yml
|
||||
|
||||
- pwsh: |
|
||||
az login --service-principal -u $(az_url) -p $(az_key) --tenant $(az_name)
|
||||
displayName: az login
|
||||
|
||||
- pwsh: |
|
||||
az storage container set-permission --account-name $(StorageAccount) --name $(azureVersion) --public-access blob
|
||||
displayName: Make container public
|
||||
|
||||
- pwsh: |
|
||||
az storage container set-permission --account-name $(StorageAccount) --name $(azureVersion)-gc --public-access blob
|
||||
displayName: Make guest configuration miminal package container public
|
||||
|
||||
- pwsh: |
|
||||
az logout
|
||||
displayName: az logout
|
||||
@@ -1,81 +0,0 @@
|
||||
jobs:
|
||||
- job: CreateMSIXBundle
|
||||
displayName: Create .msixbundle file
|
||||
|
||||
pool:
|
||||
name: PowerShell1ES
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
|
||||
variables:
|
||||
- group: msixTools
|
||||
- group: 'Azure Blob variable group'
|
||||
|
||||
steps:
|
||||
- template: release-SetReleaseTagAndContainerName.yml
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
retryCountOnTaskFailure: 2
|
||||
inputs:
|
||||
source: specific
|
||||
project: PowerShellCore
|
||||
pipeline: '696'
|
||||
preferTriggeringPipeline: true
|
||||
runVersion: latestFromBranch
|
||||
runBranch: '$(Build.SourceBranch)'
|
||||
artifact: finalResults
|
||||
patterns: '**/*.msix'
|
||||
path: '$(Pipeline.Workspace)\releasePipeline\msix'
|
||||
|
||||
- pwsh: |
|
||||
$cmd = Get-Command makeappx.exe -ErrorAction Ignore
|
||||
if ($cmd) {
|
||||
Write-Verbose -Verbose 'makeappx available in PATH'
|
||||
$exePath = $cmd.Source
|
||||
} else {
|
||||
$toolsDir = '$(Pipeline.Workspace)\releasePipeline\tools'
|
||||
New-Item $toolsDir -Type Directory -Force > $null
|
||||
Invoke-RestMethod -Uri '$(makeappUrl)' -OutFile "$toolsDir\makeappx.zip"
|
||||
Expand-Archive "$toolsDir\makeappx.zip" -DestinationPath "$toolsDir\makeappx" -Force
|
||||
$exePath = "$toolsDir\makeappx\makeappx.exe"
|
||||
|
||||
Write-Verbose -Verbose 'makeappx was installed:'
|
||||
Get-ChildItem -Path $toolsDir -Recurse
|
||||
}
|
||||
|
||||
$vstsCommandString = "vso[task.setvariable variable=MakeAppxPath]$exePath"
|
||||
Write-Host "sending " + $vstsCommandString
|
||||
Write-Host "##$vstsCommandString"
|
||||
displayName: Install makeappx tool
|
||||
retryCountOnTaskFailure: 1
|
||||
|
||||
- pwsh: |
|
||||
$sourceDir = '$(Pipeline.Workspace)\releasePipeline\msix'
|
||||
$file = Get-ChildItem $sourceDir | Select-Object -First 1
|
||||
$prefix = ($file.BaseName -split "-win")[0]
|
||||
$pkgName = "$prefix.msixbundle"
|
||||
Write-Verbose -Verbose "Creating $pkgName"
|
||||
|
||||
$makeappx = '$(MakeAppxPath)'
|
||||
$outputDir = "$sourceDir\output"
|
||||
New-Item $outputDir -Type Directory -Force > $null
|
||||
& $makeappx bundle /d $sourceDir /p "$outputDir\$pkgName"
|
||||
|
||||
Get-ChildItem -Path $sourceDir -Recurse
|
||||
$vstsCommandString = "vso[task.setvariable variable=BundleDir]$outputDir"
|
||||
Write-Host "sending " + $vstsCommandString
|
||||
Write-Host "##$vstsCommandString"
|
||||
displayName: Create MsixBundle
|
||||
retryCountOnTaskFailure: 1
|
||||
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'Upload MSIX Bundle package to Az Blob'
|
||||
retryCountOnTaskFailure: 2
|
||||
inputs:
|
||||
SourcePath: '$(BundleDir)/*.msixbundle'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: '$(AzureVersion)-private'
|
||||
resourceGroup: '$(StorageResourceGroup)'
|
||||
condition: succeeded()
|
||||
@@ -1,57 +0,0 @@
|
||||
parameters:
|
||||
- name: skipPublish
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
steps:
|
||||
- template: release-SetReleaseTagAndContainerName.yml
|
||||
|
||||
- pwsh: |
|
||||
$packageVersion = '$(ReleaseTag)'.ToLowerInvariant() -replace '^v',''
|
||||
$vstsCommandString = "vso[task.setvariable variable=packageVersion]$packageVersion"
|
||||
Write-Host "sending " + $vstsCommandString
|
||||
Write-Host "##$vstsCommandString"
|
||||
displayName: Set Package version
|
||||
|
||||
- pwsh: |
|
||||
$branch = 'main-mirror'
|
||||
$gitArgs = "clone",
|
||||
"--verbose",
|
||||
"--branch",
|
||||
"$branch",
|
||||
"https://$(mscodehubCodeReadPat)@mscodehub.visualstudio.com/PowerShellCore/_git/Internal-PowerShellTeam-Tools",
|
||||
'$(Pipeline.Workspace)/tools'
|
||||
$gitArgs | Write-Verbose -Verbose
|
||||
git $gitArgs
|
||||
displayName: Clone Internal-PowerShellTeam-Tools from MSCodeHub
|
||||
|
||||
- task: PipAuthenticate@1
|
||||
inputs:
|
||||
artifactFeeds: 'pmc'
|
||||
pythonDownloadServiceConnections: pmcDownload
|
||||
|
||||
- pwsh: |
|
||||
pip install pmc-cli
|
||||
|
||||
$newPath = (resolve-path '~/.local/bin').providerpath
|
||||
$vstsCommandString = "vso[task.setvariable variable=PATH]${env:PATH}:$newPath"
|
||||
Write-Host "sending " + $vstsCommandString
|
||||
Write-Host "##$vstsCommandString"
|
||||
displayName: Install pmc cli
|
||||
|
||||
- pwsh: |
|
||||
$metadata = Get-Content -Path "$(Build.SourcesDirectory)/tools/metadata.json" -Raw | ConvertFrom-Json
|
||||
$params = @{
|
||||
ReleaseTag = "$(ReleaseTag)"
|
||||
AadClientId = "$(PmcCliClientID)"
|
||||
BlobFolderName = "$(AzureVersion)"
|
||||
LTS = $metadata.LTSRelease.Latest
|
||||
ForProduction = $true
|
||||
SkipPublish = $${{ parameters.skipPublish }}
|
||||
MappingFilePath = '$(System.DefaultWorkingDirectory)/tools/packages.microsoft.com/mapping.json'
|
||||
}
|
||||
|
||||
$params | Out-String -width 9999 -Stream | write-Verbose -Verbose
|
||||
|
||||
& '$(Pipeline.Workspace)/tools/packages.microsoft.com-v4/releaseLinuxPackages.ps1' @params
|
||||
displayName: Run release script
|
||||
@@ -1,51 +0,0 @@
|
||||
steps:
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
source: specific
|
||||
project: PowerShellCore
|
||||
pipeline: '696'
|
||||
preferTriggeringPipeline: true
|
||||
runVersion: latestFromBranch
|
||||
runBranch: '$(Build.SourceBranch)'
|
||||
artifact: results
|
||||
path: '$(Pipeline.Workspace)\results'
|
||||
itemPattern: |
|
||||
**/*
|
||||
!**/*signed.zip
|
||||
|
||||
- pwsh: |
|
||||
Write-Verbose -Verbose "Enumerating $(Pipeline.Workspace)\results"
|
||||
$downloadedArtifacts = Get-ChildItem -Recurse "$(Pipeline.Workspace)\results"
|
||||
$downloadedArtifacts
|
||||
$expandedRoot = New-Item -Path "$(Pipeline.Workspace)/expanded" -ItemType Directory -Verbose
|
||||
$symbolsRoot = New-Item -Path "$(Pipeline.Workspace)/symbols" -ItemType Directory -Verbose
|
||||
|
||||
$downloadedArtifacts | ForEach-Object {
|
||||
$destFolder = New-Item -Path "$expandedRoot/$($_.BaseName)/" -ItemType Directory -Verbose
|
||||
Expand-Archive -Path $_.FullName -DestinationPath $destFolder -Force
|
||||
|
||||
$symbolsZipFile = Join-Path -Path $destFolder -ChildPath "symbols.zip"
|
||||
$symbolZipFileContents = New-Item -Path "$destFolder/Symbols-$($_.BaseName)" -ItemType Directory -Verbose
|
||||
Expand-Archive -Path $symbolsZipFile -DestinationPath $symbolZipFileContents -Force
|
||||
|
||||
$symbolsToPublish = New-Item -Path "$symbolsRoot/$($_.BaseName)" -ItemType Directory -Verbose
|
||||
|
||||
Get-ChildItem -Path $symbolZipFileContents -Recurse -Filter '*.pdb' | ForEach-Object {
|
||||
Copy-Item -Path $_.FullName -Destination $symbolsToPublish -Verbose
|
||||
}
|
||||
}
|
||||
|
||||
Write-Verbose -Verbose "Enumerating $symbolsRoot"
|
||||
Get-ChildItem -Path $symbolsRoot -Recurse
|
||||
$vstsCommandString = "vso[task.setvariable variable=SymbolsPath]$symbolsRoot"
|
||||
Write-Verbose -Message "$vstsCommandString" -Verbose
|
||||
Write-Host -Object "##$vstsCommandString"
|
||||
displayName: Expand and capture symbols folders
|
||||
- task: PublishSymbols@2
|
||||
inputs:
|
||||
symbolsFolder: '$(SymbolsPath)'
|
||||
searchPattern: '**/*.pdb'
|
||||
indexSources: false
|
||||
publishSymbols: true
|
||||
symbolServerType: teamServices
|
||||
detailedLog: true
|
||||
@@ -1,56 +0,0 @@
|
||||
parameters:
|
||||
- name: skipPublish
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
steps:
|
||||
- task: DownloadPipelineArtifact@2
|
||||
condition: and(eq('${{ parameters.skipPublish }}', 'false'), succeeded())
|
||||
inputs:
|
||||
source: specific
|
||||
project: PowerShellCore
|
||||
pipeline: '696'
|
||||
preferTriggeringPipeline: true
|
||||
runVersion: latestFromBranch
|
||||
runBranch: '$(Build.SourceBranch)'
|
||||
artifact: finalResults
|
||||
patterns: '**/*.nupkg'
|
||||
path: '$(Pipeline.Workspace)/releasePipeline/finalResults'
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
condition: and(eq('${{ parameters.skipPublish }}', 'false'), succeeded())
|
||||
inputs:
|
||||
source: specific
|
||||
project: PowerShellCore
|
||||
pipeline: '696'
|
||||
preferTriggeringPipeline: true
|
||||
runVersion: latestFromBranch
|
||||
runBranch: '$(Build.SourceBranch)'
|
||||
artifact: metadata
|
||||
path: '$(Pipeline.Workspace)/releasePipeline/metadata'
|
||||
|
||||
- pwsh: |
|
||||
#Exclude all global tool packages. Their names start with 'PowerShell.'
|
||||
$null = New-Item -ItemType Directory -Path "$(Pipeline.Workspace)/release"
|
||||
Copy-Item "$ENV:PIPELINE_WORKSPACE/releasePipeline/finalResults/*.nupkg" -Destination "$(Pipeline.Workspace)/release" -Exclude "PowerShell.*.nupkg" -Force -Verbose
|
||||
|
||||
$releaseVersion = Get-Content "$ENV:PIPELINE_WORKSPACE/releasePipeline/metadata/release.json" | ConvertFrom-Json | Select-Object -ExpandProperty 'ReleaseVersion'
|
||||
$globalToolPath = "$ENV:PIPELINE_WORKSPACE/releasePipeline/finalResults/PowerShell.$releaseVersion.nupkg"
|
||||
|
||||
if ($releaseVersion -notlike '*-*') {
|
||||
# Copy the global tool package for stable releases
|
||||
Copy-Item $globalToolPath -Destination "$(Pipeline.Workspace)/release"
|
||||
}
|
||||
|
||||
Get-ChildItem "$(Pipeline.Workspace)/release" -recurse
|
||||
displayName: Download and capture nupkgs
|
||||
condition: and(eq('${{ parameters.skipPublish }}', 'false'), succeeded())
|
||||
|
||||
- task: NuGetCommand@2
|
||||
displayName: 'NuGet push'
|
||||
condition: and(eq('${{ parameters.skipPublish }}', 'false'), succeeded())
|
||||
inputs:
|
||||
command: push
|
||||
packagesToPush: '$(Pipeline.Workspace)/release/*.nupkg'
|
||||
nuGetFeedType: external
|
||||
publishFeedCredentials: PowerShellNuGetOrgPush
|
||||
@@ -1,26 +0,0 @@
|
||||
steps:
|
||||
- pwsh: |
|
||||
$variable = 'releaseTag'
|
||||
$branch = $ENV:BUILD_SOURCEBRANCH
|
||||
if($branch -notmatch '^.*((release/|rebuild/.*rebuild))')
|
||||
{
|
||||
throw "Branch name is not in release format: '$branch'"
|
||||
}
|
||||
|
||||
$releaseTag = $Branch -replace '^.*((release|rebuild)/)'
|
||||
$vstsCommandString = "vso[task.setvariable variable=$Variable]$releaseTag"
|
||||
Write-Verbose -Message "setting $Variable to $releaseTag" -Verbose
|
||||
Write-Host -Object "##$vstsCommandString"
|
||||
displayName: Set Release Tag
|
||||
|
||||
- pwsh: |
|
||||
$azureVersion = '$(ReleaseTag)'.ToLowerInvariant() -replace '\.', '-'
|
||||
$vstsCommandString = "vso[task.setvariable variable=AzureVersion]$azureVersion"
|
||||
Write-Host "sending " + $vstsCommandString
|
||||
Write-Host "##$vstsCommandString"
|
||||
|
||||
$version = '$(ReleaseTag)'.ToLowerInvariant().Substring(1)
|
||||
$vstsCommandString = "vso[task.setvariable variable=Version]$version"
|
||||
Write-Host ("sending " + $vstsCommandString)
|
||||
Write-Host "##$vstsCommandString"
|
||||
displayName: Set container name
|
||||
@@ -1,71 +0,0 @@
|
||||
jobs:
|
||||
- job: UpdateDepsFiles
|
||||
displayName: Update deps files
|
||||
|
||||
pool:
|
||||
name: PowerShell1ES
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
|
||||
variables:
|
||||
- group: 'Azure Blob variable group'
|
||||
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: '**/PowerShell*-win-x64.zip'
|
||||
path: '$(Pipeline.Workspace)/releasePipeline/finalResults'
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
source: specific
|
||||
project: PowerShellCore
|
||||
pipeline: '696'
|
||||
preferTriggeringPipeline: true
|
||||
runVersion: latestFromBranch
|
||||
runBranch: '$(Build.SourceBranch)'
|
||||
artifact: BuildInfoJson
|
||||
path: '$(Pipeline.Workspace)/releasePipeline/BuildInfoJson'
|
||||
|
||||
- pwsh: |
|
||||
$fileName = (Get-Item "$ENV:PIPELINE_WORKSPACE/releasePipeline/BuildInfoJson/*.json").BaseName
|
||||
if ($fileName -notin 'stable','preview')
|
||||
{
|
||||
throw "Unexpected fileName: $fileName"
|
||||
}
|
||||
|
||||
$vstsCommand = "vso[task.setvariable variable=BlobPrefix]$fileName"
|
||||
Write-Verbose -Verbose $vstsCommand
|
||||
Write-Host "##$vstsCommand"
|
||||
displayName: Determine container name
|
||||
|
||||
- pwsh: |
|
||||
$zipFile = Get-Item "$ENV:PIPELINE_WORKSPACE/releasePipeline/finalResults/PowerShell*-win-x64.zip" -Exclude *-symbols-*
|
||||
Write-Verbose -Verbose "zipFile: $zipFile"
|
||||
Expand-Archive -Path $zipFile -Destination "$ENV:PIPELINE_WORKSPACE/expanded"
|
||||
|
||||
$pwshDepsFile = Get-Item "$ENV:PIPELINE_WORKSPACE/expanded/pwsh.deps.json"
|
||||
$vstsCommand = "vso[task.setvariable variable=FileToUpload]$pwshDepsFile"
|
||||
Write-Verbose -Verbose $vstsCommand
|
||||
Write-Host "##$vstsCommand"
|
||||
displayName: Determine file to upload
|
||||
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'AzureBlob pwsh.deps.json file Copy'
|
||||
inputs:
|
||||
SourcePath: '$(FileToUpload)'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: ps-deps-json
|
||||
blobPrefix: '$(BlobPrefix)'
|
||||
retryCountOnTaskFailure: 2
|
||||
@@ -1,92 +0,0 @@
|
||||
parameters:
|
||||
jobName: ""
|
||||
displayName: ""
|
||||
imageName: ""
|
||||
packageNamePattern: ""
|
||||
use1ES: false
|
||||
|
||||
jobs:
|
||||
- job: ${{ parameters.jobName }}
|
||||
displayName: ${{ parameters.displayName }}
|
||||
variables:
|
||||
- group: DotNetPrivateBuildAccess
|
||||
pool:
|
||||
${{ if eq(parameters.use1ES, 'false') }}:
|
||||
vmImage: ${{ parameters.imageName }}
|
||||
${{ else }}:
|
||||
name: 'PS-MSCodeHub-ARM' # add ImageOverride to select image
|
||||
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: |
|
||||
$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
|
||||
Import-Module "$(Build.SourcesDirectory)/build.psm1" -Force
|
||||
Start-PSBootstrap
|
||||
Write-Verbose -Message "Installing .NET SDK completed." -Verbose
|
||||
displayName: Install .NET
|
||||
env:
|
||||
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
|
||||
|
||||
- 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: |
|
||||
$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
|
||||
Import-Module "$(Build.SourcesDirectory)/build.psm1" -Force
|
||||
Find-Dotnet -SetDotnetRoot
|
||||
Write-Verbose -Verbose "DOTNET_ROOT: $env:DOTNET_ROOT"
|
||||
Write-Verbose -Verbose "Check dotnet install"
|
||||
dotnet --info
|
||||
Write-Verbose -Verbose "Start test"
|
||||
$packageNameFilter = '${{ parameters.packageNamePattern }}'
|
||||
$pwshExeName = if ($packageNameFilter.EndsWith('tar.gz')) { 'pwsh' } else { 'pwsh.exe' }
|
||||
$pwshPath = Join-Path '$(Pipeline.Workspace)/releasePipeline/finalResults/fxd' $pwshExeName
|
||||
|
||||
if ($IsLinux) {
|
||||
chmod u+x $pwshPath
|
||||
}
|
||||
|
||||
$pwshDllPath = Join-Path '$(Pipeline.Workspace)/releasePipeline/finalResults/fxd' 'pwsh.dll'
|
||||
|
||||
$actualOutput = & dotnet $pwshDllPath -c 'Start-ThreadJob -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
|
||||
@@ -1,49 +0,0 @@
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem ENV: | Out-String -width 9999 -Stream | write-Verbose -Verbose
|
||||
displayName: Capture environment
|
||||
|
||||
- template: release-SetReleaseTagAndContainerName.yml
|
||||
|
||||
- pwsh: |
|
||||
$name = "{0}_{1:x}" -f '$(releaseTag)', (Get-Date).Ticks
|
||||
Write-Host $name
|
||||
Write-Host "##vso[build.updatebuildnumber]$name"
|
||||
displayName: Set Release Name
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
source: specific
|
||||
project: PowerShellCore
|
||||
pipeline: '696'
|
||||
preferTriggeringPipeline: true
|
||||
runVersion: latestFromBranch
|
||||
runBranch: '$(Build.SourceBranch)'
|
||||
artifact: finalResults
|
||||
path: $(System.ArtifactsDirectory)
|
||||
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem $(System.ArtifactsDirectory)\* -recurse | Select-Object -ExpandProperty Name
|
||||
displayName: Capture Artifact Listing
|
||||
|
||||
- pwsh: |
|
||||
Install-module Pester -Scope CurrentUser -Force -MaximumVersion 4.99
|
||||
displayName: Install Pester
|
||||
condition: succeededOrFailed()
|
||||
|
||||
- pwsh: |
|
||||
Import-module './build.psm1'
|
||||
Import-module './tools/packaging'
|
||||
$env:PACKAGE_FOLDER = '$(System.ArtifactsDirectory)'
|
||||
$path = Join-Path -Path $pwd -ChildPath './packageReleaseTests.xml'
|
||||
$results = invoke-pester -Script './tools/packaging/releaseTests' -OutputFile $path -OutputFormat NUnitXml -PassThru
|
||||
Write-Host "##vso[results.publish type=NUnit;mergeResults=true;runTitle=Package Release Tests;publishRunAttachments=true;resultFiles=$path;]"
|
||||
if($results.TotalCount -eq 0 -or $results.FailedCount -gt 0)
|
||||
{
|
||||
throw "Package Release Tests failed"
|
||||
}
|
||||
displayName: Run packaging release tests
|
||||
@@ -1,93 +0,0 @@
|
||||
steps:
|
||||
- pwsh: |
|
||||
Get-ChildItem ENV: | Out-String -width 9999 -Stream | write-Verbose -Verbose
|
||||
displayName: Capture environment
|
||||
|
||||
- template: release-SetReleaseTagAndContainerName.yml
|
||||
|
||||
- pwsh: |
|
||||
$name = "{0}_{1:x}" -f '$(releaseTag)', (Get-Date).Ticks
|
||||
Write-Host $name
|
||||
Write-Host "##vso[build.updatebuildnumber]$name"
|
||||
displayName: Set Release Name
|
||||
|
||||
- pwsh: |
|
||||
Import-module '$(BUILD.SOURCESDIRECTORY)/build.psm1'
|
||||
$azcopy = Find-AzCopy
|
||||
Write-Verbose -Verbose "Found AzCopy: $azcopy"
|
||||
|
||||
& $azcopy cp https://$(StorageAccount).blob.core.windows.net/$(AzureVersion)/* $(System.ArtifactsDirectory) --recursive
|
||||
|
||||
displayName: Download Azure Artifacts
|
||||
env:
|
||||
AZCOPY_AUTO_LOGIN_TYPE: MSI
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem $(System.ArtifactsDirectory)\* -recurse | Select-Object -ExpandProperty Name
|
||||
displayName: Capture Artifact Listing
|
||||
|
||||
- pwsh: |
|
||||
$message = @()
|
||||
Get-ChildItem $(System.ArtifactsDirectory)\* -recurse -filter *.rpm | ForEach-Object {
|
||||
if($_.Name -notmatch 'powershell\-(preview-|lts-)?\d+\.\d+\.\d+(_[a-z]*\.\d+)?-1.(rh|cm).(x86_64|aarch64)\.rpm')
|
||||
{
|
||||
$messageInstance = "$($_.Name) is not a valid package name"
|
||||
$message += $messageInstance
|
||||
Write-Warning $messageInstance
|
||||
}
|
||||
}
|
||||
if($message.count -gt 0){throw ($message | out-string)}
|
||||
displayName: Validate RPM package names
|
||||
|
||||
- pwsh: |
|
||||
$message = @()
|
||||
Get-ChildItem $(System.ArtifactsDirectory)\* -recurse -filter *.tar.gz | ForEach-Object {
|
||||
if($_.Name -notmatch 'powershell-(lts-)?\d+\.\d+\.\d+\-([a-z]*.\d+\-)?(linux|osx|linux-musl)+\-(x64\-fxdependent|x64|arm32|arm64|x64\-musl-noopt\-fxdependent)\.(tar\.gz)')
|
||||
{
|
||||
$messageInstance = "$($_.Name) is not a valid package name"
|
||||
$message += $messageInstance
|
||||
Write-Warning $messageInstance
|
||||
}
|
||||
}
|
||||
if($message.count -gt 0){throw ($message | out-string)}
|
||||
displayName: Validate Tar.Gz Package Names
|
||||
|
||||
- pwsh: |
|
||||
$message = @()
|
||||
Get-ChildItem $(System.ArtifactsDirectory)\* -recurse -filter *.pkg | ForEach-Object {
|
||||
if($_.Name -notmatch 'powershell-(lts-)?\d+\.\d+\.\d+\-([a-z]*.\d+\-)?osx(\.10\.12)?\-(x64|arm64)\.pkg')
|
||||
{
|
||||
$messageInstance = "$($_.Name) is not a valid package name"
|
||||
$message += $messageInstance
|
||||
Write-Warning $messageInstance
|
||||
}
|
||||
}
|
||||
if($message.count -gt 0){throw ($message | out-string)}
|
||||
displayName: Validate PKG Package Names
|
||||
|
||||
- pwsh: |
|
||||
$message = @()
|
||||
Get-ChildItem $(System.ArtifactsDirectory)\* -recurse -include *.zip, *.msi | ForEach-Object {
|
||||
if($_.Name -notmatch 'PowerShell-\d+\.\d+\.\d+\-([a-z]*.\d+\-)?win\-(fxdependent|x64|arm64|x86|fxdependentWinDesktop)\.(msi|zip){1}')
|
||||
{
|
||||
$messageInstance = "$($_.Name) is not a valid package name"
|
||||
$message += $messageInstance
|
||||
Write-Warning $messageInstance
|
||||
}
|
||||
}
|
||||
|
||||
if($message.count -gt 0){throw ($message | out-string)}
|
||||
displayName: Validate Zip and MSI Package Names
|
||||
|
||||
- pwsh: |
|
||||
$message = @()
|
||||
Get-ChildItem $(System.ArtifactsDirectory)\* -recurse -filter *.deb | ForEach-Object {
|
||||
if($_.Name -notmatch 'powershell(-preview|-lts)?_\d+\.\d+\.\d+([\-~][a-z]*.\d+)?-\d\.deb_amd64\.deb')
|
||||
{
|
||||
$messageInstance = "$($_.Name) is not a valid package name"
|
||||
$message += $messageInstance
|
||||
Write-Warning $messageInstance
|
||||
}
|
||||
}
|
||||
if($message.count -gt 0){throw ($message | out-string)}
|
||||
displayName: Validate Deb Package Names
|
||||
@@ -1,35 +0,0 @@
|
||||
parameters:
|
||||
- name: displayName
|
||||
type: string
|
||||
- name: instructions
|
||||
type: string
|
||||
- name: jobName
|
||||
type: string
|
||||
default: approval
|
||||
- name: timeoutInMinutes
|
||||
type: number
|
||||
# 2 days
|
||||
default: 2880
|
||||
- name: onTimeout
|
||||
type: string
|
||||
default: 'reject'
|
||||
values:
|
||||
- resume
|
||||
- reject
|
||||
- name: dependsOnJob
|
||||
type: string
|
||||
default: ''
|
||||
|
||||
jobs:
|
||||
- job: ${{ parameters.jobName }}
|
||||
dependsOn: ${{ parameters.dependsOnJob }}
|
||||
displayName: ${{ parameters.displayName }}
|
||||
pool: server
|
||||
timeoutInMinutes: 4320 # job times out in 3 days
|
||||
steps:
|
||||
- task: ManualValidation@0
|
||||
displayName: ${{ parameters.displayName }}
|
||||
timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
|
||||
inputs:
|
||||
instructions: ${{ parameters.instructions }}
|
||||
onTimeout: ${{ parameters.onTimeout }}
|
||||
@@ -1,29 +0,0 @@
|
||||
steps:
|
||||
- powershell: |
|
||||
$shouldSign = $true
|
||||
$authenticodeCert = 'CP-230012'
|
||||
$msixCert = 'CP-230012'
|
||||
|
||||
if($env:IS_DAILY -eq 'true')
|
||||
{
|
||||
$authenticodeCert = 'CP-460906'
|
||||
}
|
||||
|
||||
if($env:SKIP_SIGNING -eq 'Yes')
|
||||
{
|
||||
$shouldSign = $false
|
||||
}
|
||||
|
||||
$vstsCommandString = "vso[task.setvariable variable=SHOULD_SIGN]$($shouldSign.ToString().ToLowerInvariant())"
|
||||
Write-Host "sending " + $vstsCommandString
|
||||
Write-Host "##$vstsCommandString"
|
||||
|
||||
$vstsCommandString = "vso[task.setvariable variable=MSIX_CERT]$($msixCert)"
|
||||
Write-Host "sending " + $vstsCommandString
|
||||
Write-Host "##$vstsCommandString"
|
||||
|
||||
$vstsCommandString = "vso[task.setvariable variable=AUTHENTICODE_CERT]$($authenticodeCert)"
|
||||
Write-Host "sending " + $vstsCommandString
|
||||
Write-Host "##$vstsCommandString"
|
||||
|
||||
displayName: 'Set SHOULD_SIGN Variable'
|
||||
@@ -1,328 +0,0 @@
|
||||
steps:
|
||||
- pwsh: |
|
||||
$platform = '$(runtime)' -match '^linux' ? 'linux' : 'windows'
|
||||
$vstsCommandString = "vso[task.setvariable variable=ArtifactPlatform]$platform"
|
||||
Write-Host ("sending " + $vstsCommandString)
|
||||
Write-Host "##$vstsCommandString"
|
||||
displayName: Set artifact platform
|
||||
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
artifactName: '$(unsignedBuildArtifactContainer)'
|
||||
itemPattern: '$(unsignedBuildArtifactName)'
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem "$(Pipeline.Workspace)\*" -Recurse
|
||||
displayName: 'Capture Downloaded Artifacts'
|
||||
# Diagnostics is not critical it passes every time it runs
|
||||
continueOnError: true
|
||||
|
||||
- checkout: self
|
||||
clean: true
|
||||
path: $(repoFolder)
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- template: cloneToOfficialPath.yml
|
||||
|
||||
- pwsh: |
|
||||
$zipFileFilter = '$(unsignedBuildArtifactName)'
|
||||
$zipFileFilter = $zipFileFilter.Replace('**/', '')
|
||||
|
||||
Write-Verbose -Verbose -Message "zipFileFilter = $zipFileFilter"
|
||||
|
||||
Write-Verbose -Verbose -Message "Looking for $(Pipeline.Workspace)\$(unsignedBuildArtifactName)"
|
||||
|
||||
$zipFilePath = Get-ChildItem -Path '$(Pipeline.Workspace)\$(unsignedBuildArtifactName)' -recurse
|
||||
|
||||
if (-not (Test-Path $zipFilePath))
|
||||
{
|
||||
throw "zip file not found: $zipfilePath"
|
||||
}
|
||||
|
||||
if ($zipFilePath.Count -ne 1) {
|
||||
Write-Verbose "zip filename" -verbose
|
||||
$zipFilePath | Out-String | Write-Verbose -Verbose
|
||||
throw 'multiple zip files found when 1 was expected'
|
||||
}
|
||||
|
||||
$expandedFolderName = [System.io.path]::GetFileNameWithoutExtension($zipfilePath)
|
||||
$expandedFolderPath = Join-Path '$(Pipeline.Workspace)' 'expanded' $expandedFolderName
|
||||
|
||||
Write-Verbose -Verbose -Message "Expaning $zipFilePath to $expandedFolderPath"
|
||||
|
||||
New-Item -Path $expandedFolderPath -ItemType Directory
|
||||
Expand-Archive -Path $zipFilePath -DestinationPath $expandedFolderPath
|
||||
|
||||
if (-not (Test-Path $expandedFolderPath\pwsh.exe) ) {
|
||||
throw 'zip did not expand as expected'
|
||||
}
|
||||
else {
|
||||
$vstsCommandString = "vso[task.setvariable variable=BinPath]$expandedFolderPath"
|
||||
Write-Host ("sending " + $vstsCommandString)
|
||||
Write-Host "##$vstsCommandString"
|
||||
}
|
||||
|
||||
displayName: Expand zip packages
|
||||
condition: eq(variables['ArtifactPlatform'], 'windows')
|
||||
|
||||
- pwsh: |
|
||||
$tarPackageName = '$(unsignedBuildArtifactName)'
|
||||
|
||||
Write-Verbose -Verbose -Message "tarPackageName = $tarPackageName"
|
||||
|
||||
$tarPackagePath = Join-Path '$(Pipeline.Workspace)' $tarPackageName
|
||||
|
||||
Write-Verbose -Verbose -Message "Looking for: $tarPackagePath"
|
||||
|
||||
$expandedPathFolderName = $tarPackageName -replace '.tar.gz', ''
|
||||
$expandedFolderPath = Join-Path '$(Pipeline.Workspace)' 'expanded' $expandedPathFolderName
|
||||
|
||||
if (-not (Test-Path $tarPackagePath))
|
||||
{
|
||||
throw "tar file not found: $tarPackagePath"
|
||||
}
|
||||
|
||||
Write-Verbose -Verbose -Message "Expanding $tarPackagePath to $expandedFolderPath"
|
||||
|
||||
New-Item -Path $expandedFolderPath -ItemType Directory
|
||||
tar -xf $tarPackagePath -C $expandedFolderPath
|
||||
|
||||
if (-not (Test-Path $expandedFolderPath/pwsh) ) {
|
||||
throw 'tar.gz did not expand as expected'
|
||||
}
|
||||
else {
|
||||
$vstsCommandString = "vso[task.setvariable variable=BinPath]$expandedFolderPath"
|
||||
Write-Host ("sending " + $vstsCommandString)
|
||||
Write-Host "##$vstsCommandString"
|
||||
}
|
||||
|
||||
Write-Verbose -Verbose "File permisions after expanding"
|
||||
Get-ChildItem -Path "$expandedFolderPath/pwsh" | Select-Object -Property 'unixmode', 'size', 'name'
|
||||
displayName: Expand tar.gz packages
|
||||
condition: eq(variables['ArtifactPlatform'], 'linux')
|
||||
|
||||
- template: insert-nuget-config-azfeed.yml
|
||||
parameters:
|
||||
repoRoot: $(PowerShellRoot)
|
||||
|
||||
- pwsh: |
|
||||
Set-Location $env:POWERSHELLROOT
|
||||
import-module "$env:POWERSHELLROOT/build.psm1"
|
||||
Sync-PSTags -AddRemoteIfMissing
|
||||
displayName: SyncTags
|
||||
condition: and(succeeded(), ne(variables['SkipBuild'], 'true'))
|
||||
|
||||
- checkout: ComplianceRepo
|
||||
clean: true
|
||||
path: $(complianceRepoFolder)
|
||||
|
||||
- template: shouldSign.yml
|
||||
|
||||
- pwsh: |
|
||||
$fullSymbolsFolder = '$(BinPath)'
|
||||
Write-Verbose -Verbose "fullSymbolsFolder == $fullSymbolsFolder"
|
||||
|
||||
Get-ChildItem -Recurse $fullSymbolsFolder | out-string | Write-Verbose -Verbose
|
||||
|
||||
$filesToSignDirectory = "$(System.ArtifactsDirectory)\toBeSigned"
|
||||
|
||||
if ((Test-Path -Path $filesToSignDirectory)) {
|
||||
Remove-Item -Path $filesToSignDirectory -Recurse -Force
|
||||
}
|
||||
|
||||
$null = New-Item -ItemType Directory -Path $filesToSignDirectory -Force
|
||||
|
||||
$signedFilesDirectory = "$(System.ArtifactsDirectory)\signed"
|
||||
|
||||
if ((Test-Path -Path $signedFilesDirectory)) {
|
||||
Remove-Item -Path $signedFilesDirectory -Recurse -Force
|
||||
}
|
||||
|
||||
$null = New-Item -ItemType Directory -Path $signedFilesDirectory -Force
|
||||
|
||||
$itemsToCopyWithRecurse = @(
|
||||
"$($fullSymbolsFolder)\*.ps1"
|
||||
"$($fullSymbolsFolder)\Microsoft.PowerShell*.dll"
|
||||
)
|
||||
|
||||
$itemsToCopy = @{
|
||||
"$($fullSymbolsFolder)\*.ps1" = ""
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Host\Microsoft.PowerShell.Host.psd1" = "Modules\Microsoft.PowerShell.Host"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Management\Microsoft.PowerShell.Management.psd1" = "Modules\Microsoft.PowerShell.Management"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Security\Microsoft.PowerShell.Security.psd1" = "Modules\Microsoft.PowerShell.Security"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Utility\Microsoft.PowerShell.Utility.psd1" = "Modules\Microsoft.PowerShell.Utility"
|
||||
"$($fullSymbolsFolder)\pwsh.dll" = ""
|
||||
"$($fullSymbolsFolder)\System.Management.Automation.dll" = ""
|
||||
}
|
||||
|
||||
## Windows only modules
|
||||
|
||||
if('$(ArtifactPlatform)' -eq 'windows') {
|
||||
$itemsToCopy += @{
|
||||
"$($fullSymbolsFolder)\pwsh.exe" = ""
|
||||
"$($fullSymbolsFolder)\Microsoft.Management.Infrastructure.CimCmdlets.dll" = ""
|
||||
"$($fullSymbolsFolder)\Microsoft.WSMan.*.dll" = ""
|
||||
"$($fullSymbolsFolder)\Modules\CimCmdlets\CimCmdlets.psd1" = "Modules\CimCmdlets"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Diagnostics\Diagnostics.format.ps1xml" = "Modules\Microsoft.PowerShell.Diagnostics"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Diagnostics\Event.format.ps1xml" = "Modules\Microsoft.PowerShell.Diagnostics"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Diagnostics\GetEvent.types.ps1xml" = "Modules\Microsoft.PowerShell.Diagnostics"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Security\Security.types.ps1xml" = "Modules\Microsoft.PowerShell.Security"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Diagnostics\Microsoft.PowerShell.Diagnostics.psd1" = "Modules\Microsoft.PowerShell.Diagnostics"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.WSMan.Management\Microsoft.WSMan.Management.psd1" = "Modules\Microsoft.WSMan.Management"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.WSMan.Management\WSMan.format.ps1xml" = "Modules\Microsoft.WSMan.Management"
|
||||
"$($fullSymbolsFolder)\Modules\PSDiagnostics\PSDiagnostics.ps?1" = "Modules\PSDiagnostics"
|
||||
}
|
||||
}
|
||||
else {
|
||||
$itemsToCopy += @{
|
||||
"$($fullSymbolsFolder)\pwsh" = ""
|
||||
}
|
||||
}
|
||||
|
||||
$itemsToExclude = @(
|
||||
# This package is retrieved from https://www.github.com/powershell/MarkdownRender
|
||||
"$($fullSymbolsFolder)\Microsoft.PowerShell.MarkdownRender.dll"
|
||||
)
|
||||
|
||||
Write-Verbose -verbose "recusively copying $($itemsToCopyWithRecurse | out-string) to $filesToSignDirectory"
|
||||
Copy-Item -Path $itemsToCopyWithRecurse -Destination $filesToSignDirectory -Recurse -verbose -exclude $itemsToExclude
|
||||
|
||||
foreach($pattern in $itemsToCopy.Keys) {
|
||||
$destinationFolder = Join-Path $filesToSignDirectory -ChildPath $itemsToCopy.$pattern
|
||||
$null = New-Item -ItemType Directory -Path $destinationFolder -Force
|
||||
Write-Verbose -verbose "copying $pattern to $destinationFolder"
|
||||
Copy-Item -Path $pattern -Destination $destinationFolder -Recurse -verbose
|
||||
}
|
||||
displayName: 'Prepare files to be signed'
|
||||
|
||||
- template: EsrpSign.yml@ComplianceRepo
|
||||
parameters:
|
||||
buildOutputPath: $(System.ArtifactsDirectory)\toBeSigned
|
||||
signOutputPath: $(System.ArtifactsDirectory)\signed
|
||||
certificateId: "$(AUTHENTICODE_CERT)"
|
||||
pattern: |
|
||||
**\*.dll
|
||||
**\*.psd1
|
||||
**\*.psm1
|
||||
**\*.ps1xml
|
||||
**\*.ps1
|
||||
**\*.exe
|
||||
useMinimatch: true
|
||||
shouldSign: $(SHOULD_SIGN)
|
||||
displayName: Authenticode sign our binaries
|
||||
|
||||
- pwsh: |
|
||||
Import-Module $(PowerShellRoot)/build.psm1 -Force
|
||||
Import-Module $(PowerShellRoot)/tools/packaging -Force
|
||||
$signedFilesPath = '$(System.ArtifactsDirectory)\signed\'
|
||||
$BuildPath = '$(BinPath)'
|
||||
Write-Verbose -Verbose -Message "BuildPath: $BuildPath"
|
||||
|
||||
Update-PSSignedBuildFolder -BuildPath $BuildPath -SignedFilesPath $SignedFilesPath
|
||||
$dlls = Get-ChildItem $BuildPath\*.dll, $BuildPath\*.exe -Recurse
|
||||
$signatures = $dlls | Get-AuthenticodeSignature
|
||||
$missingSignatures = $signatures | Where-Object { $_.status -eq 'notsigned' -or $_.SignerCertificate.Issuer -notmatch '^CN=Microsoft.*'}| select-object -ExpandProperty Path
|
||||
|
||||
Write-Verbose -verbose "to be signed:`r`n $($missingSignatures | Out-String)"
|
||||
|
||||
$filesToSignDirectory = "$(System.ArtifactsDirectory)\thirdPartyToBeSigned"
|
||||
if (Test-Path $filesToSignDirectory) {
|
||||
Remove-Item -Path $filesToSignDirectory -Recurse -Force
|
||||
}
|
||||
|
||||
$null = New-Item -ItemType Directory -Path $filesToSignDirectory -Force -Verbose
|
||||
|
||||
$signedFilesDirectory = "$(System.ArtifactsDirectory)\thirdPartySigned"
|
||||
if (Test-Path $signedFilesDirectory) {
|
||||
Remove-Item -Path $signedFilesDirectory -Recurse -Force
|
||||
}
|
||||
|
||||
$null = New-Item -ItemType Directory -Path $signedFilesDirectory -Force -Verbose
|
||||
|
||||
$missingSignatures | ForEach-Object {
|
||||
$pathWithoutLeaf = Split-Path $_
|
||||
$relativePath = $pathWithoutLeaf.replace($BuildPath,'')
|
||||
Write-Verbose -Verbose -Message "relativePath: $relativePath"
|
||||
$targetDirectory = Join-Path -Path $filesToSignDirectory -ChildPath $relativePath
|
||||
Write-Verbose -Verbose -Message "targetDirectory: $targetDirectory"
|
||||
if(!(Test-Path $targetDirectory))
|
||||
{
|
||||
$null = New-Item -ItemType Directory -Path $targetDirectory -Force -Verbose
|
||||
}
|
||||
Copy-Item -Path $_ -Destination $targetDirectory
|
||||
}
|
||||
|
||||
displayName: Create ThirdParty Signing Folder
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- template: EsrpSign.yml@ComplianceRepo
|
||||
parameters:
|
||||
buildOutputPath: $(System.ArtifactsDirectory)\thirdPartyToBeSigned
|
||||
signOutputPath: $(System.ArtifactsDirectory)\thirdPartySigned
|
||||
certificateId: "CP-231522"
|
||||
pattern: |
|
||||
**\*.dll
|
||||
useMinimatch: true
|
||||
shouldSign: $(SHOULD_SIGN)
|
||||
displayName: Sign ThirdParty binaries
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem '$(System.ArtifactsDirectory)\thirdPartySigned\*'
|
||||
displayName: Capture ThirdParty Signed files
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- pwsh: |
|
||||
Import-Module '$(PowerShellRoot)/build.psm1' -Force
|
||||
Import-Module '$(PowerShellRoot)/tools/packaging' -Force
|
||||
$signedFilesPath = '$(System.ArtifactsDirectory)\thirdPartySigned'
|
||||
$BuildPath = '$(BinPath)'
|
||||
|
||||
Update-PSSignedBuildFolder -BuildPath $BuildPath -SignedFilesPath $SignedFilesPath
|
||||
if ($env:BuildConfiguration -eq 'minSize') {
|
||||
## Remove XML files when making a min-size package.
|
||||
Remove-Item "$BuildPath/*.xml" -Force
|
||||
}
|
||||
displayName: Merge ThirdParty signed files with Build
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- pwsh: |
|
||||
$uploadFolder = '$(BinPath)'
|
||||
$containerName = '$(signedArtifactContainer)'
|
||||
|
||||
Write-Verbose -Verbose "File permissions after signing"
|
||||
Get-ChildItem $uploadFolder\pwsh | Select-Object -Property 'unixmode', 'size', 'name'
|
||||
|
||||
$uploadTarFilePath = Join-Path '$(System.ArtifactsDirectory)' '$(signedBuildArtifactName)'
|
||||
Write-Verbose -Verbose -Message "Creating tar.gz - $uploadTarFilePath"
|
||||
tar -czvf $uploadTarFilePath -C $uploadFolder *
|
||||
|
||||
Get-ChildItem '$(System.ArtifactsDirectory)' | Out-String | Write-Verbose -Verbose
|
||||
|
||||
Write-Host "##vso[artifact.upload containerfolder=$containerName;artifactname=$containerName]$uploadTarFilePath"
|
||||
displayName: Upload signed tar.gz files to artifacts
|
||||
condition: eq(variables['ArtifactPlatform'], 'linux')
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
|
||||
- pwsh: |
|
||||
$uploadFolder = '$(BinPath)'
|
||||
$containerName = '$(signedArtifactContainer)'
|
||||
|
||||
Get-ChildItem $uploadFolder -Recurse | Out-String | Write-Verbose -Verbose
|
||||
|
||||
$uploadZipFilePath = Join-Path '$(System.ArtifactsDirectory)' 'PowerShell-$(Version)$(signedBuildArtifactName)'
|
||||
Write-Verbose -Verbose -Message "Creating zip - $uploadZipFilePath"
|
||||
Compress-Archive -Path $uploadFolder/* -DestinationPath $uploadZipFilePath -Verbose
|
||||
|
||||
Get-ChildItem '$(System.ArtifactsDirectory)' | Out-String | Write-Verbose -Verbose
|
||||
|
||||
Write-Host "##vso[artifact.upload containerfolder=$containerName;artifactname=$containerName]$uploadZipFilePath"
|
||||
displayName: Upload signed zip files to artifacts
|
||||
condition: eq(variables['ArtifactPlatform'], 'windows')
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/step/finalize.yml
|
||||
@@ -1,189 +0,0 @@
|
||||
parameters:
|
||||
binLocation: ''
|
||||
buildPrefixName: ''
|
||||
addWindowsModules: 'false'
|
||||
|
||||
steps:
|
||||
- pwsh: |
|
||||
$fullSymbolsFolder = Join-Path $(System.ArtifactsDirectory) "${{ parameters.binLocation }}"
|
||||
|
||||
Write-Verbose -Verbose "fullSymbolsFolder == $fullSymbolsFolder"
|
||||
|
||||
Get-ChildItem -Recurse $fullSymbolsFolder | out-string | Write-Verbose -Verbose
|
||||
|
||||
$filesToSignDirectory = "$(System.ArtifactsDirectory)\toBeSigned"
|
||||
|
||||
if ((Test-Path -Path $filesToSignDirectory)) {
|
||||
Remove-Item -Path $filesToSignDirectory -Recurse -Force
|
||||
}
|
||||
|
||||
$null = New-Item -ItemType Directory -Path $filesToSignDirectory -Force
|
||||
|
||||
$signedFilesDirectory = "$(System.ArtifactsDirectory)\signed"
|
||||
|
||||
if ((Test-Path -Path $signedFilesDirectory)) {
|
||||
Remove-Item -Path $signedFilesDirectory -Recurse -Force
|
||||
}
|
||||
|
||||
$null = New-Item -ItemType Directory -Path $signedFilesDirectory -Force
|
||||
|
||||
$itemsToCopyWithRecurse = @(
|
||||
"$($fullSymbolsFolder)\*.ps1"
|
||||
"$($fullSymbolsFolder)\Microsoft.PowerShell*.dll"
|
||||
)
|
||||
|
||||
$itemsToCopy = @{
|
||||
"$($fullSymbolsFolder)\*.ps1" = ""
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Host\Microsoft.PowerShell.Host.psd1" = "Modules\Microsoft.PowerShell.Host"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Management\Microsoft.PowerShell.Management.psd1" = "Modules\Microsoft.PowerShell.Management"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Security\Microsoft.PowerShell.Security.psd1" = "Modules\Microsoft.PowerShell.Security"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Utility\Microsoft.PowerShell.Utility.psd1" = "Modules\Microsoft.PowerShell.Utility"
|
||||
"$($fullSymbolsFolder)\pwsh.dll" = ""
|
||||
"$($fullSymbolsFolder)\System.Management.Automation.dll" = ""
|
||||
}
|
||||
|
||||
## Windows only modules
|
||||
|
||||
if('${{ parameters.addWindowsModules }}' -ne 'false') {
|
||||
$itemsToCopy += @{
|
||||
"$($fullSymbolsFolder)\pwsh.exe" = ""
|
||||
"$($fullSymbolsFolder)\Microsoft.Management.Infrastructure.CimCmdlets.dll" = ""
|
||||
"$($fullSymbolsFolder)\Microsoft.WSMan.*.dll" = ""
|
||||
"$($fullSymbolsFolder)\Modules\CimCmdlets\CimCmdlets.psd1" = "Modules\CimCmdlets"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Diagnostics\Diagnostics.format.ps1xml" = "Modules\Microsoft.PowerShell.Diagnostics"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Diagnostics\Event.format.ps1xml" = "Modules\Microsoft.PowerShell.Diagnostics"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Diagnostics\GetEvent.types.ps1xml" = "Modules\Microsoft.PowerShell.Diagnostics"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Security\Security.types.ps1xml" = "Modules\Microsoft.PowerShell.Security"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Diagnostics\Microsoft.PowerShell.Diagnostics.psd1" = "Modules\Microsoft.PowerShell.Diagnostics"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.WSMan.Management\Microsoft.WSMan.Management.psd1" = "Modules\Microsoft.WSMan.Management"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.WSMan.Management\WSMan.format.ps1xml" = "Modules\Microsoft.WSMan.Management"
|
||||
"$($fullSymbolsFolder)\Modules\PSDiagnostics\PSDiagnostics.ps?1" = "Modules\PSDiagnostics"
|
||||
}
|
||||
}
|
||||
else {
|
||||
$itemsToCopy += @{
|
||||
"$($fullSymbolsFolder)\pwsh" = ""
|
||||
}
|
||||
}
|
||||
|
||||
$itemsToExclude = @(
|
||||
# This package is retrieved from https://www.github.com/powershell/MarkdownRender
|
||||
"$($fullSymbolsFolder)\Microsoft.PowerShell.MarkdownRender.dll"
|
||||
)
|
||||
|
||||
Write-Verbose -verbose "recusively copying $($itemsToCopyWithRecurse | out-string) to $filesToSignDirectory"
|
||||
Copy-Item -Path $itemsToCopyWithRecurse -Destination $filesToSignDirectory -Recurse -verbose -exclude $itemsToExclude
|
||||
|
||||
foreach($pattern in $itemsToCopy.Keys) {
|
||||
$destinationFolder = Join-Path $filesToSignDirectory -ChildPath $itemsToCopy.$pattern
|
||||
$null = New-Item -ItemType Directory -Path $destinationFolder -Force
|
||||
Write-Verbose -verbose "copying $pattern to $destinationFolder"
|
||||
Copy-Item -Path $pattern -Destination $destinationFolder -Recurse -verbose
|
||||
}
|
||||
displayName: '${{ parameters.buildPrefixName }} - Prepare files to be signed'
|
||||
|
||||
- template: EsrpSign.yml@ComplianceRepo
|
||||
parameters:
|
||||
buildOutputPath: $(System.ArtifactsDirectory)\toBeSigned
|
||||
signOutputPath: $(System.ArtifactsDirectory)\signed
|
||||
certificateId: "$(AUTHENTICODE_CERT)"
|
||||
pattern: |
|
||||
**\*.dll
|
||||
**\*.psd1
|
||||
**\*.psm1
|
||||
**\*.ps1xml
|
||||
**\*.ps1
|
||||
**\*.exe
|
||||
useMinimatch: true
|
||||
shouldSign: $(SHOULD_SIGN)
|
||||
displayName: ${{ parameters.buildPrefixName }} - Authenticode
|
||||
|
||||
- pwsh: |
|
||||
Import-Module $(PowerShellRoot)/build.psm1 -Force
|
||||
Import-Module $(PowerShellRoot)/tools/packaging -Force
|
||||
$signedFilesPath = '$(System.ArtifactsDirectory)\signed\'
|
||||
$BuildPath = Join-Path $(System.ArtifactsDirectory) '${{ parameters.binLocation }}'
|
||||
Write-Verbose -Verbose -Message "BuildPath: $BuildPath"
|
||||
|
||||
Update-PSSignedBuildFolder -BuildPath $BuildPath -SignedFilesPath $SignedFilesPath
|
||||
$dlls = Get-ChildItem $BuildPath\*.dll, $BuildPath\*.exe -Recurse
|
||||
$signatures = $dlls | Get-AuthenticodeSignature
|
||||
$missingSignatures = $signatures | Where-Object { $_.status -eq 'notsigned' -or $_.SignerCertificate.Issuer -notmatch '^CN=Microsoft.*'}| select-object -ExpandProperty Path
|
||||
|
||||
Write-Verbose -verbose "to be signed:`r`n $($missingSignatures | Out-String)"
|
||||
|
||||
$filesToSignDirectory = "$(System.ArtifactsDirectory)\thirdPartyToBeSigned"
|
||||
if (Test-Path $filesToSignDirectory) {
|
||||
Remove-Item -Path $filesToSignDirectory -Recurse -Force
|
||||
}
|
||||
|
||||
$null = New-Item -ItemType Directory -Path $filesToSignDirectory -Force -Verbose
|
||||
|
||||
$signedFilesDirectory = "$(System.ArtifactsDirectory)\thirdPartySigned"
|
||||
if (Test-Path $signedFilesDirectory) {
|
||||
Remove-Item -Path $signedFilesDirectory -Recurse -Force
|
||||
}
|
||||
|
||||
$null = New-Item -ItemType Directory -Path $signedFilesDirectory -Force -Verbose
|
||||
|
||||
$missingSignatures | ForEach-Object {
|
||||
$pathWithoutLeaf = Split-Path $_
|
||||
$relativePath = $pathWithoutLeaf.replace($BuildPath,'')
|
||||
Write-Verbose -Verbose -Message "relativePath: $relativePath"
|
||||
$targetDirectory = Join-Path -Path $filesToSignDirectory -ChildPath $relativePath
|
||||
Write-Verbose -Verbose -Message "targetDirectory: $targetDirectory"
|
||||
if(!(Test-Path $targetDirectory))
|
||||
{
|
||||
$null = New-Item -ItemType Directory -Path $targetDirectory -Force -Verbose
|
||||
}
|
||||
Copy-Item -Path $_ -Destination $targetDirectory
|
||||
}
|
||||
|
||||
displayName: ${{ parameters.buildPrefixName }} - Create ThirdParty Signing Folder
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- template: EsrpSign.yml@ComplianceRepo
|
||||
parameters:
|
||||
buildOutputPath: $(System.ArtifactsDirectory)\thirdPartyToBeSigned
|
||||
signOutputPath: $(System.ArtifactsDirectory)\thirdPartySigned
|
||||
certificateId: "CP-231522"
|
||||
pattern: |
|
||||
**\*.dll
|
||||
useMinimatch: true
|
||||
shouldSign: $(SHOULD_SIGN)
|
||||
displayName: Sign ThirdParty binaries
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem '$(System.ArtifactsDirectory)\thirdPartySigned\*'
|
||||
displayName: ${{ parameters.buildPrefixName }} - Capture ThirdParty Signed files
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- pwsh: |
|
||||
Import-Module $(PowerShellRoot)/build.psm1 -Force
|
||||
Import-Module $(PowerShellRoot)/tools/packaging -Force
|
||||
$signedFilesPath = '$(System.ArtifactsDirectory)\thirdPartySigned'
|
||||
$BuildPath = Join-Path $(System.ArtifactsDirectory) '${{ parameters.binLocation }}'
|
||||
|
||||
Update-PSSignedBuildFolder -BuildPath $BuildPath -SignedFilesPath $SignedFilesPath
|
||||
if ($env:BuildConfiguration -eq 'minSize') {
|
||||
## Remove XML files when making a min-size package.
|
||||
Remove-Item "$BuildPath/*.xml" -Force
|
||||
}
|
||||
displayName: ${{ parameters.buildPrefixName }} - Merge ThirdParty signed files with Build
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- pwsh: |
|
||||
$uploadFolder = '$(System.ArtifactsDirectory)/${{ parameters.binLocation }}'
|
||||
$containerName = 'authenticode-signed'
|
||||
|
||||
Write-Verbose -Verbose "File permissions after signing"
|
||||
Get-ChildItem $uploadFolder\pwsh | Select-Object -Property 'unixmode', 'size', 'name'
|
||||
|
||||
$uploadTarFilePath = '$(System.ArtifactsDirectory)/${{ parameters.binLocation }}.tar.gz'
|
||||
Write-Verbose -Verbose -Message "Creating tar.gz - $uploadTarFilePath"
|
||||
tar -czvf $uploadTarFilePath -C $uploadFolder *
|
||||
|
||||
Write-Host "##vso[artifact.upload containerfolder=$containerName;artifactname=$containerName]$uploadTarFilePath"
|
||||
displayName: ${{ parameters.buildPrefixName }} - Upload signed files to artifacts
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
steps:
|
||||
- pwsh: |
|
||||
throw "Jobs with an Issue will not work for release. Please fix the issue and try again."
|
||||
displayName: Check for SucceededWithIssues
|
||||
condition: eq(variables['Agent.JobStatus'],'SucceededWithIssues')
|
||||
@@ -1,126 +0,0 @@
|
||||
jobs:
|
||||
- job: build_testartifacts_win
|
||||
variables:
|
||||
- name: runCodesignValidationInjection
|
||||
value: false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
- group: DotNetPrivateBuildAccess
|
||||
displayName: Build windows test artifacts
|
||||
condition: succeeded()
|
||||
pool:
|
||||
name: PowerShell1ES
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/insert-nuget-config-azfeed.yml
|
||||
parameters:
|
||||
repoRoot: $(Build.SourcesDirectory)
|
||||
|
||||
- pwsh: |
|
||||
Import-Module ./build.psm1
|
||||
Start-PSBootstrap
|
||||
displayName: Bootstrap
|
||||
env:
|
||||
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
|
||||
|
||||
- pwsh: |
|
||||
Import-Module ./build.psm1
|
||||
|
||||
function BuildTestPackage([string] $runtime)
|
||||
{
|
||||
Write-Verbose -Verbose "Starting to build package for $runtime"
|
||||
|
||||
New-TestPackage -Destination $(System.ArtifactsDirectory) -Runtime $runtime
|
||||
|
||||
if (-not (Test-Path $(System.ArtifactsDirectory)/TestPackage.zip))
|
||||
{
|
||||
throw "Test Package was not found at: $(System.ArtifactsDirectory)"
|
||||
}
|
||||
|
||||
switch ($runtime)
|
||||
{
|
||||
win7-x64 { $packageName = "TestPackage-win-x64.zip" }
|
||||
win7-x86 { $packageName = "TestPackage-win-x86.zip" }
|
||||
win-arm64 { $packageName = "TestPackage-win-arm64.zip" }
|
||||
}
|
||||
|
||||
Rename-Item $(System.ArtifactsDirectory)/TestPackage.zip $packageName
|
||||
Write-Host "##vso[artifact.upload containerfolder=testArtifacts;artifactname=testArtifacts]$(System.ArtifactsDirectory)/$packageName"
|
||||
}
|
||||
|
||||
BuildTestPackage -runtime win7-x64
|
||||
BuildTestPackage -runtime win7-x86
|
||||
BuildTestPackage -runtime win-arm64
|
||||
|
||||
displayName: Build test package and upload
|
||||
retryCountOnTaskFailure: 1
|
||||
|
||||
- job: build_testartifacts_nonwin
|
||||
variables:
|
||||
- name: runCodesignValidationInjection
|
||||
value: false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
- group: DotNetPrivateBuildAccess
|
||||
displayName: Build non-windows test artifacts
|
||||
condition: succeeded()
|
||||
pool:
|
||||
name: PowerShell1ES
|
||||
demands:
|
||||
- ImageOverride -equals PSMMSUbuntu20.04-Secure
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/insert-nuget-config-azfeed.yml
|
||||
parameters:
|
||||
repoRoot: $(Build.SourcesDirectory)
|
||||
|
||||
- pwsh: |
|
||||
Import-Module ./build.psm1
|
||||
Start-PSBootstrap
|
||||
displayName: Bootstrap
|
||||
env:
|
||||
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
|
||||
|
||||
- pwsh: |
|
||||
Import-Module ./build.psm1
|
||||
|
||||
function BuildTestPackage([string] $runtime)
|
||||
{
|
||||
Write-Verbose -Verbose "Starting to build package for $runtime"
|
||||
|
||||
New-TestPackage -Destination $(System.ArtifactsDirectory) -Runtime $runtime
|
||||
|
||||
if (-not (Test-Path $(System.ArtifactsDirectory)/TestPackage.zip))
|
||||
{
|
||||
throw "Test Package was not found at: $(System.ArtifactsDirectory)"
|
||||
}
|
||||
|
||||
switch ($runtime)
|
||||
{
|
||||
linux-x64 { $packageName = "TestPackage-linux-x64.zip" }
|
||||
linux-arm { $packageName = "TestPackage-linux-arm.zip" }
|
||||
linux-arm64 { $packageName = "TestPackage-linux-arm64.zip" }
|
||||
osx-x64 { $packageName = "TestPackage-macOS.zip" }
|
||||
linux-musl-x64 { $packageName = "TestPackage-alpine-x64.zip"}
|
||||
}
|
||||
|
||||
Rename-Item $(System.ArtifactsDirectory)/TestPackage.zip $packageName
|
||||
Write-Host "##vso[artifact.upload containerfolder=testArtifacts;artifactname=testArtifacts]$(System.ArtifactsDirectory)/$packageName"
|
||||
}
|
||||
|
||||
BuildTestPackage -runtime linux-x64
|
||||
BuildTestPackage -runtime linux-arm
|
||||
BuildTestPackage -runtime linux-arm64
|
||||
BuildTestPackage -runtime osx-x64
|
||||
BuildTestPackage -runtime linux-musl-x64
|
||||
|
||||
displayName: Build test package and upload
|
||||
retryCountOnTaskFailure: 1
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/step/finalize.yml
|
||||
@@ -1,17 +0,0 @@
|
||||
parameters:
|
||||
artifactPath:
|
||||
artifactFilter: '*'
|
||||
condition: succeeded()
|
||||
artifactName: finalResults
|
||||
|
||||
steps:
|
||||
- powershell: |
|
||||
Get-ChildItem -Path '${{ parameters.artifactPath }}' -Recurse -File -filter '${{ parameters.artifactFilter }}' -ErrorAction SilentlyContinue |
|
||||
Select-Object -ExpandProperty FullName |
|
||||
ForEach-Object {
|
||||
Write-Host "##vso[artifact.upload containerfolder=${{ parameters.artifactName }};artifactname=${{ parameters.artifactName }}]$_"
|
||||
}
|
||||
displayName: Upload ${{ parameters.artifactName }} Artifacts ${{ parameters.artifactFilter }} from ${{ parameters.artifactPath }}
|
||||
condition: ${{ parameters.condition }}
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
parameters:
|
||||
architecture: x86
|
||||
version: 6.2.0
|
||||
msi: yes
|
||||
msix: yes
|
||||
pdb: no
|
||||
|
||||
steps:
|
||||
- template: upload-final-results.yml
|
||||
parameters:
|
||||
artifactPath: $(System.ArtifactsDirectory)\signed
|
||||
artifactFilter: PowerShell-${{ parameters.version }}-win-${{ parameters.architecture }}*.zip
|
||||
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'upload signed zip to Azure - ${{ parameters.architecture }}'
|
||||
inputs:
|
||||
SourcePath: '$(System.ArtifactsDirectory)\signed\PowerShell-${{ parameters.version }}-win-${{ parameters.architecture }}.zip'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: '$(AzureVersion)'
|
||||
resourceGroup: '$(StorageResourceGroup)'
|
||||
condition: succeeded()
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'upload signed min-size package (for Guest Config) to Azure - ${{ parameters.architecture }}'
|
||||
inputs:
|
||||
SourcePath: '$(System.ArtifactsDirectory)\signed\PowerShell-${{ parameters.version }}-win-${{ parameters.architecture }}-gc.zip'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: '$(AzureVersion)-gc'
|
||||
resourceGroup: '$(StorageResourceGroup)'
|
||||
condition: and(eq('${{ parameters.architecture }}', 'x64'), succeeded())
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- template: upload-final-results.yml
|
||||
parameters:
|
||||
artifactPath: $(System.ArtifactsDirectory)\signedPackages
|
||||
artifactFilter: PowerShell-${{ parameters.version }}-win-${{ parameters.architecture }}.exe
|
||||
condition: and(succeeded(), eq('${{ parameters.msi }}', 'yes'))
|
||||
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'upload signed exe to Azure - ${{ parameters.architecture }}'
|
||||
inputs:
|
||||
SourcePath: '$(System.ArtifactsDirectory)\signedPackages\PowerShell-${{ parameters.version }}-win-${{ parameters.architecture }}.exe'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: '$(AzureVersion)-private'
|
||||
resourceGroup: '$(StorageResourceGroup)'
|
||||
condition: and(succeeded(), eq('${{ parameters.msi }}', 'yes'))
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
# Disable upload task as the symbols package is not currently used and we want to avoid publishing this in releases
|
||||
#- task: AzureFileCopy@4
|
||||
# displayName: 'upload pbd zip to Azure - ${{ parameters.architecture }}'
|
||||
# inputs:
|
||||
# SourcePath: '$(System.ArtifactsDirectory)\signed\PowerShell-Symbols-${{ parameters.version }}-win-${{ parameters.architecture }}.zip'
|
||||
# azureSubscription: '$(AzureFileCopySubscription)'
|
||||
# Destination: AzureBlob
|
||||
# storage: '$(StorageAccount)'
|
||||
# ContainerName: '$(AzureVersion)'
|
||||
# condition: and(succeeded(), eq('${{ parameters.pdb }}', 'yes'))
|
||||
|
||||
- template: upload-final-results.yml
|
||||
parameters:
|
||||
artifactPath: $(Build.StagingDirectory)\signedPackages
|
||||
artifactFilter: PowerShell-${{ parameters.version }}-win-${{ parameters.architecture }}.msix
|
||||
condition: and(succeeded(), eq('${{ parameters.msix }}', 'yes'))
|
||||
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'upload signed msix to Azure - ${{ parameters.architecture }}'
|
||||
inputs:
|
||||
SourcePath: '$(Build.StagingDirectory)\signedPackages\PowerShell-${{ parameters.version }}-win-${{ parameters.architecture }}.msix'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: '$(AzureVersion)-private'
|
||||
resourceGroup: '$(StorageResourceGroup)'
|
||||
condition: and(succeeded(), eq('${{ parameters.msix }}', 'yes'), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
retryCountOnTaskFailure: 2
|
||||
@@ -1,113 +0,0 @@
|
||||
parameters:
|
||||
architecture: x64
|
||||
|
||||
jobs:
|
||||
- job: vpack_${{ parameters.architecture }}
|
||||
variables:
|
||||
- group: vPack
|
||||
- group: ReleasePipelineSecrets
|
||||
|
||||
displayName: Build and Publish VPack - ${{ parameters.architecture }}
|
||||
condition: succeeded()
|
||||
pool:
|
||||
name: PowerShell1ES
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- task: UseDotNet@2
|
||||
displayName: 'Use .NET Core sdk'
|
||||
inputs:
|
||||
packageType: sdk
|
||||
version: 3.1.x
|
||||
installationPath: $(Agent.ToolsDirectory)/dotnet
|
||||
|
||||
- template: ./SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- pwsh: |
|
||||
Import-module '$(BUILD.SOURCESDIRECTORY)/build.psm1'
|
||||
Install-AzCopy
|
||||
displayName: Install AzCopy
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- pwsh: |
|
||||
Import-module '$(BUILD.SOURCESDIRECTORY)/build.psm1'
|
||||
$azcopy = Find-AzCopy
|
||||
Write-Verbose -Verbose "Found AzCopy: $azcopy"
|
||||
|
||||
Write-Host "running: $azcopy cp https://$(StorageAccount).blob.core.windows.net/$(AzureVersion)/PowerShell-$(Version)-win-${{ parameters.architecture }}.zip $(System.ArtifactsDirectory)"
|
||||
|
||||
& $azcopy cp https://$(StorageAccount).blob.core.windows.net/$(AzureVersion)/PowerShell-$(Version)-win-${{ parameters.architecture }}.zip $(System.ArtifactsDirectory)
|
||||
displayName: 'Download Azure Artifacts'
|
||||
retryCountOnTaskFailure: 2
|
||||
env:
|
||||
AZCOPY_AUTO_LOGIN_TYPE: MSI
|
||||
|
||||
- pwsh: 'Get-ChildItem $(System.ArtifactsDirectory)\* -recurse | Select-Object -ExpandProperty Name'
|
||||
displayName: 'Capture Artifact Listing'
|
||||
|
||||
- pwsh: |
|
||||
$message = @()
|
||||
Get-ChildItem $(System.ArtifactsDirectory)\* -recurse -include *.zip, *.msi | ForEach-Object {
|
||||
if($_.Name -notmatch 'PowerShell-\d+\.\d+\.\d+\-([a-z]*.\d+\-)?win\-(fxdependent|x64|arm64|x86|fxdependentWinDesktop)\.(msi|zip){1}')
|
||||
{
|
||||
$messageInstance = "$($_.Name) is not a valid package name"
|
||||
$message += $messageInstance
|
||||
Write-Warning $messageInstance
|
||||
}
|
||||
}
|
||||
|
||||
if($message.count -gt 0){throw ($message | out-string)}
|
||||
displayName: 'Validate Zip and MSI Package Names'
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem $(System.ArtifactsDirectory)\* -recurse -include *.zip, *.msi | ForEach-Object {
|
||||
if($_.Name -match 'PowerShell-\d+\.\d+\.\d+\-([a-z]*.\d+\-)?win\-(${{ parameters.architecture }})\.(zip){1}')
|
||||
{
|
||||
$destDir = "$(System.ArtifactsDirectory)\vpack${{ parameters.architecture }}"
|
||||
$null = new-item -ItemType Directory -Path $destDir
|
||||
Expand-Archive -Path $_.FullName -DestinationPath $destDir
|
||||
$vstsCommandString = "vso[task.setvariable variable=vpackDir]$destDir"
|
||||
Write-Host "sending " + $vstsCommandString
|
||||
Write-Host "##$vstsCommandString"
|
||||
}
|
||||
}
|
||||
displayName: 'Extract Zip'
|
||||
|
||||
- pwsh: |
|
||||
$vpackVersion = '$(version)'
|
||||
|
||||
if('$(VPackPublishOverride)' -ne '' -and '$(VPackPublishOverride)' -ne 'None' )
|
||||
{
|
||||
Write-Host "Using VPackPublishOverride varabile"
|
||||
$vpackVersion = '$(VPackPublishOverride)'
|
||||
}
|
||||
|
||||
$vstsCommandString = "vso[task.setvariable variable=vpackVersion]$vpackVersion"
|
||||
Write-Host "sending " + $vstsCommandString
|
||||
Write-Host "##$vstsCommandString"
|
||||
displayName: 'Set vpackVersion'
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem -Path env: | Out-String -width 9999 -Stream | write-Verbose -Verbose
|
||||
displayName: Capture Environment
|
||||
condition: succeededOrFailed()
|
||||
|
||||
- task: PkgESVPack@12
|
||||
displayName: 'Package ES - VPack '
|
||||
inputs:
|
||||
sourceDirectory: '$(vpackDir)'
|
||||
description: PowerShell ${{ parameters.architecture }} $(version)
|
||||
pushPkgName: 'PowerShell.${{ parameters.architecture }}'
|
||||
configurations: Release
|
||||
platforms: x64
|
||||
target: '$(System.ArtifactsDirectory)'
|
||||
owner: tplunk
|
||||
provData: true
|
||||
version: '$(vpackVersion)'
|
||||
vpackToken: $(vPackPat)
|
||||
condition: and(succeeded(), eq(variables['Build.Reason'], 'Manual'))
|
||||
@@ -1,71 +0,0 @@
|
||||
|
||||
jobs:
|
||||
- job: ComponentRegistrationJob
|
||||
variables:
|
||||
- name: runCodesignValidationInjection
|
||||
value: false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
displayName: Component Registration
|
||||
condition: succeeded()
|
||||
|
||||
pool:
|
||||
name: PowerShell1ES
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- powershell: |
|
||||
docker container prune --force
|
||||
docker container ls --all --format '{{ json .ID }}' | ConvertFrom-Json | ForEach-Object {docker container rm --force --volumes $_}
|
||||
displayName: 'Remove all containers'
|
||||
# Cleanup is not critical it passes every time it runs
|
||||
continueOnError: true
|
||||
|
||||
- powershell: |
|
||||
docker image ls --format '{{ json .}}'|ConvertFrom-Json| ForEach-Object {
|
||||
if($_.tag -eq '<none>')
|
||||
{
|
||||
$formatString = 'yyyy-MM-dd HH:mm:ss zz00'
|
||||
$createdAtString = $_.CreatedAt.substring(0,$_.CreatedAt.Length -4)
|
||||
$createdAt = [DateTime]::ParseExact($createdAtString, $formatString,[System.Globalization.CultureInfo]::InvariantCulture)
|
||||
if($createdAt -lt (Get-Date).adddays(-1))
|
||||
{
|
||||
docker image rm $_.ID
|
||||
}
|
||||
}
|
||||
}
|
||||
exit 0
|
||||
displayName: 'Remove old images'
|
||||
# Cleanup is not critical it passes every time it runs
|
||||
continueOnError: true
|
||||
|
||||
- powershell: |
|
||||
Write-verbose "--docker info---" -verbose
|
||||
docker info
|
||||
Write-verbose "--docker image ls---" -verbose
|
||||
docker image ls
|
||||
Write-verbose "--docker container ls --all---" -verbose
|
||||
docker container ls --all
|
||||
displayName: 'Capture Docker Info'
|
||||
# Diagnostics is not critical it passes every time it runs
|
||||
continueOnError: true
|
||||
|
||||
- template: insert-nuget-config-azfeed.yml
|
||||
|
||||
- powershell: |
|
||||
./tools/releaseBuild/vstsbuild.ps1 -ReleaseTag $(ReleaseTagVar) -Name win-x64-component-registration
|
||||
displayName: 'Build Windows Universal - Component Registration'
|
||||
|
||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||
displayName: 'Component Detection'
|
||||
inputs:
|
||||
sourceScanPath: '$(componentregistration)'
|
||||
snapshotForceEnabled: true
|
||||
@@ -1,84 +0,0 @@
|
||||
parameters:
|
||||
- name: BuildConfiguration
|
||||
default: release
|
||||
- name: BuildPlatform
|
||||
default: any cpu
|
||||
- name: Architecture
|
||||
default: x64
|
||||
- name: parentJob
|
||||
default: ''
|
||||
|
||||
jobs:
|
||||
- job: build_windows_${{ parameters.Architecture }}_${{ parameters.BuildConfiguration }}
|
||||
displayName: Build Windows - ${{ parameters.Architecture }} ${{ parameters.BuildConfiguration }}
|
||||
condition: succeeded()
|
||||
dependsOn: ${{ parameters.parentJob }}
|
||||
pool:
|
||||
name: $(windowsPool)
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
variables:
|
||||
- name: runCodesignValidationInjection
|
||||
value: false
|
||||
- name: NugetSecurityAnalysisWarningLevel
|
||||
value: none
|
||||
- name: BuildConfiguration
|
||||
value: ${{ parameters.BuildConfiguration }}
|
||||
- name: BuildPlatform
|
||||
value: ${{ parameters.BuildPlatform }}
|
||||
- name: Architecture
|
||||
value: ${{ parameters.Architecture }}
|
||||
- name: DOTNET_SKIP_FIRST_TIME_EXPERIENCE
|
||||
value: 1
|
||||
- group: DotNetPrivateBuildAccess
|
||||
|
||||
steps:
|
||||
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- template: cloneToOfficialPath.yml
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/insert-nuget-config-azfeed.yml
|
||||
parameters:
|
||||
repoRoot: $(PowerShellRoot)
|
||||
|
||||
- pwsh: |
|
||||
|
||||
$runtime = switch ($env:Architecture)
|
||||
{
|
||||
"x64" { "win7-x64" }
|
||||
"x86" { "win7-x86" }
|
||||
"arm64" { "win-arm64" }
|
||||
"fxdependent" { "fxdependent" }
|
||||
"fxdependentWinDesktop" { "fxdependent-win-desktop" }
|
||||
}
|
||||
|
||||
$params = @{}
|
||||
if ($env:BuildConfiguration -eq 'minSize') {
|
||||
$params['ForMinimalSize'] = $true
|
||||
}
|
||||
|
||||
tools/releaseBuild/Images/microsoft_powershell_windowsservercore/PowerShellPackage.ps1 -location '$(PowerShellRoot)' -destination '$(Build.ArtifactStagingDirectory)/Symbols_$(Architecture)' -Runtime $runtime -ReleaseTag '$(ReleaseTagVar)' -Symbols @params
|
||||
displayName: 'Build Windows Universal - $(Architecture)-$(BuildConfiguration) Symbols zip'
|
||||
env:
|
||||
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
|
||||
|
||||
- pwsh: |
|
||||
$packageName = (Get-ChildItem '$(Build.ArtifactStagingDirectory)\Symbols_$(Architecture)').FullName
|
||||
$vstsCommandString = "vso[artifact.upload containerfolder=results;artifactname=results]$packageName"
|
||||
Write-Host ("sending " + $vstsCommandString)
|
||||
Write-Host "##$vstsCommandString"
|
||||
displayName: Upload symbols package
|
||||
|
||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||
displayName: 'Component Detection'
|
||||
inputs:
|
||||
sourceScanPath: '$(PowerShellRoot)\tools'
|
||||
snapshotForceEnabled: true
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/step/finalize.yml
|
||||
@@ -1,132 +0,0 @@
|
||||
parameters:
|
||||
parentJobs: []
|
||||
|
||||
jobs:
|
||||
- job: WinPackageSigningJob
|
||||
displayName: Windows Package signing and upload
|
||||
dependsOn:
|
||||
${{ parameters.parentJobs }}
|
||||
condition: succeeded()
|
||||
pool:
|
||||
name: $(windowsPool)
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
variables:
|
||||
- name: DOTNET_SKIP_FIRST_TIME_EXPERIENCE
|
||||
value: 1
|
||||
- group: ESRP
|
||||
- name: repoFolder
|
||||
value: PowerShell
|
||||
- name: repoRoot
|
||||
value: $(Agent.BuildDirectory)\$(repoFolder)
|
||||
- name: complianceRepoFolder
|
||||
value: compliance
|
||||
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
path: $(repoFolder)
|
||||
|
||||
- checkout: ComplianceRepo
|
||||
clean: true
|
||||
path: $(complianceRepoFolder)
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- template: shouldSign.yml
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: 'Download artifacts'
|
||||
inputs:
|
||||
buildType: current
|
||||
downloadType: single
|
||||
artifactName: signed
|
||||
downloadPath: '$(System.ArtifactsDirectory)'
|
||||
|
||||
- powershell: |
|
||||
dir "$(System.ArtifactsDirectory)\*" -Recurse
|
||||
displayName: 'Capture Downloaded Artifacts'
|
||||
# Diagnostics is not critical it passes every time it runs
|
||||
continueOnError: true
|
||||
|
||||
- template: EsrpSign.yml@ComplianceRepo
|
||||
parameters:
|
||||
buildOutputPath: $(System.ArtifactsDirectory)\signed
|
||||
signOutputPath: $(Build.StagingDirectory)\signedPackages
|
||||
certificateId: $(MSIX_CERT)
|
||||
pattern: |
|
||||
**\*.msix
|
||||
useMinimatch: true
|
||||
shouldSign: $(SHOULD_SIGN)
|
||||
displayName: Sign msix
|
||||
|
||||
- template: EsrpSign.yml@ComplianceRepo
|
||||
parameters:
|
||||
buildOutputPath: $(System.ArtifactsDirectory)\signed
|
||||
signOutputPath: $(Build.StagingDirectory)\signedPackages
|
||||
certificateId: $(AUTHENTICODE_CERT)
|
||||
pattern: |
|
||||
**\*.exe
|
||||
useMinimatch: true
|
||||
shouldSign: $(SHOULD_SIGN)
|
||||
displayName: Sign exe
|
||||
|
||||
- powershell: |
|
||||
new-item -itemtype Directory -path '$(Build.StagingDirectory)\signedPackages'
|
||||
Get-ChildItem "$(System.ArtifactsDirectory)\signed\PowerShell-$(Version)-win-*.msi*" | copy-item -Destination '$(Build.StagingDirectory)\signedPackages'
|
||||
displayName: 'Fake msi* Signing'
|
||||
condition: and(succeeded(), ne(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem "$(System.ArtifactsDirectory)\signed\PowerShell-$(Version)-win-*.exe" | copy-item -Destination '$(Build.StagingDirectory)\signedPackages'
|
||||
displayName: 'Fake exe Signing'
|
||||
condition: and(succeeded(), ne(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- template: upload.yml
|
||||
parameters:
|
||||
architecture: x86
|
||||
version: $(version)
|
||||
|
||||
- template: upload.yml
|
||||
parameters:
|
||||
architecture: x64
|
||||
version: $(version)
|
||||
pdb: yes
|
||||
|
||||
- template: upload.yml
|
||||
parameters:
|
||||
architecture: arm64
|
||||
version: $(version)
|
||||
msi: yes
|
||||
|
||||
- template: upload.yml
|
||||
parameters:
|
||||
architecture: fxdependent
|
||||
version: $(version)
|
||||
msi: no
|
||||
msix: no
|
||||
|
||||
- template: upload.yml
|
||||
parameters:
|
||||
architecture: fxdependentWinDesktop
|
||||
version: $(version)
|
||||
msi: no
|
||||
msix: no
|
||||
|
||||
- template: EsrpScan.yml@ComplianceRepo
|
||||
parameters:
|
||||
scanPath: $(Build.StagingDirectory)
|
||||
pattern: |
|
||||
**\*.msix
|
||||
**\*.msi
|
||||
**\*.zip
|
||||
|
||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||
displayName: 'Component Detection'
|
||||
inputs:
|
||||
sourceScanPath: '$(repoRoot)\tools'
|
||||
snapshotForceEnabled: true
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/step/finalize.yml
|
||||
@@ -1,369 +0,0 @@
|
||||
parameters:
|
||||
- name: BuildConfiguration
|
||||
default: release
|
||||
- name: BuildPlatform
|
||||
default: any cpu
|
||||
- name: Architecture
|
||||
default: x64
|
||||
- name: parentJob
|
||||
default: ''
|
||||
|
||||
jobs:
|
||||
- job: sign_windows_${{ parameters.Architecture }}_${{ parameters.BuildConfiguration }}
|
||||
displayName: Package Windows - ${{ parameters.Architecture }} ${{ parameters.BuildConfiguration }}
|
||||
condition: succeeded()
|
||||
pool:
|
||||
name: $(windowsPool)
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
variables:
|
||||
- name: BuildConfiguration
|
||||
value: ${{ parameters.BuildConfiguration }}
|
||||
- name: BuildPlatform
|
||||
value: ${{ parameters.BuildPlatform }}
|
||||
- name: Architecture
|
||||
value: ${{ parameters.Architecture }}
|
||||
- name: DOTNET_SKIP_FIRST_TIME_EXPERIENCE
|
||||
value: 1
|
||||
- group: ESRP
|
||||
- group: DotNetPrivateBuildAccess
|
||||
|
||||
steps:
|
||||
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- checkout: ComplianceRepo
|
||||
clean: true
|
||||
|
||||
- template: SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
|
||||
- template: shouldSign.yml
|
||||
|
||||
- pwsh: |
|
||||
$pkgFilter = '$(Architecture)'
|
||||
if ($env:BuildConfiguration -eq 'minSize') { $pkgFilter += '-gc' }
|
||||
|
||||
$vstsCommandString = "vso[task.setvariable variable=PkgFilter]$pkgFilter"
|
||||
Write-Host ("sending " + $vstsCommandString)
|
||||
Write-Host "##$vstsCommandString"
|
||||
displayName: Set packageName variable
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
inputs:
|
||||
artifactName: 'results'
|
||||
itemPattern: '**/*$(PkgFilter).zip'
|
||||
downloadPath: '$(System.ArtifactsDirectory)\Symbols'
|
||||
|
||||
- template: cloneToOfficialPath.yml
|
||||
|
||||
- pwsh: |
|
||||
$zipPathString = '$(System.ArtifactsDirectory)\Symbols\results\*$(PkgFilter).zip'
|
||||
Write-Verbose -Verbose "Zip Path: $zipPathString"
|
||||
$zipPath = Get-Item $zipPathString
|
||||
if(@($zipPath).Count -eq 0) {
|
||||
throw "No files found at '$zipPathString'"
|
||||
}
|
||||
elseif(@($zipPath).Count -ne 1) {
|
||||
$names = $zipPath.Name -join "', '"
|
||||
throw "multiple files '${names}' found with '${zipPathString}'"
|
||||
}
|
||||
|
||||
$expandedFolder = $zipPath.BaseName
|
||||
Write-Host "sending.. vso[task.setvariable variable=SymbolsFolder]$expandedFolder"
|
||||
Write-Host "##vso[task.setvariable variable=SymbolsFolder]$expandedFolder"
|
||||
|
||||
Expand-Archive -Path $zipPath -Destination "$(System.ArtifactsDirectory)\$expandedFolder" -Force
|
||||
displayName: Expand symbols zip
|
||||
|
||||
- pwsh: |
|
||||
$fullSymbolsFolder = "$(System.ArtifactsDirectory)\$($env:SYMBOLSFOLDER)"
|
||||
|
||||
$filesToSignDirectory = "$(System.ArtifactsDirectory)\toBeSigned"
|
||||
$null = New-Item -ItemType Directory -Path $filesToSignDirectory -Force
|
||||
|
||||
$signedFilesDirectory = "$(System.ArtifactsDirectory)\signed"
|
||||
$null = New-Item -ItemType Directory -Path $signedFilesDirectory -Force
|
||||
|
||||
$itemsToCopyWithRecurse = @(
|
||||
"$($fullSymbolsFolder)\*.ps1"
|
||||
"$($fullSymbolsFolder)\Microsoft.PowerShell*.dll"
|
||||
)
|
||||
|
||||
$itemsToCopy = @{
|
||||
"$($fullSymbolsFolder)\*.ps1" = ""
|
||||
"$($fullSymbolsFolder)\Microsoft.Management.Infrastructure.CimCmdlets.dll" = ""
|
||||
"$($fullSymbolsFolder)\Microsoft.WSMan.*.dll" = ""
|
||||
"$($fullSymbolsFolder)\Modules\CimCmdlets\CimCmdlets.psd1" = "Modules\CimCmdlets"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Diagnostics\Diagnostics.format.ps1xml" = "Modules\Microsoft.PowerShell.Diagnostics"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Diagnostics\Event.format.ps1xml" = "Modules\Microsoft.PowerShell.Diagnostics"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Diagnostics\GetEvent.types.ps1xml" = "Modules\Microsoft.PowerShell.Diagnostics"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Diagnostics\Microsoft.PowerShell.Diagnostics.psd1" = "Modules\Microsoft.PowerShell.Diagnostics"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Host\Microsoft.PowerShell.Host.psd1" = "Modules\Microsoft.PowerShell.Host"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Management\Microsoft.PowerShell.Management.psd1" = "Modules\Microsoft.PowerShell.Management"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Security\Microsoft.PowerShell.Security.psd1" = "Modules\Microsoft.PowerShell.Security"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Security\Security.types.ps1xml" = "Modules\Microsoft.PowerShell.Security"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.PowerShell.Utility\Microsoft.PowerShell.Utility.psd1" = "Modules\Microsoft.PowerShell.Utility"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.WSMan.Management\Microsoft.WSMan.Management.psd1" = "Modules\Microsoft.WSMan.Management"
|
||||
"$($fullSymbolsFolder)\Modules\Microsoft.WSMan.Management\WSMan.format.ps1xml" = "Modules\Microsoft.WSMan.Management"
|
||||
"$($fullSymbolsFolder)\Modules\PSDiagnostics\PSDiagnostics.ps?1" = "Modules\PSDiagnostics"
|
||||
"$($fullSymbolsFolder)\pwsh.dll" = ""
|
||||
"$($fullSymbolsFolder)\System.Management.Automation.dll" = ""
|
||||
"$($fullSymbolsFolder)\pwsh.exe" = ""
|
||||
}
|
||||
|
||||
$itemsToExclude = @(
|
||||
# This package is retrieved from https://www.github.com/powershell/MarkdownRender
|
||||
"$($fullSymbolsFolder)\Microsoft.PowerShell.MarkdownRender.dll"
|
||||
)
|
||||
|
||||
Write-Verbose -verbose "recusively copying $($itemsToCopyWithRecurse | out-string) to $filesToSignDirectory"
|
||||
Copy-Item -Path $itemsToCopyWithRecurse -Destination $filesToSignDirectory -Recurse -verbose -exclude $itemsToExclude
|
||||
|
||||
foreach($pattern in $itemsToCopy.Keys) {
|
||||
$destinationFolder = Join-Path $filesToSignDirectory -ChildPath $itemsToCopy.$pattern
|
||||
$null = New-Item -ItemType Directory -Path $destinationFolder -Force
|
||||
Write-Verbose -verbose "copying $pattern to $destinationFolder"
|
||||
Copy-Item -Path $pattern -Destination $destinationFolder -Recurse -verbose
|
||||
}
|
||||
displayName: 'Prepare files to be signed'
|
||||
|
||||
- template: EsrpSign.yml@ComplianceRepo
|
||||
parameters:
|
||||
buildOutputPath: $(System.ArtifactsDirectory)\toBeSigned
|
||||
signOutputPath: $(System.ArtifactsDirectory)\signed
|
||||
certificateId: "$(AUTHENTICODE_CERT)"
|
||||
pattern: |
|
||||
**\*.dll
|
||||
**\*.psd1
|
||||
**\*.psm1
|
||||
**\*.ps1xml
|
||||
**\*.ps1
|
||||
**\*.exe
|
||||
useMinimatch: true
|
||||
shouldSign: $(SHOULD_SIGN)
|
||||
displayName: Sign our binaries
|
||||
|
||||
- pwsh: |
|
||||
Import-Module $(PowerShellRoot)/build.psm1 -Force
|
||||
Import-Module $(PowerShellRoot)/tools/packaging -Force
|
||||
$signedFilesPath = '$(System.ArtifactsDirectory)\signed\'
|
||||
$BuildPath = '$(System.ArtifactsDirectory)\$(SymbolsFolder)'
|
||||
|
||||
Update-PSSignedBuildFolder -BuildPath $BuildPath -SignedFilesPath $SignedFilesPath
|
||||
$dlls = Get-ChildItem $BuildPath\*.dll, $BuildPath\*.exe -Recurse
|
||||
$signatures = $dlls | Get-AuthenticodeSignature
|
||||
$missingSignatures = $signatures | Where-Object { $_.status -eq 'notsigned' -or $_.SignerCertificate.Issuer -notmatch '^CN=Microsoft.*'}| select-object -ExpandProperty Path
|
||||
|
||||
Write-Verbose -verbose "to be signed:`r`n $($missingSignatures | Out-String)"
|
||||
|
||||
$filesToSignDirectory = "$(System.ArtifactsDirectory)\thirdPartyToBeSigned"
|
||||
$null = New-Item -ItemType Directory -Path $filesToSignDirectory -Force
|
||||
|
||||
$signedFilesDirectory = "$(System.ArtifactsDirectory)\thirdPartySigned"
|
||||
$null = New-Item -ItemType Directory -Path $signedFilesDirectory -Force
|
||||
|
||||
$missingSignatures | ForEach-Object {
|
||||
$pathWithoutLeaf = Split-Path $_
|
||||
$relativePath = $pathWithoutLeaf.replace($BuildPath,'')
|
||||
$targetDirectory = Join-Path -Path $filesToSignDirectory -ChildPath $relativePath
|
||||
if(!(Test-Path $targetDirectory))
|
||||
{
|
||||
$null = New-Item -ItemType Directory -Path $targetDirectory -Force
|
||||
}
|
||||
Copy-Item -Path $_ -Destination $targetDirectory
|
||||
}
|
||||
|
||||
displayName: Create ThirdParty Signing Folder
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- template: EsrpSign.yml@ComplianceRepo
|
||||
parameters:
|
||||
buildOutputPath: $(System.ArtifactsDirectory)\thirdPartyToBeSigned
|
||||
signOutputPath: $(System.ArtifactsDirectory)\thirdPartySigned
|
||||
certificateId: "CP-231522"
|
||||
pattern: |
|
||||
**\*.dll
|
||||
useMinimatch: true
|
||||
shouldSign: $(SHOULD_SIGN)
|
||||
displayName: Sign ThirdParty binaries
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem '$(System.ArtifactsDirectory)\thirdPartySigned\*'
|
||||
displayName: Capture ThirdParty Signed files
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- pwsh: |
|
||||
Import-Module $(PowerShellRoot)/build.psm1 -Force
|
||||
Import-Module $(PowerShellRoot)/tools/packaging -Force
|
||||
$signedFilesPath = '$(System.ArtifactsDirectory)\thirdPartySigned'
|
||||
$BuildPath = '$(System.ArtifactsDirectory)\$(SymbolsFolder)'
|
||||
|
||||
Update-PSSignedBuildFolder -BuildPath $BuildPath -SignedFilesPath $SignedFilesPath
|
||||
if ($env:BuildConfiguration -eq 'minSize') {
|
||||
## Remove XML files when making a min-size package.
|
||||
Remove-Item "$BuildPath/*.xml" -Force
|
||||
}
|
||||
displayName: Merge ThirdParty signed files with Build
|
||||
condition: and(succeeded(), eq(variables['SHOULD_SIGN'], 'true'))
|
||||
|
||||
- template: Sbom.yml@ComplianceRepo
|
||||
parameters:
|
||||
BuildDropPath: '$(System.ArtifactsDirectory)\$(SymbolsFolder)'
|
||||
Build_Repository_Uri: $(Github_Build_Repository_Uri)
|
||||
PackageName: PowerShell Windows ${{ parameters.Architecture }} ${{ parameters.BuildConfiguration }}
|
||||
PackageVersion: $(Version)
|
||||
sourceScanPath: '$(PowerShellRoot)\tools'
|
||||
|
||||
- pwsh: |
|
||||
Import-Module $(PowerShellRoot)/build.psm1 -Force
|
||||
Import-Module $(PowerShellRoot)/tools/packaging -Force
|
||||
|
||||
$destFolder = '$(System.ArtifactsDirectory)\signedZip'
|
||||
$BuildPath = '$(System.ArtifactsDirectory)\$(SymbolsFolder)'
|
||||
|
||||
New-Item -ItemType Directory -Path $destFolder -Force
|
||||
|
||||
$BuildPackagePath = New-PSBuildZip -BuildPath $BuildPath -DestinationFolder $destFolder
|
||||
|
||||
Write-Verbose -Verbose "New-PSSignedBuildZip returned `$BuildPackagePath as: $BuildPackagePath"
|
||||
Write-Host "##vso[artifact.upload containerfolder=results;artifactname=results]$BuildPackagePath"
|
||||
|
||||
$vstsCommandString = "vso[task.setvariable variable=BuildPackagePath]$BuildPackagePath"
|
||||
Write-Host ("sending " + $vstsCommandString)
|
||||
Write-Host "##$vstsCommandString"
|
||||
displayName: Compress signed files
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
|
||||
- pwsh: |
|
||||
$runtime = switch ($env:Architecture)
|
||||
{
|
||||
"x64" { "win7-x64" }
|
||||
"x86" { "win7-x86" }
|
||||
"arm64" { "win-arm64" }
|
||||
"fxdependent" { "fxdependent" }
|
||||
"fxdependentWinDesktop" { "fxdependent-win-desktop" }
|
||||
}
|
||||
|
||||
$signedPkg = "$(BuildPackagePath)"
|
||||
Write-Verbose -Verbose -Message "signedPkg = $signedPkg"
|
||||
|
||||
$params = @{}
|
||||
if ($env:BuildConfiguration -eq 'minSize') {
|
||||
$params['ForMinimalSize'] = $true
|
||||
}
|
||||
|
||||
$(PowerShellRoot)/tools/releaseBuild/Images/microsoft_powershell_windowsservercore/PowerShellPackage.ps1 -BuildZip $signedPkg -location '$(PowerShellRoot)' -destination '$(System.ArtifactsDirectory)\pkgSigned' -Runtime $runtime -ReleaseTag '$(ReleaseTagVar)' @params
|
||||
displayName: 'Build Windows Universal - $(Architecture) Package'
|
||||
env:
|
||||
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem '$(System.ArtifactsDirectory)\pkgSigned' | ForEach-Object {
|
||||
$packagePath = $_.FullName
|
||||
Write-Host "Uploading $packagePath"
|
||||
Write-Host "##vso[artifact.upload containerfolder=signed;artifactname=signed]$packagePath"
|
||||
}
|
||||
displayName: Upload unsigned packages
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- ${{ if and(ne(variables['BuildConfiguration'],'minSize'), in(variables['Architecture'], 'x64', 'x86', 'arm64')) }}:
|
||||
- template: EsrpSign.yml@ComplianceRepo
|
||||
parameters:
|
||||
buildOutputPath: $(System.ArtifactsDirectory)\pkgSigned
|
||||
signOutputPath: $(Build.StagingDirectory)\signedPackages
|
||||
certificateId: "$(AUTHENTICODE_CERT)"
|
||||
pattern: |
|
||||
**\*.msi
|
||||
useMinimatch: true
|
||||
shouldSign: $(SHOULD_SIGN)
|
||||
displayName: Sign MSI
|
||||
alwaysCopy: true
|
||||
|
||||
- pwsh: |
|
||||
Get-ChildItem '$(System.ArtifactsDirectory)\signedPackages' | ForEach-Object {
|
||||
$packagePath = $_.FullName
|
||||
Write-Host "Uploading $packagePath"
|
||||
Write-Host "##vso[artifact.upload containerfolder=finalResults;artifactname=finalResults]$packagePath"
|
||||
}
|
||||
displayName: Upload signed MSI to finalResults
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- task: AzureFileCopy@4
|
||||
displayName: 'upload signed msi to Azure - ${{ parameters.architecture }}'
|
||||
inputs:
|
||||
SourcePath: '$(Build.StagingDirectory)\signedPackages\PowerShell-$(version)-win-${{ parameters.architecture }}.msi'
|
||||
azureSubscription: '$(AzureFileCopySubscription)'
|
||||
Destination: AzureBlob
|
||||
storage: '$(StorageAccount)'
|
||||
ContainerName: '$(AzureVersion)'
|
||||
resourceGroup: '$(StorageResourceGroup)'
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- pwsh: |
|
||||
cd $(PowerShellRoot)
|
||||
Import-Module $(PowerShellRoot)/build.psm1 -Force
|
||||
Import-Module $(PowerShellRoot)/tools/packaging -Force
|
||||
|
||||
$msiPath = '$(Build.StagingDirectory)\signedPackages\PowerShell-$(version)-win-${{ parameters.architecture }}.msi'
|
||||
|
||||
New-ExePackage -ProductVersion '$(version)' -MsiLocationPath $msiPath -ProductTargetArchitecture ${{ parameters.architecture }}
|
||||
$exePath = Get-ChildItem '.\PowerShell-*.exe' | Select-Object -First 1 -ExpandProperty fullname
|
||||
$enginePath = Join-Path -Path '$(System.ArtifactsDirectory)\unsignedEngine' -ChildPath engine.exe
|
||||
# Expand Burn Engine so we can sign it.
|
||||
Expand-ExePackageEngine -ExePath $exePath -EnginePath $enginePath
|
||||
displayName: Create exe wrapper
|
||||
|
||||
- template: EsrpSign.yml@ComplianceRepo
|
||||
parameters:
|
||||
buildOutputPath: $(System.ArtifactsDirectory)\unsignedEngine
|
||||
signOutputPath: $(System.ArtifactsDirectory)\signedEngine
|
||||
certificateId: "$(AUTHENTICODE_CERT)"
|
||||
pattern: |
|
||||
**\*.exe
|
||||
useMinimatch: true
|
||||
shouldSign: $(SHOULD_SIGN)
|
||||
displayName: Sign Burn Engine
|
||||
alwaysCopy: true
|
||||
|
||||
- pwsh: |
|
||||
cd '$(PowerShellRoot)'
|
||||
Import-Module '$(PowerShellRoot)/build.psm1' -Force
|
||||
Import-Module '$(PowerShellRoot)/tools/packaging' -Force
|
||||
|
||||
$exePath = Get-ChildItem '.\PowerShell-*.exe' | Select-Object -First 1 -ExpandProperty fullname
|
||||
$enginePath = Join-Path -Path '$(System.ArtifactsDirectory)\signedEngine' -ChildPath engine.exe
|
||||
$enginePath | Get-AuthenticodeSignature | out-string | Write-Verbose -verbose
|
||||
Compress-ExePackageEngine -ExePath $exePath -EnginePath $enginePath
|
||||
displayName: Re-attach the signed Burn engine in exe wrapper
|
||||
|
||||
- pwsh: |
|
||||
cd '$(PowerShellRoot)'
|
||||
Get-ChildItem '.\PowerShell-*.exe' | ForEach-Object {
|
||||
$packagePath = $_.FullName
|
||||
Write-Host "Uploading $packagePath"
|
||||
Write-Host "##vso[artifact.upload containerfolder=signed;artifactname=signed]$packagePath"
|
||||
}
|
||||
displayName: Upload unsigned exe
|
||||
retryCountOnTaskFailure: 2
|
||||
|
||||
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||
displayName: 'Component Detection'
|
||||
inputs:
|
||||
sourceScanPath: '$(PowerShellRoot)\tools'
|
||||
snapshotForceEnabled: true
|
||||
|
||||
- pwsh: |
|
||||
if ((Test-Path "\PowerShell")) {
|
||||
Remove-Item -Path "\PowerShell" -Force -Recurse -Verbose
|
||||
}
|
||||
else {
|
||||
Write-Verbose -Verbose -Message "No cleanup required."
|
||||
}
|
||||
displayName: Clean up local Clone
|
||||
condition: always()
|
||||
|
||||
- template: /tools/releaseBuild/azureDevOps/templates/step/finalize.yml
|
||||
@@ -1,72 +0,0 @@
|
||||
name: vpack-$(Build.BuildId)
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- release*
|
||||
pr:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
- release*
|
||||
|
||||
variables:
|
||||
- name: DOTNET_CLI_TELEMETRY_OPTOUT
|
||||
value: 1
|
||||
- name: POWERSHELL_TELEMETRY_OPTOUT
|
||||
value: 1
|
||||
- name: nugetMultiFeedWarnLevel
|
||||
value: none
|
||||
|
||||
- group: Azure Blob variable group
|
||||
# adds the pat to publish the vPack
|
||||
# instructions to create are in the description of the library
|
||||
- group: vPack
|
||||
|
||||
stages:
|
||||
- stage: prep
|
||||
displayName: Create buildInfo and name the Pipeline
|
||||
jobs:
|
||||
- job: rename
|
||||
displayName: Name the build
|
||||
condition: succeeded()
|
||||
|
||||
pool:
|
||||
name: PowerShell1ES
|
||||
demands:
|
||||
- ImageOverride -equals PSMMS2019-Secure
|
||||
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
|
||||
- template: ./templates/SetVersionVariables.yml
|
||||
parameters:
|
||||
ReleaseTagVar: $(ReleaseTagVar)
|
||||
CreateJson: yes
|
||||
UseJson: no
|
||||
|
||||
- powershell: |
|
||||
if($env:RELEASETAGVAR -match '-') {
|
||||
throw "Don't release a preview build without coordinating with Windows Engineering Build Tools Team"
|
||||
}
|
||||
displayName: Stop any preview release
|
||||
|
||||
- powershell: Write-Host "##vso[build.updatebuildnumber]$env:BUILD_SOURCEBRANCHNAME-$env:BUILD_SOURCEVERSION-$((get-date).ToString("yyyyMMddhhss"))"
|
||||
displayName: Set Build Name for Non-PR
|
||||
condition: ne(variables['Build.Reason'], 'PullRequest')
|
||||
|
||||
- stage: release
|
||||
displayName: Release
|
||||
jobs:
|
||||
- template: ./templates/vpackReleaseJob.yml
|
||||
parameters:
|
||||
architecture: x64
|
||||
|
||||
- template: ./templates/vpackReleaseJob.yml
|
||||
parameters:
|
||||
architecture: x86
|
||||
|
||||
- template: ./templates/vpackReleaseJob.yml
|
||||
parameters:
|
||||
architecture: arm64
|
||||
@@ -1,336 +0,0 @@
|
||||
{
|
||||
"Windows": [
|
||||
{
|
||||
"Name": "win7-x64",
|
||||
"RepoDestinationPath": "C:\\PowerShell",
|
||||
"BuildCommand": "C:\\PowerShellPackage.ps1 -location _RepoDestinationPath_ -destination _DockerVolume_ -Runtime win7-x64 -ReleaseTag _ReleaseTag_",
|
||||
"BuildDockerOptions": [
|
||||
"-m",
|
||||
"3968m"
|
||||
],
|
||||
"DockerFile": ".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\DockerFile",
|
||||
"AdditionalContextFiles" :[
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\PowerShellPackage.ps1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\wix.psm1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\dockerInstall.psm1"
|
||||
],
|
||||
"DockerImageName": "ps-winsrvcore",
|
||||
"BinaryBucket": "release",
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "win7-x86",
|
||||
"RepoDestinationPath": "C:\\PowerShell",
|
||||
"BuildCommand": "C:\\PowerShellPackage.ps1 -location _RepoDestinationPath_ -destination _DockerVolume_ -Runtime win7-x86 -ReleaseTag _ReleaseTag_",
|
||||
"BuildDockerOptions": [
|
||||
"-m",
|
||||
"3968m"
|
||||
],
|
||||
"DockerFile": ".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\Dockerfile",
|
||||
"AdditionalContextFiles" :[
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\PowerShellPackage.ps1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\wix.psm1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\dockerInstall.psm1"
|
||||
],
|
||||
"DockerImageName": "ps-winsrvcore",
|
||||
"BinaryBucket": "release",
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "win-x64-component-registration",
|
||||
"RepoDestinationPath": "C:\\PowerShell",
|
||||
"BuildCommand": "C:\\PowerShellPackage.ps1 -location _RepoDestinationPath_ -destination _DockerVolume_ -Runtime win7-x64 -ReleaseTag _ReleaseTag_ -ComponentRegistration",
|
||||
"BuildDockerOptions": [
|
||||
"-m",
|
||||
"3968m"
|
||||
],
|
||||
"DockerFile": ".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\Dockerfile",
|
||||
"AdditionalContextFiles" :[
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\PowerShellPackage.ps1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\wix.psm1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\dockerInstall.psm1"
|
||||
],
|
||||
"DockerImageName": "ps-winsrvcore",
|
||||
"BinaryBucket": "results",
|
||||
"ArtifactsExpected": 1,
|
||||
"VariableForExtractedBinariesPath": "componentregistration",
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "win-x64-symbols",
|
||||
"RepoDestinationPath": "C:\\PowerShell",
|
||||
"BuildCommand": "C:\\PowerShellPackage.ps1 -location _RepoDestinationPath_ -destination _DockerVolume_ -Runtime win7-x64 -ReleaseTag _ReleaseTag_ -Symbols",
|
||||
"BuildDockerOptions": [
|
||||
"-m",
|
||||
"3968m"
|
||||
],
|
||||
"DockerFile": ".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\Dockerfile",
|
||||
"AdditionalContextFiles" :[
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\PowerShellPackage.ps1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\wix.psm1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\dockerInstall.psm1"
|
||||
],
|
||||
"DockerImageName": "ps-winsrvcore",
|
||||
"BinaryBucket": "results",
|
||||
"ArtifactsExpected": 1,
|
||||
"VariableForExtractedBinariesPath": "Symbols_x64",
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "win-x86-symbols",
|
||||
"RepoDestinationPath": "C:\\PowerShell",
|
||||
"BuildCommand": "C:\\PowerShellPackage.ps1 -location _RepoDestinationPath_ -destination _DockerVolume_ -Runtime win7-x86 -ReleaseTag _ReleaseTag_ -Symbols",
|
||||
"BuildDockerOptions": [
|
||||
"-m",
|
||||
"3968m"
|
||||
],
|
||||
"DockerFile": ".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\Dockerfile",
|
||||
"AdditionalContextFiles" :[
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\PowerShellPackage.ps1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\wix.psm1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\dockerInstall.psm1"
|
||||
],
|
||||
"DockerImageName": "ps-winsrvcore",
|
||||
"BinaryBucket": "results",
|
||||
"ArtifactsExpected": 1,
|
||||
"VariableForExtractedBinariesPath": "Symbols_x86",
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "win-arm-symbols",
|
||||
"RepoDestinationPath": "C:\\PowerShell",
|
||||
"BuildCommand": "C:\\PowerShellPackage.ps1 -location _RepoDestinationPath_ -destination _DockerVolume_ -Runtime win-arm -ReleaseTag _ReleaseTag_ -Symbols",
|
||||
"BuildDockerOptions": [
|
||||
"-m",
|
||||
"3968m"
|
||||
],
|
||||
"DockerFile": ".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\Dockerfile",
|
||||
"AdditionalContextFiles" :[
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\PowerShellPackage.ps1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\wix.psm1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\dockerInstall.psm1"
|
||||
],
|
||||
"DockerImageName": "ps-winsrvcore",
|
||||
"BinaryBucket": "results",
|
||||
"ArtifactsExpected": 1,
|
||||
"VariableForExtractedBinariesPath": "Symbols_arm",
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "win-arm64-symbols",
|
||||
"RepoDestinationPath": "C:\\PowerShell",
|
||||
"BuildCommand": "C:\\PowerShellPackage.ps1 -location _RepoDestinationPath_ -destination _DockerVolume_ -Runtime win-arm64 -ReleaseTag _ReleaseTag_ -Symbols",
|
||||
"BuildDockerOptions": [
|
||||
"-m",
|
||||
"3968m"
|
||||
],
|
||||
"DockerFile": ".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\Dockerfile",
|
||||
"AdditionalContextFiles" :[
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\PowerShellPackage.ps1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\wix.psm1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\dockerInstall.psm1"
|
||||
],
|
||||
"DockerImageName": "ps-winsrvcore",
|
||||
"BinaryBucket": "results",
|
||||
"ArtifactsExpected": 1,
|
||||
"VariableForExtractedBinariesPath": "Symbols_arm64",
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "win-x64-package",
|
||||
"RepoDestinationPath": "C:\\PowerShell",
|
||||
"BuildCommand": "C:\\PowerShellPackage.ps1 -BuildZip _RepoDestinationPath_\\_BuildPackageName_ -location _RepoDestinationPath_ -destination _DockerVolume_ -Runtime win7-x64 -ReleaseTag _ReleaseTag_",
|
||||
"BuildDockerOptions": [
|
||||
"-m",
|
||||
"3968m"
|
||||
],
|
||||
"DockerFile": ".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\Dockerfile",
|
||||
"AdditionalContextFiles" :[
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\PowerShellPackage.ps1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\wix.psm1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\dockerInstall.psm1"
|
||||
],
|
||||
"DockerImageName": "ps-winsrvcore",
|
||||
"BinaryBucket": "signed",
|
||||
"ArtifactsExpected": 4,
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "win-x86-package",
|
||||
"RepoDestinationPath": "C:\\PowerShell",
|
||||
"BuildCommand": "C:\\PowerShellPackage.ps1 -BuildZip _RepoDestinationPath_\\_BuildPackageName_ -location _RepoDestinationPath_ -destination _DockerVolume_ -Runtime win7-x86 -ReleaseTag _ReleaseTag_",
|
||||
"BuildDockerOptions": [
|
||||
"-m",
|
||||
"3968m"
|
||||
],
|
||||
"DockerFile": ".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\Dockerfile",
|
||||
"AdditionalContextFiles" :[
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\PowerShellPackage.ps1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\wix.psm1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\dockerInstall.psm1"
|
||||
],
|
||||
"DockerImageName": "ps-winsrvcore",
|
||||
"BinaryBucket": "signed",
|
||||
"ArtifactsExpected": 4,
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "win-arm-package",
|
||||
"RepoDestinationPath": "C:\\PowerShell",
|
||||
"BuildCommand": "C:\\PowerShellPackage.ps1 -BuildZip _RepoDestinationPath_\\_BuildPackageName_ -location _RepoDestinationPath_ -destination _DockerVolume_ -Runtime win-arm -ReleaseTag _ReleaseTag_",
|
||||
"BuildDockerOptions": [
|
||||
"-m",
|
||||
"3968m"
|
||||
],
|
||||
"DockerFile": ".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\Dockerfile",
|
||||
"AdditionalContextFiles" :[
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\PowerShellPackage.ps1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\wix.psm1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\dockerInstall.psm1"
|
||||
],
|
||||
"DockerImageName": "ps-winsrvcore",
|
||||
"BinaryBucket": "signed",
|
||||
"ArtifactsExpected": 2,
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "win-arm64-package",
|
||||
"RepoDestinationPath": "C:\\PowerShell",
|
||||
"BuildCommand": "C:\\PowerShellPackage.ps1 -BuildZip _RepoDestinationPath_\\_BuildPackageName_ -location _RepoDestinationPath_ -destination _DockerVolume_ -Runtime win-arm64 -ReleaseTag _ReleaseTag_",
|
||||
"BuildDockerOptions": [
|
||||
"-m",
|
||||
"3968m"
|
||||
],
|
||||
"DockerFile": ".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\Dockerfile",
|
||||
"AdditionalContextFiles" :[
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\PowerShellPackage.ps1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\wix.psm1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\dockerInstall.psm1"
|
||||
],
|
||||
"DockerImageName": "ps-winsrvcore",
|
||||
"BinaryBucket": "signed",
|
||||
"ArtifactsExpected": 2,
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "win-fxdependent-symbols",
|
||||
"RepoDestinationPath": "C:\\PowerShell",
|
||||
"BuildCommand": "C:\\PowerShellPackage.ps1 -location _RepoDestinationPath_ -destination _DockerVolume_ -Runtime fxdependent -ReleaseTag _ReleaseTag_ -Symbols",
|
||||
"BuildDockerOptions": [
|
||||
"-m",
|
||||
"3968m"
|
||||
],
|
||||
"DockerFile": ".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\Dockerfile",
|
||||
"AdditionalContextFiles" :[
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\PowerShellPackage.ps1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\wix.psm1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\dockerInstall.psm1"
|
||||
],
|
||||
"DockerImageName": "ps-winsrvcore",
|
||||
"BinaryBucket": "results",
|
||||
"ArtifactsExpected": 1,
|
||||
"VariableForExtractedBinariesPath": "Symbols_fxdependent",
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "win-fxdependent-package",
|
||||
"RepoDestinationPath": "C:\\PowerShell",
|
||||
"BuildCommand": "C:\\PowerShellPackage.ps1 -BuildZip _RepoDestinationPath_\\_BuildPackageName_ -location _RepoDestinationPath_ -destination _DockerVolume_ -Runtime fxdependent -ReleaseTag _ReleaseTag_",
|
||||
"BuildDockerOptions": [
|
||||
"-m",
|
||||
"3968m"
|
||||
],
|
||||
"DockerFile": ".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\Dockerfile",
|
||||
"AdditionalContextFiles" :[
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\PowerShellPackage.ps1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\wix.psm1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\dockerInstall.psm1"
|
||||
],
|
||||
"DockerImageName": "ps-winsrvcore",
|
||||
"BinaryBucket": "signed",
|
||||
"ArtifactsExpected": 1,
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "win-fxdependentWinDesktop-symbols",
|
||||
"RepoDestinationPath": "C:\\PowerShell",
|
||||
"BuildCommand": "C:\\PowerShellPackage.ps1 -location _RepoDestinationPath_ -destination _DockerVolume_ -Runtime fxdependent-win-desktop -ReleaseTag _ReleaseTag_ -Symbols",
|
||||
"BuildDockerOptions": [
|
||||
"-m",
|
||||
"3968m"
|
||||
],
|
||||
"DockerFile": ".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\Dockerfile",
|
||||
"AdditionalContextFiles" :[
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\PowerShellPackage.ps1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\wix.psm1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\dockerInstall.psm1"
|
||||
],
|
||||
"DockerImageName": "ps-winsrvcore",
|
||||
"BinaryBucket": "results",
|
||||
"ArtifactsExpected": 1,
|
||||
"VariableForExtractedBinariesPath": "Symbols_fxdependentWinDesktop",
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "win-fxdependentWinDesktop-package",
|
||||
"RepoDestinationPath": "C:\\PowerShell",
|
||||
"BuildCommand": "C:\\PowerShellPackage.ps1 -BuildZip _RepoDestinationPath_\\_BuildPackageName_ -location _RepoDestinationPath_ -destination _DockerVolume_ -Runtime fxdependent-win-desktop -ReleaseTag _ReleaseTag_",
|
||||
"BuildDockerOptions": [
|
||||
"-m",
|
||||
"3968m"
|
||||
],
|
||||
"DockerFile": ".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\Dockerfile",
|
||||
"AdditionalContextFiles" :[
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\PowerShellPackage.ps1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\wix.psm1",
|
||||
".\\tools\\releaseBuild\\Images\\microsoft_powershell_windowsservercore\\dockerInstall.psm1"
|
||||
],
|
||||
"DockerImageName": "ps-winsrvcore",
|
||||
"BinaryBucket": "signed",
|
||||
"ArtifactsExpected": 1,
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
}
|
||||
],
|
||||
"Linux": [
|
||||
{
|
||||
"Name": "deb",
|
||||
"RepoDestinationPath": "/PowerShell",
|
||||
"BuildCommand": "/PowerShellPackage.ps1 -location _RepoDestinationPath_ -destination _DockerVolume_ -ReleaseTag _ReleaseTag_ -TarX64 -TarArm -TarArm64 -TarMinSize",
|
||||
"DockerFile": "./tools/releaseBuild/Images/microsoft_powershell_ubuntu18.04/Dockerfile",
|
||||
"AdditionalContextFiles" :[ "./tools/releaseBuild/Images/GenericLinuxFiles/PowerShellPackage.ps1"],
|
||||
"DockerImageName": "ps-ubunutu-18-04",
|
||||
"BinaryBucket": "release",
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "rpm",
|
||||
"RepoDestinationPath": "/PowerShell",
|
||||
"BuildCommand": "/PowerShellPackage.ps1 -location _RepoDestinationPath_ -destination _DockerVolume_ -ReleaseTag _ReleaseTag_",
|
||||
"AdditionalContextFiles" :[ "./tools/releaseBuild/Images/GenericLinuxFiles/PowerShellPackage.ps1"],
|
||||
"DockerFile": "./tools/releaseBuild/Images/microsoft_powershell_centos7/Dockerfile",
|
||||
"DockerImageName": "ps-centos-7",
|
||||
"BinaryBucket": "release",
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "alpine",
|
||||
"RepoDestinationPath": "/PowerShell",
|
||||
"BuildCommand": "/PowerShellPackage.ps1 -location _RepoDestinationPath_ -destination _DockerVolume_ -ReleaseTag _ReleaseTag_ -Alpine",
|
||||
"AdditionalContextFiles" :[ "./tools/releaseBuild/Images/GenericLinuxFiles/PowerShellPackage.ps1"],
|
||||
"DockerFile": "./tools/releaseBuild/Images/microsoft_powershell_alpine3/Dockerfile",
|
||||
"DockerImageName": "ps-alpine-3",
|
||||
"BinaryBucket": "release",
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
},
|
||||
{
|
||||
"Name": "fxdependent",
|
||||
"RepoDestinationPath": "/PowerShell",
|
||||
"BuildCommand": "/PowerShellPackage.ps1 -location _RepoDestinationPath_ -destination _DockerVolume_ -ReleaseTag _ReleaseTag_ -FxDependent",
|
||||
"AdditionalContextFiles" :[ "./tools/releaseBuild/Images/GenericLinuxFiles/PowerShellPackage.ps1"],
|
||||
"DockerFile": "./tools/releaseBuild/Images/microsoft_powershell_centos7/Dockerfile",
|
||||
"DockerImageName": "ps-centos-7",
|
||||
"BinaryBucket": "release",
|
||||
"EnableFeature": [ "ArtifactAsFolder" ]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
# Copyright (c) Microsoft Corporation.
|
||||
# Licensed under the MIT License.
|
||||
param(
|
||||
[Parameter(HelpMessage="Artifact folder to find compliance files in.")]
|
||||
[string[]]
|
||||
$ArtifactFolder,
|
||||
[Parameter(HelpMessage="VSTS Variable to set path to complinance Files.")]
|
||||
[string]
|
||||
$VSTSVariableName
|
||||
)
|
||||
|
||||
$compliancePath = $null
|
||||
foreach($folder in $ArtifactFolder)
|
||||
{
|
||||
# Find Symbols zip which contains compliance files
|
||||
Write-Host "ArtifactFolder: $folder"
|
||||
$filename = Join-Path -Path $folder -ChildPath 'symbols.zip'
|
||||
|
||||
$parentName = Split-Path -Path $folder -Leaf
|
||||
|
||||
# Use simplified names because some of the compliance tools didn't like the full names
|
||||
# decided not to use hashes because the names need to be consistent otherwise the tool also has issues
|
||||
# which is another problem with the full name, it includes version.
|
||||
if ($parentName -match 'x64' -or $parentName -match 'amd64')
|
||||
{
|
||||
$name = 'x64'
|
||||
}
|
||||
elseif ($parentName -match 'x86') {
|
||||
$name = 'x86'
|
||||
}
|
||||
elseif ($parentName -match 'fxdependent') {
|
||||
$name = 'fxd'
|
||||
}
|
||||
else
|
||||
{
|
||||
throw "$parentName could not be classified as x86 or x64"
|
||||
}
|
||||
|
||||
# Throw is compliance zip does not exist
|
||||
if (!(Test-Path $filename))
|
||||
{
|
||||
throw "symbols.zip for $VSTSVariableName does not exist"
|
||||
}
|
||||
|
||||
# make sure we have a single parent for everything
|
||||
if (!$compliancePath)
|
||||
{
|
||||
$parent = Split-Path -Path $folder
|
||||
$compliancePath = Join-Path -Path $parent -ChildPath 'compliance'
|
||||
}
|
||||
|
||||
# Extract complance files to individual folder to avoid overwriting files.
|
||||
$unzipPath = Join-Path -Path $compliancePath -ChildPath $name
|
||||
Write-Host "Symbols-zip: $filename ; unzipPath: $unzipPath"
|
||||
Expand-Archive -Path $fileName -DestinationPath $unzipPath
|
||||
}
|
||||
|
||||
# set VSTS variable with path to compliance files
|
||||
Write-Host "##vso[task.setvariable variable=$VSTSVariableName]$unzipPath"
|
||||
@@ -1,112 +0,0 @@
|
||||
# Copyright (c) Microsoft Corporation.
|
||||
# Licensed under the MIT License.
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
[string] $Path,
|
||||
[string[]] $AuthenticodeDualFiles,
|
||||
[string[]] $AuthenticodeFiles,
|
||||
[string[]] $NuPkgFiles,
|
||||
[string[]] $MacDeveloperFiles,
|
||||
[string[]] $LinuxFiles,
|
||||
[string[]] $ThirdPartyFiles,
|
||||
[string[]] $MsixFiles,
|
||||
[ValidateSet('release','preview')]
|
||||
[string] $MsixCertType = 'preview'
|
||||
)
|
||||
|
||||
if ((!$AuthenticodeDualFiles -or $AuthenticodeDualFiles.Count -eq 0) -and
|
||||
(!$AuthenticodeFiles -or $AuthenticodeFiles.Count -eq 0) -and
|
||||
(!$NuPkgFiles -or $NuPkgFiles.Count -eq 0) -and
|
||||
(!$MacDeveloperFiles -or $MacDeveloperFiles.Count -eq 0) -and
|
||||
(!$LinuxFiles -or $LinuxFiles.Count -eq 0) -and
|
||||
(!$MsixFiles -or $MsixFiles.Count -eq 0) -and
|
||||
(!$ThirdPartyFiles -or $ThirdPartyFiles.Count -eq 0))
|
||||
{
|
||||
throw "At least one file must be specified"
|
||||
}
|
||||
|
||||
function New-Attribute
|
||||
{
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
[string]$Name,
|
||||
[Parameter(Mandatory)]
|
||||
[object]$Value,
|
||||
[Parameter(Mandatory)]
|
||||
[System.Xml.XmlElement]$Element
|
||||
)
|
||||
|
||||
$attribute = $signingXml.CreateAttribute($Name)
|
||||
$attribute.Value = $value
|
||||
$null = $fileElement.Attributes.Append($attribute)
|
||||
}
|
||||
|
||||
function New-FileElement
|
||||
{
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
[string]$File,
|
||||
[Parameter(Mandatory)]
|
||||
[string]$SignType,
|
||||
[Parameter(Mandatory)]
|
||||
[System.Xml.XmlDocument]$XmlDoc,
|
||||
[Parameter(Mandatory)]
|
||||
[System.Xml.XmlElement]$Job
|
||||
)
|
||||
|
||||
if(Test-Path -Path $file)
|
||||
{
|
||||
$name = Split-Path -Leaf -Path $File
|
||||
$fileElement = $XmlDoc.CreateElement("file")
|
||||
New-Attribute -Name 'src' -value $file -Element $fileElement
|
||||
New-Attribute -Name 'signType' -value $SignType -Element $fileElement
|
||||
New-Attribute -Name 'dest' -value "__OUTPATHROOT__\$name" -Element $fileElement
|
||||
$null = $job.AppendChild($fileElement)
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Warning -Message "Skipping $SignType; $File because it does not exist"
|
||||
}
|
||||
}
|
||||
|
||||
[xml]$signingXml = Get-Content (Join-Path -Path $PSScriptRoot -ChildPath 'packagesigning.xml')
|
||||
$job = $signingXml.SignConfigXML.job
|
||||
|
||||
foreach($file in $AuthenticodeDualFiles)
|
||||
{
|
||||
New-FileElement -File $file -SignType 'AuthenticodeDual' -XmlDoc $signingXml -Job $job
|
||||
}
|
||||
|
||||
foreach($file in $AuthenticodeFiles)
|
||||
{
|
||||
New-FileElement -File $file -SignType 'AuthenticodeFormer' -XmlDoc $signingXml -Job $job
|
||||
}
|
||||
|
||||
foreach($file in $NuPkgFiles)
|
||||
{
|
||||
New-FileElement -File $file -SignType 'NuGet' -XmlDoc $signingXml -Job $job
|
||||
}
|
||||
|
||||
foreach ($file in $MacDeveloperFiles) {
|
||||
New-FileElement -File $file -SignType 'MacDeveloper' -XmlDoc $signingXml -Job $job
|
||||
}
|
||||
|
||||
foreach ($file in $LinuxFiles) {
|
||||
New-FileElement -File $file -SignType 'LinuxPack' -XmlDoc $signingXml -Job $job
|
||||
}
|
||||
|
||||
foreach ($file in $ThirdPartyFiles) {
|
||||
New-FileElement -File $file -SignType 'ThirdParty' -XmlDoc $signingXml -Job $job
|
||||
}
|
||||
|
||||
foreach ($file in $MsixFiles) {
|
||||
# 'CP-459155' is supposed to work for the store
|
||||
# AuthenticodeFormer works for sideloading and via a workaround, through the store
|
||||
# ----------------------------------------------
|
||||
# update releasePublisher in packaging.psm1 when this is changed
|
||||
New-FileElement -File $file -SignType 'AuthenticodeFormer' -XmlDoc $signingXml -Job $job
|
||||
}
|
||||
|
||||
$signingXml.Save($path)
|
||||
$updateScriptPath = Join-Path -Path $PSScriptRoot -ChildPath 'updateSigning.ps1'
|
||||
& $updateScriptPath -SigningXmlPath $path
|
||||
@@ -1,143 +0,0 @@
|
||||
# Copyright (c) Microsoft Corporation.
|
||||
# Licensed under the MIT License.
|
||||
|
||||
# PowerShell Script to build and package PowerShell from specified form and branch
|
||||
# Script is intented to use in Docker containers
|
||||
# Ensure PowerShell is available in the provided image
|
||||
|
||||
param (
|
||||
# Set default location to where VSTS cloned the repository locally.
|
||||
[string] $location = $env:BUILD_REPOSITORY_LOCALPATH,
|
||||
|
||||
# Destination location of the package on docker host
|
||||
[Parameter(Mandatory, ParameterSetName = 'packageSigned')]
|
||||
[Parameter(Mandatory, ParameterSetName = 'IncludeSymbols')]
|
||||
[Parameter(Mandatory, ParameterSetName = 'Build')]
|
||||
[string] $destination = '/mnt',
|
||||
|
||||
[Parameter(Mandatory, ParameterSetName = 'packageSigned')]
|
||||
[Parameter(Mandatory, ParameterSetName = 'IncludeSymbols')]
|
||||
[Parameter(Mandatory, ParameterSetName = 'Build')]
|
||||
[ValidatePattern("^v\d+\.\d+\.\d+(-\w+(\.\d{1,2})?)?$")]
|
||||
[ValidateNotNullOrEmpty()]
|
||||
[string]$ReleaseTag,
|
||||
|
||||
[Parameter(ParameterSetName = 'packageSigned')]
|
||||
[Parameter(ParameterSetName = 'IncludeSymbols')]
|
||||
[Parameter(ParameterSetName = 'Build')]
|
||||
[ValidateSet("zip", "tar")]
|
||||
[string[]]$ExtraPackage,
|
||||
|
||||
[Parameter(Mandatory, ParameterSetName = 'Bootstrap')]
|
||||
[switch] $BootStrap,
|
||||
|
||||
[Parameter(Mandatory, ParameterSetName = 'IncludeSymbols')]
|
||||
[Parameter(Mandatory, ParameterSetName = 'Build')]
|
||||
[switch] $Build,
|
||||
|
||||
[Parameter(Mandatory, ParameterSetName = 'IncludeSymbols')]
|
||||
[switch] $Symbols,
|
||||
|
||||
[Parameter(Mandatory, ParameterSetName = 'packageSigned')]
|
||||
[ValidatePattern("-signed.zip$")]
|
||||
[string]$BuildZip,
|
||||
|
||||
[Parameter(Mandatory, ParameterSetName = 'packageSigned')]
|
||||
[Parameter(Mandatory, ParameterSetName = 'IncludeSymbols')]
|
||||
[Parameter(Mandatory, ParameterSetName = 'Build')]
|
||||
[ValidateSet('osx-x64', 'osx-arm64')]
|
||||
[string]$Runtime,
|
||||
|
||||
[string]$ArtifactName = 'result',
|
||||
|
||||
[switch]$SkipReleaseChecks
|
||||
)
|
||||
|
||||
$repoRoot = $location
|
||||
|
||||
if ($Build -or $PSCmdlet.ParameterSetName -eq 'packageSigned') {
|
||||
$releaseTagParam = @{}
|
||||
if ($ReleaseTag) {
|
||||
$releaseTagParam['ReleaseTag'] = $ReleaseTag
|
||||
|
||||
#Remove the initial 'v' from the ReleaseTag
|
||||
$version = $ReleaseTag -replace '^v'
|
||||
$semVersion = [System.Management.Automation.SemanticVersion] $version
|
||||
|
||||
$metadata = Get-Content "$location/tools/metadata.json" -Raw | ConvertFrom-Json
|
||||
|
||||
$LTS = $metadata.LTSRelease.Package
|
||||
|
||||
Write-Verbose -Verbose -Message "LTS is set to: $LTS"
|
||||
}
|
||||
}
|
||||
|
||||
Push-Location
|
||||
try {
|
||||
$pspackageParams = @{ SkipReleaseChecks = $SkipReleaseChecks; MacOSRuntime = $Runtime }
|
||||
Write-Verbose -Message "Init..." -Verbose
|
||||
Set-Location $repoRoot
|
||||
Import-Module "$repoRoot/build.psm1"
|
||||
Import-Module "$repoRoot/tools/packaging"
|
||||
Sync-PSTags -AddRemoteIfMissing
|
||||
|
||||
if ($BootStrap) {
|
||||
Start-PSBootstrap -Package
|
||||
}
|
||||
|
||||
if ($PSCmdlet.ParameterSetName -eq 'packageSigned') {
|
||||
Write-Verbose "Expanding signed build $BuildZip ..." -Verbose
|
||||
Expand-PSSignedBuild -BuildZip $BuildZip
|
||||
|
||||
Remove-Item -Path $BuildZip
|
||||
|
||||
Start-PSPackage @pspackageParams @releaseTagParam
|
||||
switch ($ExtraPackage) {
|
||||
"tar" { Start-PSPackage -Type tar @pspackageParams @releaseTagParam }
|
||||
}
|
||||
|
||||
if ($LTS) {
|
||||
Start-PSPackage @pspackageParams @releaseTagParam -LTS
|
||||
switch ($ExtraPackage) {
|
||||
"tar" { Start-PSPackage -Type tar @pspackageParams @releaseTagParam -LTS }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($Build) {
|
||||
if ($Symbols) {
|
||||
Start-PSBuild -Clean -Configuration 'Release' -NoPSModuleRestore @releaseTagParam -Runtime $Runtime
|
||||
$pspackageParams['Type']='zip'
|
||||
$pspackageParams['IncludeSymbols']=$Symbols.IsPresent
|
||||
Write-Verbose "Starting powershell packaging(zip)..." -Verbose
|
||||
Start-PSPackage @pspackageParams @releaseTagParam
|
||||
} else {
|
||||
Start-PSBuild -Configuration 'Release' -PSModuleRestore @releaseTagParam -Runtime $Runtime
|
||||
Start-PSPackage @pspackageParams @releaseTagParam
|
||||
switch ($ExtraPackage) {
|
||||
"tar" { Start-PSPackage -Type tar @pspackageParams @releaseTagParam }
|
||||
}
|
||||
|
||||
if ($LTS) {
|
||||
Start-PSPackage @releaseTagParam -LTS
|
||||
switch ($ExtraPackage) {
|
||||
"tar" { Start-PSPackage -Type tar @pspackageParams @releaseTagParam -LTS }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
Pop-Location
|
||||
}
|
||||
|
||||
if ($Build -or $PSCmdlet.ParameterSetName -eq 'packageSigned') {
|
||||
$macPackages = Get-ChildItem "$repoRoot/powershell*" -Include *.pkg, *.tar.gz, *.zip
|
||||
foreach ($macPackage in $macPackages) {
|
||||
$filePath = $macPackage.FullName
|
||||
$extension = (Split-Path -Extension -Path $filePath).Replace('.', '')
|
||||
Write-Verbose "Copying $filePath to $destination" -Verbose
|
||||
Write-Host "##vso[artifact.upload containerfolder=$ArtifactName;artifactname=$ArtifactName]$filePath"
|
||||
Write-Host "##vso[task.setvariable variable=Package-$extension]$filePath"
|
||||
Copy-Item -Path $filePath -Destination $destination -Force
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
pwsh -command ".\PowerShellPackageVsts.ps1 $*"
|
||||
@@ -1,8 +0,0 @@
|
||||
# print version for diags
|
||||
sw_vers -productVersion
|
||||
|
||||
# create folder
|
||||
sudo mkdir /PowerShell
|
||||
|
||||
# make the current user the owner
|
||||
sudo chown $USER /PowerShell
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!-- template used by generatePackageSigning.ps1 -->
|
||||
<SignConfigXML>
|
||||
<job platform="" configuration="" dest="__OUTPATHROOT__\signed" jobname="PowerShell Core Installer" approvers="vigarg;gstolt">
|
||||
</job>
|
||||
</SignConfigXML>
|
||||
@@ -1,161 +0,0 @@
|
||||
param(
|
||||
[Parameter(HelpMessage='ReleaseTag from the job. Set to "fromBranch" or $null to update using the branch name')]
|
||||
[string]$ReleaseTag,
|
||||
|
||||
[Parameter(HelpMessage='The branch name used to update the release tag.')]
|
||||
[string]$Branch=$env:BUILD_SOURCEBRANCH,
|
||||
|
||||
[Parameter(HelpMessage='The variable name to put the new release tagin.')]
|
||||
[string]$Variable='ReleaseTag',
|
||||
|
||||
[switch]$CreateJson
|
||||
)
|
||||
|
||||
function New-BuildInfoJson {
|
||||
param(
|
||||
[parameter(Mandatory = $true)]
|
||||
[string]
|
||||
$ReleaseTag,
|
||||
[switch] $IsDaily
|
||||
)
|
||||
|
||||
$blobName = $ReleaseTag -replace '\.', '-'
|
||||
|
||||
$isPreview = $ReleaseTag -like '*-*'
|
||||
|
||||
$filename = 'stable.json'
|
||||
if($isPreview)
|
||||
{
|
||||
$filename = 'preview.json'
|
||||
}
|
||||
if($IsDaily.IsPresent)
|
||||
{
|
||||
$filename = 'daily.json'
|
||||
}
|
||||
|
||||
## Get the UTC time and round up to the second.
|
||||
$dateTime = [datetime]::UtcNow
|
||||
$dateTime = [datetime]::new($dateTime.Ticks - ($dateTime.Ticks % [timespan]::TicksPerSecond), $dateTime.Kind)
|
||||
|
||||
@{
|
||||
ReleaseTag = $ReleaseTag
|
||||
ReleaseDate = $dateTime
|
||||
BlobName = $blobName
|
||||
BaseUrl = 'https://powershellinfraartifacts-gkhedzdeaghdezhr.z01.azurefd.net/install'
|
||||
} | ConvertTo-Json | Out-File -Encoding ascii -Force -FilePath $filename
|
||||
|
||||
$resolvedPath = (Resolve-Path -Path $filename).ProviderPath
|
||||
$vstsCommandString = "vso[task.setvariable variable=BuildInfoPath]$resolvedPath"
|
||||
Write-Verbose -Message "$vstsCommandString" -Verbose
|
||||
Write-Host -Object "##$vstsCommandString"
|
||||
|
||||
# Upload for ADO pipelines
|
||||
Write-Host "##vso[artifact.upload containerfolder=BuildInfoJson;artifactname=BuildInfoJson]$resolvedPath"
|
||||
|
||||
# Copy to location where OneBranch Pipelines uploads from
|
||||
|
||||
# if the environment variable does not exist, we are not in OneBranch. So just return.
|
||||
if (-not $env:ob_outputDirectory) {
|
||||
return
|
||||
}
|
||||
|
||||
if (-not (Test-Path $env:ob_outputDirectory)) {
|
||||
$null = New-Item -Path $env:ob_outputDirectory -ItemType Directory -Force -Verbose
|
||||
}
|
||||
|
||||
Copy-Item $resolvedPath -Destination $env:ob_outputDirectory -Force -Verbose
|
||||
}
|
||||
|
||||
# Script to set the release tag based on the branch name if it is not set or it is "fromBranch"
|
||||
# the branch name is expected to be release-<semver> or <previewname>
|
||||
# VSTS passes it as 'refs/heads/release-v6.0.2'
|
||||
|
||||
$branchOnly = $Branch -replace '^refs/heads/';
|
||||
$branchOnly = $branchOnly -replace '[_\-]'
|
||||
|
||||
$msixType = 'preview'
|
||||
|
||||
$isDaily = $false
|
||||
|
||||
if($ReleaseTag -eq 'fromBranch' -or !$ReleaseTag)
|
||||
{
|
||||
# Branch is named release-<semver>
|
||||
$releaseBranchRegex = '^.*((release/|rebuild/.*rebuild))'
|
||||
if($Branch -match $releaseBranchRegex)
|
||||
{
|
||||
$msixType = 'release'
|
||||
Write-Verbose "release branch:" -Verbose
|
||||
$releaseTag = $Branch -replace '^.*((release|rebuild)/)'
|
||||
$vstsCommandString = "vso[task.setvariable variable=$Variable]$releaseTag"
|
||||
Write-Verbose -Message "setting $Variable to $releaseTag" -Verbose
|
||||
Write-Host -Object "##$vstsCommandString"
|
||||
|
||||
if ($CreateJson.IsPresent)
|
||||
{
|
||||
New-BuildInfoJson -ReleaseTag $releaseTag
|
||||
}
|
||||
}
|
||||
elseif(($branchOnly -eq 'master' -and $env:BUILD_REASON -ne 'Manual') -or $branchOnly -like '*dailytest*')
|
||||
{
|
||||
$isDaily = $true
|
||||
Write-Verbose "daily build" -Verbose
|
||||
$jsonPath = "${env:SYSTEM_ARTIFACTSDIRECTORY}\BuildInfoJson\daily.json"
|
||||
if (test-path -Path $jsonPath) {
|
||||
Write-Verbose "restoring from buildinfo json..." -Verbose
|
||||
$buildInfo = Get-Content -Path $jsonPath | ConvertFrom-Json
|
||||
$releaseTag = $buildInfo.ReleaseTag
|
||||
} else {
|
||||
Write-Verbose "creating from branch counter and metadata.json..." -Verbose
|
||||
$metaDataJsonPath = Join-Path $PSScriptRoot -ChildPath '..\metadata.json'
|
||||
$metadata = Get-Content $metaDataJsonPath | ConvertFrom-Json
|
||||
$versionPart = $metadata.PreviewReleaseTag
|
||||
if ($versionPart -match '-.*$') {
|
||||
$versionPart = $versionPart -replace '-.*$'
|
||||
}
|
||||
|
||||
$releaseTag = "$versionPart-daily$((Get-Date).ToString('yyyyMMdd')).$($env:BRANCHCOUNTER)"
|
||||
}
|
||||
|
||||
$vstsCommandString = "vso[task.setvariable variable=$Variable]$releaseTag"
|
||||
Write-Verbose -Message "setting $Variable to $releaseTag" -Verbose
|
||||
Write-Host -Object "##$vstsCommandString"
|
||||
|
||||
if ($CreateJson.IsPresent)
|
||||
{
|
||||
New-BuildInfoJson -ReleaseTag $releaseTag -IsDaily
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Verbose "non-release branch" -Verbose
|
||||
# Branch is named <previewname>
|
||||
# Get version from metadata and append -<previewname>
|
||||
$metaDataJsonPath = Join-Path $PSScriptRoot -ChildPath '..\metadata.json'
|
||||
$metadata = Get-Content $metaDataJsonPath | ConvertFrom-Json
|
||||
$versionPart = $metadata.PreviewReleaseTag
|
||||
if($versionPart -match '-.*$')
|
||||
{
|
||||
$versionPart = $versionPart -replace '-.*$'
|
||||
}
|
||||
|
||||
$releaseTag = "$versionPart-$branchOnly"
|
||||
$vstsCommandString = "vso[task.setvariable variable=$Variable]$releaseTag"
|
||||
Write-Verbose -Message "setting $Variable to $releaseTag" -Verbose
|
||||
Write-Host -Object "##$vstsCommandString"
|
||||
|
||||
if ($CreateJson.IsPresent)
|
||||
{
|
||||
New-BuildInfoJson -ReleaseTag $releaseTag
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$vstsCommandString = "vso[task.setvariable variable=IS_DAILY]$($isDaily.ToString().ToLowerInvariant())"
|
||||
Write-Verbose -Message "$vstsCommandString" -Verbose
|
||||
Write-Host -Object "##$vstsCommandString"
|
||||
|
||||
$vstsCommandString = "vso[task.setvariable variable=MSIX_TYPE]$msixType"
|
||||
Write-Verbose -Message "$vstsCommandString" -Verbose
|
||||
Write-Host -Object "##$vstsCommandString"
|
||||
|
||||
Write-Output $releaseTag
|
||||
@@ -1 +0,0 @@
|
||||
pwsh -command ".\setReleaseTag.ps1 $*"
|
||||
@@ -1,46 +0,0 @@
|
||||
# Copyright (c) Microsoft Corporation.
|
||||
# Licensed under the MIT License.
|
||||
param(
|
||||
[string] $SigningXmlPath = (Join-Path -Path $PSScriptRoot -ChildPath 'signing.xml'),
|
||||
[switch] $SkipPwshExe
|
||||
)
|
||||
# Script for use in VSTS to update signing.xml
|
||||
|
||||
if ($SkipPwshExe) {
|
||||
## This is required for fxdependent package as no .exe is generated.
|
||||
$xmlContent = Get-Content $SigningXmlPath | Where-Object { $_ -notmatch '__INPATHROOT__\\pwsh.exe' }
|
||||
} else {
|
||||
## We skip the global tool shim assembly for regular builds.
|
||||
$xmlContent = Get-Content $signingXmlPath | Where-Object { $_ -notmatch '__INPATHROOT__\\Microsoft.PowerShell.GlobalTool.Shim.dll' }
|
||||
}
|
||||
|
||||
# Parse the signing xml
|
||||
$signingXml = [xml] $xmlContent
|
||||
|
||||
# Get any variables to updating 'signType' in the XML
|
||||
# Define a varabile named `<signTypeInXml>SignType' in VSTS to updating that signing type
|
||||
# Example: $env:AuthenticodeSignType='newvalue'
|
||||
# will cause all files with the 'Authenticode' signtype to be updated with the 'newvalue' signtype
|
||||
$signTypes = @{}
|
||||
Get-ChildItem -Path env:/*SignType | ForEach-Object -Process {
|
||||
$signType = $_.Name.ToUpperInvariant().Replace('SIGNTYPE','')
|
||||
Write-Host "Found SigningType $signType with value $($_.value)"
|
||||
$signTypes[$signType] = $_.Value
|
||||
}
|
||||
|
||||
# examine each job in the xml
|
||||
$signingXml.SignConfigXML.job | ForEach-Object -Process {
|
||||
# examine each file in the job
|
||||
$_.file | ForEach-Object -Process {
|
||||
# if the sign type is one of the variables we found, update it to the new value
|
||||
$signType = $_.SignType.ToUpperInvariant()
|
||||
if($signTypes.ContainsKey($signType))
|
||||
{
|
||||
$newSignType = $signTypes[$signType]
|
||||
Write-Host "Updating $($_.src) to $newSignType"
|
||||
$_.signType = $newSignType
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$signingXml.Save($signingXmlPath)
|
||||
@@ -1,120 +0,0 @@
|
||||
# Copyright (c) Microsoft Corporation.
|
||||
# Licensed under the MIT License.
|
||||
[cmdletbinding(DefaultParameterSetName='Build')]
|
||||
param(
|
||||
[Parameter(ParameterSetName='packageSigned')]
|
||||
[Parameter(ParameterSetName='Build')]
|
||||
[ValidatePattern("^v\d+\.\d+\.\d+(-\w+(\.\d{1,2})?)?$")]
|
||||
[string]$ReleaseTag,
|
||||
|
||||
# full paths to files to add to container to run the build
|
||||
[Parameter(Mandatory,ParameterSetName='packageSigned')]
|
||||
[string]
|
||||
$BuildPath,
|
||||
|
||||
[Parameter(Mandatory,ParameterSetName='packageSigned')]
|
||||
[string]
|
||||
$SignedFilesPath
|
||||
)
|
||||
|
||||
DynamicParam {
|
||||
# Add a dynamic parameter '-Name' which specifies the name of the build to run
|
||||
|
||||
# Get the names of the builds.
|
||||
$buildJsonPath = (Join-Path -Path $PSScriptRoot -ChildPath 'build.json')
|
||||
$build = Get-Content -Path $buildJsonPath | ConvertFrom-Json
|
||||
$names = @($build.Windows.Name)
|
||||
foreach($name in $build.Linux.Name)
|
||||
{
|
||||
$names += $name
|
||||
}
|
||||
|
||||
# Create the parameter attributs
|
||||
$ParameterAttr = New-Object "System.Management.Automation.ParameterAttribute"
|
||||
$ValidateSetAttr = New-Object "System.Management.Automation.ValidateSetAttribute" -ArgumentList $names
|
||||
$Attributes = New-Object "System.Collections.ObjectModel.Collection``1[System.Attribute]"
|
||||
$Attributes.Add($ParameterAttr) > $null
|
||||
$Attributes.Add($ValidateSetAttr) > $null
|
||||
|
||||
# Create the parameter
|
||||
$Parameter = New-Object "System.Management.Automation.RuntimeDefinedParameter" -ArgumentList ("Name", [string], $Attributes)
|
||||
$Dict = New-Object "System.Management.Automation.RuntimeDefinedParameterDictionary"
|
||||
$Dict.Add("Name", $Parameter) > $null
|
||||
return $Dict
|
||||
}
|
||||
|
||||
Begin {
|
||||
$Name = $PSBoundParameters['Name']
|
||||
}
|
||||
|
||||
End {
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
$additionalFiles = @()
|
||||
$buildPackageName = $null
|
||||
# If specified, Add package file to container
|
||||
if ($BuildPath)
|
||||
{
|
||||
Import-Module (Join-Path -Path $PSScriptRoot -ChildPath '..\..\build.psm1')
|
||||
Import-Module (Join-Path -Path $PSScriptRoot -ChildPath '..\packaging')
|
||||
|
||||
# Use temp as destination if not running in VSTS
|
||||
$destFolder = $env:temp
|
||||
if($env:BUILD_STAGINGDIRECTORY)
|
||||
{
|
||||
# Use artifact staging if running in VSTS
|
||||
$destFolder = $env:BUILD_STAGINGDIRECTORY
|
||||
}
|
||||
|
||||
$BuildPackagePath = New-PSSignedBuildZip -BuildPath $BuildPath -SignedFilesPath $SignedFilesPath -DestinationFolder $destFolder
|
||||
Write-Verbose -Verbose "New-PSSignedBuildZip returned `$BuildPackagePath as: $BuildPackagePath"
|
||||
Write-Host "##vso[artifact.upload containerfolder=results;artifactname=results]$BuildPackagePath"
|
||||
$buildPackageName = Split-Path -Path $BuildPackagePath -Leaf
|
||||
$additionalFiles += $BuildPackagePath
|
||||
}
|
||||
|
||||
$psReleaseBranch = 'master'
|
||||
$psReleaseFork = 'PowerShell'
|
||||
$location = Join-Path -Path $PSScriptRoot -ChildPath 'PSRelease'
|
||||
if(Test-Path $location)
|
||||
{
|
||||
Remove-Item -Path $location -Recurse -Force
|
||||
}
|
||||
|
||||
$gitBinFullPath = (Get-Command -Name git).Source
|
||||
if (-not $gitBinFullPath)
|
||||
{
|
||||
throw "Git is required to proceed. Install from 'https://git-scm.com/download/win'"
|
||||
}
|
||||
|
||||
Write-Verbose "cloning -b $psReleaseBranch --quiet https://github.com/$psReleaseFork/PSRelease.git" -Verbose
|
||||
& $gitBinFullPath clone -b $psReleaseBranch --quiet https://github.com/$psReleaseFork/PSRelease.git $location
|
||||
|
||||
Push-Location -Path $PWD.Path
|
||||
|
||||
$unresolvedRepoRoot = Join-Path -Path $PSScriptRoot '../..'
|
||||
$resolvedRepoRoot = (Resolve-Path -Path $unresolvedRepoRoot).ProviderPath
|
||||
|
||||
try
|
||||
{
|
||||
Write-Verbose "Starting build at $resolvedRepoRoot ..." -Verbose
|
||||
Import-Module "$location/vstsBuild" -Force
|
||||
Import-Module "$location/dockerBasedBuild" -Force
|
||||
Clear-VstsTaskState
|
||||
|
||||
$buildParameters = @{
|
||||
ReleaseTag = $ReleaseTag
|
||||
BuildPackageName = $buildPackageName
|
||||
}
|
||||
|
||||
Invoke-Build -RepoPath $resolvedRepoRoot -BuildJsonPath './tools/releaseBuild/build.json' -Name $Name -Parameters $buildParameters -AdditionalFiles $AdditionalFiles
|
||||
}
|
||||
catch
|
||||
{
|
||||
Write-VstsError -Error $_
|
||||
}
|
||||
finally{
|
||||
Write-VstsTaskState
|
||||
exit 0
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
pwsh -command ".\vstsbuild.ps1 $*"
|
||||
Reference in New Issue
Block a user