Cleanup old release pipelines (#25201)

This commit is contained in:
Travis Plunk
2025-03-20 21:45:49 +00:00
committed by GitHub
parent eef334de1b
commit d76e40df10
73 changed files with 0 additions and 8386 deletions
-1
View File
@@ -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
@@ -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
}
-55
View File
@@ -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:
[![Release Build diagram](https://raw.githubusercontent.com/PowerShell/PowerShell/master/tools/releaseBuild/azureDevOps/diagram.svg?sanitize=true)](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: []
-107
View File
@@ -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,673 +0,0 @@
trigger: none
# needed to disable CI trigger and allow manual trigger
# when the branch is same as pipeline source, the latest build from the source is used.
# all environment used are for manual tasks and approvals.
parameters:
- name: skipPackagesMsftComPublish
displayName: Skip actual publishing to Packages.microsoft.com, AFTER we upload it. Used to test the publishing script.
default: false
type: boolean
- name: skipNugetPublish
displayName: Skip nuget publishing. Used in testing publishing stage.
default: false
type: boolean
resources:
pipelines:
- pipeline: releasePipeline
source: 'Coordinated Packages'
trigger:
branches:
- release/*
repositories:
- repository: Internal-PowerShellTeam-Tools
type: git
trigger: none
name: Internal-PowerShellTeam-Tools
ref: main-mirror
- repository: ComplianceRepo
type: github
endpoint: ComplianceGHRepo
name: PowerShell/compliance
ref: master
variables:
- name: runCodesignValidationInjection
value : false
- name: nugetMultiFeedWarnLevel
value: none
- name: NugetSecurityAnalysisWarningLevel
value: none
- name: skipComponentGovernanceDetection
value: true
- name: BUILDSECMON_OPT_IN
value: true
- group: ReleasePipelineSecrets
- group: PipelineExecutionPats
stages:
- stage: MSIXBundle
displayName: Create MSIX Bundle package
dependsOn: []
jobs:
- template: templates/release-MsixBundle.yml
- stage: ValidateSDK
displayName: Validate SDK
dependsOn: []
jobs:
- template: templates/release-SDKTests.yml
parameters:
jobName: WinSDK
displayName: Windows SDK Test
imageName: windows-latest
- template: templates/release-SDKTests.yml
parameters:
jobName: LinuxSDK
displayName: Linux SDK Test
imageName: ubuntu-latest
- template: templates/release-SDKTests.yml
parameters:
jobName: macOSSDK
displayName: macOS SDK Test
imageName: macOS-latest
- stage: PRCreation
displayName: Create PR in GH Master
dependsOn: []
jobs:
- deployment: CreatePRInMaster
displayName: Update README.md and metadata.json
pool: server
environment: PSReleaseCreatePR
- stage: ValidateGlobalTool
displayName: Validate Global Tool
dependsOn: []
jobs:
- template: templates/release-GlobalToolTest.yml
parameters:
jobName: WinGblTool
displayName: Global Tool Test Windows
imageName: windows-latest
globalToolExeName: 'pwsh.exe'
globalToolPackageName: 'PowerShell.Windows.x64'
- template: templates/release-GlobalToolTest.yml
parameters:
jobName: LinuxWinGblTool
displayName: Global Tool Test Linux
imageName: ubuntu-latest
globalToolExeName: 'pwsh'
globalToolPackageName: 'PowerShell.Linux.x64'
- stage: ValidateFxdPackage
displayName: Validate Fxd Package
dependsOn: []
jobs:
- template: templates/release-ValidateFxdPackage.yml
parameters:
jobName: WinFxdPackage
displayName: Fxd Package Test Win
imageName: windows-latest
packageNamePattern: '**/*win-fxdependent.zip'
- template: templates/release-ValidateFxdPackage.yml
parameters:
jobName: FxdPackageWindDesktop
displayName: Fxd Package Test WinDesktop
imageName: windows-latest
packageNamePattern: '**/*win-fxdependentWinDesktop.zip'
- template: templates/release-ValidateFxdPackage.yml
parameters:
jobName: FxdPackageLinux
displayName: Fxd Package Test Linux
imageName: ubuntu-latest
packageNamePattern: '**/*linux-x64-fxdependent.tar.gz'
- template: templates/release-ValidateFxdPackage.yml
parameters:
jobName: FxdPackageLinuxonARM
displayName: Fxd Package Test Linux ARM64
imageName: 'PSMMSUbuntu20.04-ARM64-secure'
packageNamePattern: '**/*linux-x64-fxdependent.tar.gz'
use1ES: true
- stage: StaticPkgValidation
dependsOn: []
displayName: Static package validation
jobs:
- job: ValidatePkgNames
displayName: Validate Package Names
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
variables:
- group: 'Azure Blob variable group'
steps:
- template: templates/release-ValidatePackageNames.yml
- job: ValidatePkgBOM
displayName: Validate Package BOM
pool:
# testing
vmImage: ubuntu-latest
steps:
- template: templates/release-ValidatePackageBOM.yml
- stage: StartDocker
dependsOn: []
displayName: Kick Off Docker Staging build
jobs:
- deployment: PSDockerKickOff
displayName: Start Docker build
pool: server
environment: PSReleaseDockerKickOff
- stage: ManualValidation
dependsOn: []
displayName: Manual Validation
jobs:
- template: templates/release/approvalJob.yml
parameters:
displayName: Validate Windows Packages
jobName: ValidateWinPkg
instructions: |
Validate zip and msipackages on Windows Server 2012 R2
- template: templates/release/approvalJob.yml
parameters:
displayName: Validate OSX Packages
jobName: ValidateOsxPkg
instructions: |
Validate tar.gz package on osx-arm64
- stage: ReleaseAutomation
displayName: Release Automation
dependsOn: []
jobs:
- job: KickOffRA
displayName: Kickoff Release Automation
timeoutInMinutes: 240
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
steps:
- checkout: Internal-PowerShellTeam-Tools
- task: DownloadPipelineArtifact@2
inputs:
source: specific
project: PowerShellCore
pipeline: '696'
preferTriggeringPipeline: true
runVersion: latestFromBranch
runBranch: '$(Build.SourceBranch)'
artifact: metadata
path: '$(Pipeline.Workspace)/releasePipeline/metadata'
- pwsh: |
Get-ChildItem -Path $(Build.SourcesDirectory)
Import-Module $(Build.SourcesDirectory)\ReleaseTools\AzDO -Force
Set-AzDoProjectInfo -ProjectOwner PowerShell-Rel -ProjectName Release-Automation
Set-AzDoAuthToken -Token $(powershellRelExecutionPat)
$packageBuildID = $(resources.pipeline.releasePipeline.runID)
$metadata = Get-Content -Raw -Path '$(Pipeline.Workspace)/releasePipeline/metadata/release.json' | ConvertFrom-Json
$buildInvocationInfo = Start-AzDOBuild -BuildDefinitionId 10 -BuildArguments @{ POWERSHELL_PACKAGE_BUILD_BUILDID = $packageBuildID } -Tag $metadata.ReleaseVersion, 'InProgress' -PassThru
Write-Verbose -Verbose "Kicked off release automation:`n$($buildInvocationInfo | Out-String)"
$status = $buildInvocationInfo | Wait-AzDOBuildStatus -Status Completed -timeoutMinutes 240
if ($status.result -ne 'Succeeded') {
Write-Verbose "There are errors in release automation tests. Please triage failures."
}
- template: templates/release/approvalJob.yml
parameters:
displayName: Triage Release Automation Results
jobName: TriageRA
dependsOnJob: KickOffRA
instructions: |
Validate all the test failures and continue when signed off
- job: MarkRASignOff
displayName: Mark release automation signoff
dependsOn: TriageRA
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
steps:
- checkout: Internal-PowerShellTeam-Tools
- task: DownloadPipelineArtifact@2
inputs:
source: specific
project: PowerShellCore
pipeline: '696'
preferTriggeringPipeline: true
runVersion: latestFromBranch
runBranch: '$(Build.SourceBranch)'
artifact: metadata
path: '$(Pipeline.Workspace)/releasePipeline/metadata'
- pwsh: |
Import-Module $(Build.SourcesDirectory)\ReleaseTools\AzDO -Force
Set-AzDoProjectInfo -ProjectOwner PowerShell-Rel -ProjectName Release-Automation
Set-AzDoAuthToken -Token $(powershellRelExecutionPat)
$metadata = Get-Content -Raw -Path '$(Pipeline.Workspace)/releasePipeline/metadata/release.json' | ConvertFrom-Json
$azDOBuild = Get-AzDOBuild -buildDefinitionId 10 -MaximumResult 100 | Where-Object { $_.tags -in $metadata.ReleaseVersion }
$azDoBuild | Remove-AzDOBuildTag -tag 'InProgress' -Pass | Add-AzDOBuildTag -tag 'SignedOff'
displayName: Signoff Release-Automation run
- stage: UpdateChangeLog
displayName: Update the changelog
# do not include stages that are likely to fail in dependency as there is no way to force deploy.
dependsOn:
- MSIXBundle
- ValidateSDK
- PRCreation
- StaticPkgValidation
- StartDocker
- ManualValidation
- ValidateFxdPackage
- ValidateGlobalTool
jobs:
- template: templates/release/approvalJob.yml
parameters:
displayName: Make sure the changelog is updated
jobName: MergeChangeLog
instructions: |
Update and merge the changelog for the release.
This step is required for creating GitHub draft release.
- stage: BlobPublic
displayName: Make Blob Public
# do not include stages that are likely to fail in dependency as there is no way to force deploy.
dependsOn: UpdateChangeLog
# The environment here is used for approval.
jobs:
- deployment: AzureBlobPublic
displayName: Make Azure Blob Public
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
variables:
- group: 'Staging_ACR'
environment: PSReleaseAzureBlobPublic
strategy:
runOnce:
deploy:
steps:
- template: templates/release-MakeContainerPublic.yml
- template: templates/release/approvalJob.yml
parameters:
displayName: Copy Global tool packages to PSInfra storage
jobName: CopyBlobApproval
instructions: |
Approval for Copy global tool packages to PSInfra storage
- job: PSInfraBlobPublic
displayName: Copy global tools to PSInfra storage
dependsOn: CopyBlobApproval
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
variables:
- group: 'PSInfraStorage'
steps:
- template: templates/release-CopyGlobalTools.yml
parameters:
sourceContainerName: 'tool-private'
destinationContainerName: 'tool'
sourceStorageAccountName: '$(GlobalToolStorageAccount)'
destinationStorageAccountName: '$(PSInfraStorageAccount)'
blobPrefix: '$(Version)'
- stage: GitHubTasks
displayName: GitHub tasks
dependsOn: BlobPublic
jobs:
- job: GitHubDraft
displayName: Create GitHub Draft release
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
variables:
- group: 'Azure Blob variable group'
- group: mscodehub-feed-read-general
- group: mscodehub-feed-read-akv
- group: ReleasePipelineSecrets
steps:
- template: templates/release-CreateGitHubDraft.yml
- deployment: PushTag
dependsOn: GitHubDraft
displayName: Push Git Tag
pool : server
environment: PSReleasePushTag
- deployment: MakeDraftPublic
dependsOn: PushTag
displayName: Make GitHub Draft public
pool : server
environment: PSReleaseDraftPublic
- stage: PublishPackages
displayName: Publish packages
dependsOn: GitHubTasks
jobs:
- job: PublishNuget
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
steps:
- template: templates/release-ReleaseToNuGet.yml
parameters:
skipPublish: ${{ parameters.skipNugetPublish }}
- job: PublishPkgsMsftCom
timeoutInMinutes: 120
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMSUbuntu20.04-Secure
variables:
- group: mscodehub-feed-read-general
- group: mscodehub-feed-read-akv
- group: 'packages.microsoft.com'
- group: 'mscodehub-code-read-akv'
steps:
- template: templates/release-PublishPackageMsftCom.yml
parameters:
skipPublish: ${{ parameters.skipPackagesMsftComPublish }}
- stage: PublishSymbols
displayName: Publish symbols
dependsOn: PublishPackages
jobs:
- job: PublishSymbol
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
steps:
- template: templates/release-PublishSymbols.yml
- stage: ChangesToMaster
displayName: Ensure changes are in GH master
dependsOn: PublishPackages
jobs:
- template: templates/release/approvalJob.yml
parameters:
displayName: Make sure changes are in master
jobName: MergeToMaster
instructions: |
Make sure that changes README.md and metadata.json are merged into master on GitHub.
- stage: ReleaseDocker
displayName: Release Docker
dependsOn:
- GitHubTasks
jobs:
- deployment: ReleaseDocker
displayName: Release Docker
pool: server
environment: PSReleaseDockerRelease
- stage: ReleaseSnap
displayName: Release Snap
dependsOn:
- PublishPackages
- ChangesToMaster
variables:
# adds newPwshOrgName (exists in new and old org)
- group: PowerShellRelease
jobs:
- job: KickoffSnap
displayName: Kickoff Snap build
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
steps:
- checkout: Internal-PowerShellTeam-Tools
- task: DownloadPipelineArtifact@2
inputs:
source: specific
project: PowerShellCore
pipeline: '696'
preferTriggeringPipeline: true
runVersion: latestFromBranch
runBranch: '$(Build.SourceBranch)'
artifact: metadata
path: '$(Pipeline.Workspace)/releasePipeline/metadata'
- pwsh: |
Import-Module $(Build.SourcesDirectory)\ReleaseTools\AzDO -Force
Set-AzDoProjectInfo -ProjectOwner PowerShell-Rel -ProjectName PowerShell
Set-AzDoAuthToken -Token $(powershellRelExecutionPat)
$metadata = Get-Content -Raw -Path '$(Pipeline.Workspace)/releasePipeline/metadata/release.json' | ConvertFrom-Json
$buildInvocationInfo = Start-AzDOBuild -BuildDefinitionId 49 -Tag $metadata.ReleaseVersion, 'InProgress' -PassThru
Write-Verbose -Verbose "Kicked off snap build: $($buildInvocationInfo.WebUrl)"
$status = $buildInvocationInfo | Wait-AzDOBuildStatus -Status Completed -timeoutMinutes 60
if ($status.result -ne 'Succeeded') {
throw "There are errors in snap build!!"
}
- template: templates/release/approvalJob.yml
parameters:
displayName: Approve the release
jobName: SnapEnd
dependsOnJob: KickoffSnap
instructions: |
Once the build is finished, approve the release of all channels.
- job: MarkSnapSignOff
displayName: Mark release automation signoff
dependsOn: SnapEnd
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
steps:
- checkout: Internal-PowerShellTeam-Tools
- task: DownloadPipelineArtifact@2
inputs:
source: specific
project: PowerShellCore
pipeline: '696'
preferTriggeringPipeline: true
runVersion: latestFromBranch
runBranch: '$(Build.SourceBranch)'
artifact: metadata
path: '$(Pipeline.Workspace)/releasePipeline/metadata'
- pwsh: |
Import-Module $(Build.SourcesDirectory)\ReleaseTools\AzDO -Force
Set-AzDoProjectInfo -ProjectOwner PowerShell-Rel -ProjectName PowerShell
Set-AzDoAuthToken -Token $(powershellRelExecutionPat)
$metadata = Get-Content -Raw -Path '$(Pipeline.Workspace)/releasePipeline/metadata/release.json' | ConvertFrom-Json
$azDOBuild = Get-AzDOBuild -buildDefinitionId 49 -MaximumResult 100 | Where-Object { $_.tags -in $metadata.ReleaseVersion }
$azDoBuild | Remove-AzDOBuildTag -tag 'InProgress' -Pass | Add-AzDOBuildTag -tag 'SignedOff'
displayName: Signoff Release-Automation run
- stage: ReleaseToMU
displayName: Release to MU
dependsOn:
- PublishPackages
- ChangesToMaster
jobs:
- template: templates/release/approvalJob.yml
parameters:
displayName: Release to MU
instructions: |
Notify the PM team to start the process of releasing to MU.
- stage: UpdateDotnetDocker
dependsOn: GitHubTasks
displayName: Update DotNet SDK Docker images
jobs:
- template: templates/release/approvalJob.yml
parameters:
displayName: Update .NET SDK docker images
jobName: DotnetDocker
instructions: |
Create PR for updating dotnet-docker images to use latest PowerShell version.
1. Fork and clone https://github.com/dotnet/dotnet-docker.git
2. git checkout upstream/nightly -b updatePS
3. dotnet run --project .\eng\update-dependencies\ -- <dotnetversion> --product-version powershell=<powershellversion> --compute-shas
4. create PR targeting nightly branch
- stage: UpdateWinGet
dependsOn: GitHubTasks
displayName: Add manifest entry to winget
jobs:
- template: templates/release/approvalJob.yml
parameters:
displayName: Add manifest entry to winget
jobName: UpdateWinGet
instructions: |
This is typically done by the community 1-2 days after the release.
- stage: PublishMsix
dependsOn: GitHubTasks
displayName: Publish MSIX to store
jobs:
- template: templates/release/approvalJob.yml
parameters:
displayName: Publish the MSIX Bundle package to store
jobName: PublishMsix
instructions: |
Ask Steve to release MSIX bundle package to Store
- stage: BuildInfoJson
dependsOn: GitHubTasks
displayName: Upload BuildInfoJson
jobs:
- deployment: UploadJson
displayName: Upload BuildInfoJson
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
variables:
- group: 'Azure Blob variable group'
environment: PSReleaseBuildInfoJson
strategy:
runOnce:
deploy:
steps:
- template: templates/release-BuildJson.yml
- stage: ReleaseVPack
dependsOn: GitHubTasks
displayName: Release VPack
jobs:
- job: KickoffvPack
displayName: Kickoff vPack build
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
steps:
- checkout: Internal-PowerShellTeam-Tools
- task: DownloadPipelineArtifact@2
inputs:
source: specific
project: PowerShellCore
pipeline: '696'
preferTriggeringPipeline: true
runVersion: latestFromBranch
runBranch: '$(Build.SourceBranch)'
artifact: metadata
path: '$(Pipeline.Workspace)/releasePipeline/metadata'
- pwsh: |
Import-Module $(Build.SourcesDirectory)\ReleaseTools\AzDO -Force
Set-AzDoProjectInfo -ProjectOwner mscodehub -ProjectName PowerShellCore
Set-AzDoAuthToken -Token $(mscodehubBuildExecutionPat)
$metadata = Get-Content -Raw -Path '$(Pipeline.Workspace)/releasePipeline/metadata/release.json' | ConvertFrom-Json
$releaseVersion = $metadata.ReleaseVersion -replace '^v',''
$semanticVersion = [System.Management.Automation.SemanticVersion]$releaseVersion
$isPreview = $semanticVersion.PreReleaseLabel -ne $null
if (-not $isPreview) {
$buildInvocationInfo = Start-AzDOBuild -BuildDefinitionId 1238 -Branch '$(Build.SourceBranch)' -Tag $metadata.ReleaseVersion, 'InProgress' -PassThru
Write-Verbose -Verbose "Kicked off vPack build: $($buildInvocationInfo.WebUrl)"
$status = $buildInvocationInfo | Wait-AzDOBuildStatus -Status Completed -timeoutMinutes 60
if ($status.result -ne 'Succeeded') {
throw "There are errors in snap build!!"
}
else {
$buildInvocationInfo | Remove-AzDOBuildTag -tag 'InProgress' -Pass | Add-AzDOBuildTag -tag 'SignedOff'
}
}
else {
Write-Verbose -Verbose "This is a preview release with version: $semanticVersion skipping releasing vPack"
}
- stage: ReleaseDeps
dependsOn: GitHubTasks
displayName: Update pwsh.deps.json links
jobs:
- template: templates/release-UpdateDepsJson.yml
- stage: ReleaseClose
displayName: Finish Release
dependsOn:
- ReleaseVPack
- BuildInfoJson
- UpdateDotnetDocker
- ReleaseDocker
- ReleaseSnap
- ChangesToMaster
- ReleaseDeps
jobs:
- template: templates/release/approvalJob.yml
parameters:
displayName: Retain Build
jobName: RetainBuild
instructions: |
Retain the build
- template: templates/release/approvalJob.yml
parameters:
displayName: Delete release branch
jobName: DeleteBranch
instructions: |
Delete release
@@ -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,180 +0,0 @@
jobs:
- job: APIScan
variables:
- name: runCodesignValidationInjection
value : false
- name: NugetSecurityAnalysisWarningLevel
value: none
- name: ReleaseTagVar
value: fromBranch
# Defines the variables APIScanClient, APIScanTenant and APIScanSecret
- group: PS-PS-APIScan
# PAT permissions NOTE: Declare a SymbolServerPAT variable in this group with a 'microsoft' organizanization scoped PAT with 'Symbols' Read permission.
# A PAT in the wrong org will give a single Error 203. No PAT will give a single Error 401, and individual pdbs may be missing even if permissions are correct.
- group: symbols
- name: branchCounterKey
value: $[format('{0:yyyyMMdd}-{1}', pipeline.startTime,variables['Build.SourceBranch'])]
- name: branchCounter
value: $[counter(variables['branchCounterKey'], 1)]
- group: DotNetPrivateBuildAccess
- group: Azure Blob variable group
- group: ReleasePipelineSecrets
- group: mscodehub-feed-read-general
- group: mscodehub-feed-read-akv
pool:
name: PowerShell1ES
demands:
- ImageOverride -equals PSMMS2019-Secure
# APIScan can take a long time
timeoutInMinutes: 180
steps:
- template: ../SetVersionVariables.yml
parameters:
ReleaseTagVar: $(ReleaseTagVar)
CreateJson: yes
UseJson: no
- template: ../insert-nuget-config-azfeed.yml
parameters:
repoRoot: '$(Build.SourcesDirectory)'
- pwsh: |
Import-Module .\build.psm1 -force
Start-PSBootstrap
workingDirectory: '$(Build.SourcesDirectory)'
retryCountOnTaskFailure: 2
displayName: 'Bootstrap'
env:
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
- pwsh: |
Import-Module .\build.psm1 -force
Find-DotNet
dotnet tool install dotnet-symbol --tool-path $(Agent.ToolsDirectory)\tools\dotnet-symbol
$symbolToolPath = Get-ChildItem -Path $(Agent.ToolsDirectory)\tools\dotnet-symbol\dotnet-symbol.exe | Select-Object -First 1 -ExpandProperty FullName
Write-Host "##vso[task.setvariable variable=symbolToolPath]$symbolToolPath"
displayName: Install dotnet-symbol
retryCountOnTaskFailure: 2
- 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"
$winverifySymbolsPath = New-Item -ItemType Directory -Path '$(System.ArtifactsDirectory)/winverify-symbols' -Force
Write-Host "##vso[task.setvariable variable=winverifySymbolsPath]$winverifySymbolsPath"
& $azcopy cp https://$(StorageAccount).blob.core.windows.net/winverify-private $winverifySymbolsPath --recursive
Get-ChildItem $winverifySymbolsPath -Recurse | Out-String | Write-Verbose -Verbose
displayName: Download winverify-private Artifacts
retryCountOnTaskFailure: 2
env:
AZCOPY_AUTO_LOGIN_TYPE: MSI
- pwsh: |
Import-Module .\build.psm1 -force
Find-DotNet
Start-PSBuild -Configuration StaticAnalysis -PSModuleRestore -Clean -Runtime fxdependent-win-desktop
$OutputFolder = Split-Path (Get-PSOutput)
Write-Host "##vso[task.setvariable variable=BinDir]$OutputFolder"
Write-Verbose -Verbose -Message "Deleting ref folder from output folder"
if (Test-Path $OutputFolder/ref) {
Remove-Item -Recurse -Force $OutputFolder/ref
}
workingDirectory: '$(Build.SourcesDirectory)'
displayName: 'Build PowerShell Source'
- pwsh: |
Get-ChildItem -Path env: | Out-String -width 9999 -Stream | write-Verbose -Verbose
displayName: Capture Environment
condition: succeededOrFailed()
# Explicitly download symbols for the drop since the SDL image doesn't have http://SymWeb access and APIScan cannot handle https yet.
- pwsh: |
Import-Module .\build.psm1 -force
Find-DotNet
$pat = '$(SymbolServerPAT)'
if ($pat -like '*PAT*' -or $pat -eq '')
{
throw 'No PAT defined'
}
$url = 'https://microsoft.artifacts.visualstudio.com/defaultcollection/_apis/symbol/symsrv'
$(symbolToolPath) --authenticated-server-path $(SymbolServerPAT) $url --symbols -d "$env:BinDir\*" --recurse-subdirectories
displayName: 'Download Symbols for binaries'
retryCountOnTaskFailure: 2
workingDirectory: '$(Build.SourcesDirectory)'
- pwsh: |
Get-ChildItem '$(BinDir)' -File -Recurse |
Foreach-Object {
[pscustomobject]@{
Path = $_.FullName
Version = $_.VersionInfo.FileVersion
Md5Hash = (Get-FileHash -Algorithm MD5 -Path $_.FullName).Hash
Sha512Hash = (Get-FileHash -Algorithm SHA512 -Path $_.FullName).Hash
}
} | Export-Csv -Path '$(Build.SourcesDirectory)/ReleaseFileHash.csv'
displayName: 'Create release file hash artifact'
- task: PublishBuildArtifacts@1
displayName: 'Publish Build File Hash artifact'
inputs:
pathToPublish: '$(Build.SourcesDirectory)/ReleaseFileHash.csv'
artifactName: ReleaseFilesHash
retryCountOnTaskFailure: 2
- task: securedevelopmentteam.vss-secure-development-tools.build-task-apiscan.APIScan@2
displayName: 'Run APIScan'
inputs:
softwareFolder: '$(BinDir)'
softwareName: PowerShell
softwareVersionNum: '$(ReleaseTagVar)'
isLargeApp: false
preserveTempFiles: false
verbosityLevel: standard
# write a status update every 5 minutes. Default is 1 minute
statusUpdateInterval: '00:05:00'
env:
AzureServicesAuthConnectionString: RunAs=App
- task: securedevelopmentteam.vss-secure-development-tools.build-task-report.SdtReport@2
continueOnError: true
displayName: 'Guardian Export'
inputs:
GdnExportVstsConsole: true
GdnExportSarifFile: true
GdnExportHtmlFile: true
GdnExportAllTools: false
GdnExportGdnToolApiScan: true
#this didn't do anything GdnExportCustomLogsFolder: '$(Build.ArtifactStagingDirectory)/Guardian'
- task: TSAUpload@2
displayName: 'TSA upload'
inputs:
GdnPublishTsaOnboard: false
GdnPublishTsaConfigFile: '$(Build.SourcesDirectory)\tools\guardian\tsaconfig-APIScan.json'
- pwsh: |
Get-ChildItem -Path env: | Out-String -width 9999 -Stream | write-Verbose -Verbose
displayName: Capture Environment
condition: succeededOrFailed()
- task: securedevelopmentteam.vss-secure-development-tools.build-task-publishsecurityanalysislogs.PublishSecurityAnalysisLogs@3
displayName: 'Publish Guardian Artifacts'
inputs:
AllTools: false
APIScan: true
ArtifactName: APIScan
@@ -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,139 +0,0 @@
parameters:
- name: PackageVersion
- name: PackagePath
- name: WinFxdPath
- name: LinuxFxdPath
- name: ListOfFiles
type: object
default:
- Microsoft.Management.Infrastructure.CimCmdlets.dll
- Microsoft.PowerShell.Commands.Diagnostics.dll
- Microsoft.PowerShell.Commands.Management.dll
- Microsoft.PowerShell.Commands.Utility.dll
- Microsoft.PowerShell.ConsoleHost.dll
- Microsoft.PowerShell.CoreCLR.Eventing.dll
- Microsoft.PowerShell.Security.dll
- Microsoft.PowerShell.SDK.dll
- Microsoft.WSMan.Management.dll
- Microsoft.WSMan.Runtime.dll
- System.Management.Automation.dll
steps:
- template: /.pipelines/templates/insert-nuget-config-azfeed.yml@self
parameters:
repoRoot: $(REPOROOT)
- pwsh: |
Import-Module "$env:REPOROOT/build.psm1" -Force
Start-PSBootstrap
$sharedModules = @('Microsoft.PowerShell.Commands.Management',
'Microsoft.PowerShell.Commands.Utility',
'Microsoft.PowerShell.ConsoleHost',
'Microsoft.PowerShell.Security',
'System.Management.Automation'
)
$winOnlyModules = @('Microsoft.Management.Infrastructure.CimCmdlets',
'Microsoft.PowerShell.Commands.Diagnostics',
'Microsoft.PowerShell.CoreCLR.Eventing',
'Microsoft.WSMan.Management',
'Microsoft.WSMan.Runtime'
)
$refAssemblyFolder = Join-Path '$(System.ArtifactsDirectory)' 'RefAssembly'
$null = New-Item -Path $refAssemblyFolder -Force -Verbose -Type Directory
Start-PSBuild -Clean -Runtime linux-x64 -Configuration Release
$sharedModules | Foreach-Object {
$refFile = Get-ChildItem -Path "$env:REPOROOT\src\$_\obj\Release\net9.0\refint\$_.dll"
Write-Verbose -Verbose "RefAssembly: $refFile"
Copy-Item -Path $refFile -Destination "$refAssemblyFolder\$_.dll" -Verbose
$refDoc = "$env:REPOROOT\src\$_\bin\Release\net9.0\$_.xml"
if (-not (Test-Path $refDoc)) {
Write-Warning "$refDoc not found"
Get-ChildItem -Path "$env:REPOROOT\src\$_\bin\Release\net9.0\" | Out-String | Write-Verbose -Verbose
}
else {
Copy-Item -Path $refDoc -Destination "$refAssemblyFolder\$_.xml" -Verbose
}
}
Start-PSBuild -Clean -Runtime win7-x64 -Configuration Release
$winOnlyModules | Foreach-Object {
$refFile = Get-ChildItem -Path "$env:REPOROOT\src\$_\obj\Release\net9.0\refint\*.dll"
Write-Verbose -Verbose 'RefAssembly: $refFile'
Copy-Item -Path $refFile -Destination "$refAssemblyFolder\$_.dll" -Verbose
$refDoc = "$env:REPOROOT\src\$_\bin\Release\net9.0\$_.xml"
if (-not (Test-Path $refDoc)) {
Write-Warning "$refDoc not found"
Get-ChildItem -Path "$env:REPOROOT\src\$_\bin\Release\net9.0" | Out-String | Write-Verbose -Verbose
}
else {
Copy-Item -Path $refDoc -Destination "$refAssemblyFolder\$_.xml" -Verbose
}
}
Get-ChildItem $refAssemblyFolder -Recurse | Out-String | Write-Verbose -Verbose
# Set RefAssemblyPath path variable
$vstsCommandString = "vso[task.setvariable variable=RefAssemblyPath]${refAssemblyFolder}"
Write-Host "sending " + $vstsCommandString
Write-Host "##$vstsCommandString"
displayName: Build reference assemblies
env:
__DOTNET_RUNTIME_FEED: $(RUNTIME_SOURCEFEED)
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
- ${{ each value in parameters.ListOfFiles }}:
- pwsh: |
$FileName = '${{ value }}'
$FileBaseName = [System.IO.Path]::GetFileNameWithoutExtension($FileName)
$FilePackagePath = Join-Path -Path '${{ parameters.PackagePath }}' -ChildPath $FileBaseName
$CGManifestPath = Join-Path -Path '${{ parameters.PackagePath }}' -ChildPath 'CGManifest'
Write-Verbose -Verbose "FileName to package: $FileName"
Write-Verbose -Verbose "FilePackage path: $FilePackagePath"
Write-Verbose -Verbose "CGManifest path: $CGManifestPath"
# Set SBOM package name
$vstsCommandString = "vso[task.setvariable variable=SbomFilePackageName]${FileBaseName}"
Write-Host "sending " + $vstsCommandString
Write-Host "##$vstsCommandString"
# Set SBOM package path variable
$vstsCommandString = "vso[task.setvariable variable=SbomFilePackagePath]${FilePackagePath}"
Write-Host "sending " + $vstsCommandString
Write-Host "##$vstsCommandString"
# Set CGManifest path variable
$vstsCommandString = "vso[task.setvariable variable=CGManifestPath]${CGManifestPath}"
Write-Host "sending " + $vstsCommandString
Write-Host "##$vstsCommandString"
# Create Nuget package sources
Import-Module -Name $env:REPOROOT\build.psm1
Import-Module -Name $env:REPOROOT\tools\packaging
Find-DotNet
New-ILNugetPackageSource -File $FileName -PackagePath '${{ parameters.PackagePath }}' -PackageVersion '${{ parameters.PackageVersion }}' -WinFxdBinPath '${{ parameters.WinFxdPath }}' -LinuxFxdBinPath '${{ parameters.LinuxFxdPath }}' -CGManifestPath $CGManifestPath -RefAssemblyPath $(RefAssemblyPath)
displayName: 'Create NuGet Package source for single file'
- template: Sbom.yml@ComplianceRepo
parameters:
BuildDropPath: $(SbomFilePackagePath)
Build_Repository_Uri: 'https://github.com/powershell/powershell'
PackageName: $(SbomFilePackageName)
PackageVersion: ${{ parameters.PackageVersion }}
sourceScanPath: $(CGManifestPath)
displayName: SBOM for NuGetPkg
- pwsh: |
$FileName = '${{ value }}'
$FileBaseName = [System.IO.Path]::GetFileNameWithoutExtension($FileName)
$FilePackagePath = Join-Path -Path '${{ parameters.PackagePath }}' -ChildPath $FileBaseName
Write-Verbose -Verbose "FileName to package: $FileName"
Write-Verbose -Verbose "FilePackage path: $FilePackagePath"
Import-Module -Name $env:REPOROOT\build.psm1
Import-Module -Name $env:REPOROOT\tools\packaging
Find-DotNet
New-ILNugetPackageFromSource -FileName $FileName -PackageVersion '${{ parameters.PackageVersion }}' -PackagePath '${{ parameters.PackagePath }}'
displayName: 'Create NuGet Package for single file'
@@ -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,148 +0,0 @@
parameters:
jobName: ""
displayName: ""
imageName: ""
jobs:
- job: ${{ parameters.jobName }}
displayName: ${{ parameters.displayName }}
pool:
# testing
vmImage: ${{ parameters.imageName }}
variables:
- group: mscodehub-feed-read-general
- group: mscodehub-feed-read-akv
- 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'
- task: DownloadPipelineArtifact@2
inputs:
source: specific
project: PowerShellCore
pipeline: '696'
preferTriggeringPipeline: true
runVersion: latestFromBranch
runBranch: '$(Build.SourceBranch)'
artifact: metadata
path: '$(Pipeline.Workspace)/releasePipeline/metadata'
- template: /.pipelines/templates/insert-nuget-config-azfeed.yml@self
parameters:
repoRoot: $(Build.SourcesDirectory)
- pwsh: |
Import-Module "$(Build.SourcesDirectory)/build.psm1" -Force
Write-Verbose -Verbose "Capture hosting folder files"
Get-ChildItem '$(Build.SourcesDirectory)/test/hosting'
# The above cmdlet creates a lower-case nuget.config. There also exists a NuGet.config which we needed to replace.
# Hence the following workaround
if (-not $IsWindows) {
Move-Item -Path '$(Build.SourcesDirectory)/test/hosting/nuget.config' -Destination '$(Build.SourcesDirectory)/test/hosting/NuGet.Config' -Force -ErrorAction Continue
Write-Verbose -Verbose "Capture hosting folder files after Move-Item"
Get-ChildItem '$(Build.SourcesDirectory)/test/hosting'
}
if(-not (Test-Path "$(Build.SourcesDirectory)/test/hosting/NuGet.Config"))
{
throw "NuGet.Config is not created"
}
else
{
Write-Verbose -Verbose "Capture NuGet.Config contents"
Get-Content "$(Build.SourcesDirectory)/test/hosting/NuGet.Config" -Raw
}
displayName: Insert internal nuget feed
- 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: |
$env:DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
Import-Module "$(Build.SourcesDirectory)/build.psm1" -Force
Start-PSBootstrap
$localLocation = "$(Pipeline.Workspace)/releasePipeline/finalResults"
$xmlElement = @"
<add key=`"local`" value=`"$localLocation`" />
<add key="dotnet" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet9/nuget/v2" />
</packageSources>
"@
$releaseVersion = Get-Content "$(Pipeline.Workspace)/releasePipeline/metadata/release.json" | ConvertFrom-Json | Select-Object -ExpandProperty 'ReleaseVersion'
Set-Location -Path $(Build.SourcesDirectory)/test/hosting
Get-ChildItem
## register the packages download directory in the nuget file
$nugetConfigContent = Get-Content ./NuGet.Config -Raw
$updateNugetContent = $nugetConfigContent.Replace("</packageSources>", $xmlElement)
$updateNugetContent | Out-File ./NuGet.Config -Encoding ascii
Get-Content ./NuGet.Config
# Add workaround to unblock xUnit testing see issue: https://github.com/dotnet/sdk/issues/26462
$dotnetPath = if ($IsWindows) { "$env:LocalAppData\Microsoft\dotnet" } else { "$env:HOME/.dotnet" }
$env:DOTNET_ROOT = $dotnetPath
dotnet --info
dotnet restore
dotnet test /property:RELEASE_VERSION=$releaseVersion --test-adapter-path:. "--logger:xunit;LogFilePath=$(System.DefaultWorkingDirectory)/test-hosting.xml"
displayName: Restore and execute tests
env:
__DOTNET_RUNTIME_FEED_KEY: $(RUNTIME_SOURCEFEED_KEY)
- task: PublishTestResults@2
displayName: 'Publish Test Results **\test-hosting.xml'
inputs:
testResultsFormat: XUnit
testResultsFiles: '**\test-hosting.xml'
@@ -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
-336
View File
@@ -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
-6
View File
@@ -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>
-161
View File
@@ -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
View File
@@ -1 +0,0 @@
pwsh -command ".\setReleaseTag.ps1 $*"
-49
View File
@@ -1,49 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<SignConfigXML>
<!-- ****Begin**** AuthenticodeFormer and should be StrongName, but we will add this in 6.1.0 ******** -->
<job platform="" configuration="" dest="__OUTPATHROOT__\signed" jobname="PowerShell Core" approvers="vigarg;gstolt">
<file src="__INPATHROOT__\Microsoft.Management.Infrastructure.CimCmdlets.dll" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Microsoft.Management.Infrastructure.CimCmdlets.dll" />
<file src="__INPATHROOT__\Microsoft.PowerShell.Commands.Diagnostics.dll" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Microsoft.PowerShell.Commands.Diagnostics.dll" />
<file src="__INPATHROOT__\Microsoft.PowerShell.Commands.Management.dll" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Microsoft.PowerShell.Commands.Management.dll" />
<file src="__INPATHROOT__\Microsoft.PowerShell.Commands.Utility.dll" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Microsoft.PowerShell.Commands.Utility.dll" />
<file src="__INPATHROOT__\Microsoft.PowerShell.ConsoleHost.dll" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Microsoft.PowerShell.ConsoleHost.dll" />
<file src="__INPATHROOT__\Microsoft.PowerShell.CoreCLR.Eventing.dll" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Microsoft.PowerShell.CoreCLR.Eventing.dll" />
<file src="__INPATHROOT__\Microsoft.PowerShell.GlobalTool.Shim.dll" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Microsoft.PowerShell.GlobalTool.Shim.dll" />
<file src="__INPATHROOT__\Microsoft.PowerShell.Security.dll" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Microsoft.PowerShell.Security.dll" />
<file src="__INPATHROOT__\Microsoft.WSMan.Management.dll" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Microsoft.WSMan.Management.dll" />
<file src="__INPATHROOT__\Microsoft.WSMan.Runtime.dll" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Microsoft.WSMan.Runtime.dll" />
<file src="__INPATHROOT__\System.Management.Automation.dll" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\System.Management.Automation.dll" />
<file src="__INPATHROOT__\pwsh.dll" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\pwsh.dll" />
<!-- not actually a code file, don't sign for now
<file src="__INPATHROOT__\Microsoft.PowerShell.SDK.dll" signType="BothDual" dest="__OUTPATHROOT__\Microsoft.PowerShell.SDK.dll" />
-->
<!-- ****Begin**** AuthenticodeFormer ************* -->
<!-- be sure to sign the global tool shim -->
<file src="__INPATHROOT__\Microsoft.PowerShell.GlobalTool.Shim.exe" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Microsoft.PowerShell.GlobalTool.Shim.exe" />
<file src="__INPATHROOT__\pwsh.exe" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\pwsh.exe" />
<!-- ****Begin**** AuthenticodeFormer - Authenticode SHA256 ************* -->
<!-- PowerShell script files cannot be dual signed, so we will sign them only with a SHA256 cert -->
<file src="__INPATHROOT__\Install-PowerShellRemoting.ps1" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Install-PowerShellRemoting.ps1" />
<file src="__INPATHROOT__\RegisterManifest.ps1" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\RegisterManifest.ps1" />
<file src="__INPATHROOT__\InstallPSCorePolicyDefinitions.ps1" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\InstallPSCorePolicyDefinitions.ps1" />
<file src="__INPATHROOT__\Modules\CimCmdlets\CimCmdlets.psd1" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Modules\CimCmdlets\CimCmdlets.psd1" />
<file src="__INPATHROOT__\Modules\Microsoft.PowerShell.Diagnostics\Microsoft.PowerShell.Diagnostics.psd1" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Modules\Microsoft.PowerShell.Diagnostics\Microsoft.PowerShell.Diagnostics.psd1" />
<file src="__INPATHROOT__\Modules\Microsoft.PowerShell.Host\Microsoft.PowerShell.Host.psd1" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Modules\Microsoft.PowerShell.Host\Microsoft.PowerShell.Host.psd1" />
<file src="__INPATHROOT__\Modules\Microsoft.PowerShell.Management\Microsoft.PowerShell.Management.psd1" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Modules\Microsoft.PowerShell.Management\Microsoft.PowerShell.Management.psd1" />
<file src="__INPATHROOT__\Modules\Microsoft.PowerShell.Security\Microsoft.PowerShell.Security.psd1" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Modules\Microsoft.PowerShell.Security\Microsoft.PowerShell.Security.psd1" />
<file src="__INPATHROOT__\Modules\Microsoft.PowerShell.Utility\Microsoft.PowerShell.Utility.psd1" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Modules\Microsoft.PowerShell.Utility\Microsoft.PowerShell.Utility.psd1" />
<file src="__INPATHROOT__\Modules\Microsoft.WSMan.Management\Microsoft.WSMan.Management.psd1" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Modules\Microsoft.WSMan.Management\Microsoft.WSMan.Management.psd1" />
<file src="__INPATHROOT__\Modules\PSDiagnostics\PSDiagnostics.psd1" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Modules\PSDiagnostics\PSDiagnostics.psd1" />
<file src="__INPATHROOT__\Modules\PSDiagnostics\PSDiagnostics.psm1" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Modules\PSDiagnostics\PSDiagnostics.psm1" />
<file src="__INPATHROOT__\Modules\Microsoft.WSMan.Management\WSMan.format.ps1xml" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Modules\Microsoft.WSMan.Management\WSMan.format.ps1xml" />
<file src="__INPATHROOT__\Modules\Microsoft.PowerShell.Diagnostics\Event.format.ps1xml" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Modules\Microsoft.PowerShell.Diagnostics\Event.format.ps1xml" />
<file src="__INPATHROOT__\Modules\Microsoft.PowerShell.Diagnostics\GetEvent.types.ps1xml" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Modules\Microsoft.PowerShell.Diagnostics\GetEvent.types.ps1xml" />
<file src="__INPATHROOT__\Modules\Microsoft.PowerShell.Diagnostics\Diagnostics.format.ps1xml" signType="AuthenticodeFormer" dest="__OUTPATHROOT__\Modules\Microsoft.PowerShell.Diagnostics\Diagnostics.format.ps1xml" />
</job>
</SignConfigXML>
-46
View File
@@ -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)
-120
View File
@@ -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
View File
@@ -1 +0,0 @@
pwsh -command ".\vstsbuild.ps1 $*"