From 3ea62d3bba36a10b6b9540ec5af1aabee97be3e0 Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Fri, 1 Feb 2019 10:59:01 -0800 Subject: [PATCH] Move Final artifacts from universal build to `finalResults` folder (#8806) ## PR Summary Move Final artifacts from universal build to `finalResults` folder --- .vscode/extensions.json | 3 +- .vsts-ci/linux.yml | 2 +- .vsts-ci/mac.yml | 2 +- .vsts-ci/windows.yml | 2 +- tools/releaseBuild/README.md | 56 +++++++--- tools/releaseBuild/azureDevOps/diagram.png | Bin 53397 -> 0 bytes tools/releaseBuild/azureDevOps/diagram.puml | 102 ++++++++++++------ tools/releaseBuild/azureDevOps/diagram.svg | 98 +++++++++++++++++ .../azureDevOps/templates/compliance.yml | 2 + ...fig.yml => insert-nuget-config-azfeed.yml} | 0 .../azureDevOps/templates/linux.yml | 14 ++- .../templates/mac-package-signing.yml | 24 ++--- .../templates/upload-final-results.yml | 14 +++ .../azureDevOps/templates/upload.yml | 24 ++--- .../azureDevOps/templates/windows-build.yml | 2 +- .../windows-component-governance.yml | 2 +- 16 files changed, 259 insertions(+), 88 deletions(-) delete mode 100644 tools/releaseBuild/azureDevOps/diagram.png create mode 100644 tools/releaseBuild/azureDevOps/diagram.svg rename tools/releaseBuild/azureDevOps/templates/{insert-nuget-config.yml => insert-nuget-config-azfeed.yml} (100%) create mode 100644 tools/releaseBuild/azureDevOps/templates/upload-final-results.yml diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 310b1db2ec..ff3bc14d3a 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -7,6 +7,7 @@ "ms-vscode.PowerShell", "twxs.cmake", "DavidAnson.vscode-markdownlint", - "ms-azure-devops.azure-pipelines" + "ms-azure-devops.azure-pipelines", + "vitaliymaz.vscode-svg-previewer" ] } diff --git a/.vsts-ci/linux.yml b/.vsts-ci/linux.yml index 70279fe015..8fa3aa6b42 100644 --- a/.vsts-ci/linux.yml +++ b/.vsts-ci/linux.yml @@ -32,7 +32,7 @@ phases: displayName: Set TEMP to AGENT_TEMPDIRECTORY condition: succeededOrFailed() - - template: ../tools/releaseBuild/azureDevOps/templates/insert-nuget-config.yml + - template: ../tools/releaseBuild/azureDevOps/templates/insert-nuget-config-azfeed.yml - powershell: | sudo apt-get update diff --git a/.vsts-ci/mac.yml b/.vsts-ci/mac.yml index f7864b7cdc..b878ff3a19 100644 --- a/.vsts-ci/mac.yml +++ b/.vsts-ci/mac.yml @@ -25,7 +25,7 @@ phases: displayName: Set Build Name for Non-PR condition: ne(variables['Build.Reason'], 'PullRequest') - - template: ../tools/releaseBuild/azureDevOps/templates/insert-nuget-config.yml + - template: ../tools/releaseBuild/azureDevOps/templates/insert-nuget-config-azfeed.yml - powershell: | tools/travis.ps1 -Stage Bootstrap diff --git a/.vsts-ci/windows.yml b/.vsts-ci/windows.yml index 4b7d7c0b87..e8a6c15948 100644 --- a/.vsts-ci/windows.yml +++ b/.vsts-ci/windows.yml @@ -29,7 +29,7 @@ steps: displayName: Set Build Name for Non-PR condition: ne(variables['Build.Reason'], 'PullRequest') - - template: ../tools/releaseBuild/azureDevOps/templates/insert-nuget-config.yml + - template: ../tools/releaseBuild/azureDevOps/templates/insert-nuget-config-azfeed.yml - powershell: | [Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12 diff --git a/tools/releaseBuild/README.md b/tools/releaseBuild/README.md index 838933702f..9b78e742b5 100644 --- a/tools/releaseBuild/README.md +++ b/tools/releaseBuild/README.md @@ -1,33 +1,55 @@ -# VSTS Release Builds +# Azure Dev Ops Release Builds ## Requirements Docker must be installed to run any of the release builds. -## Running Windows Release Builds +## Running Windows Release Builds Locally From PowerShell on Windows, run `.\vstsbuild.ps1 -ReleaseTag -Name `. +For the package builds, run `.\vstsbuild.ps1 -ReleaseTag -Name -BuildPath -SignedFilesPath ` + Windows Build Names: - * `win7-x64` - * Builds the Universal Windows x64 Package - * `win7-x86` - * Builds the Universal Windows x86 Package - * `win7-x64-symbols` - * Builds the Windows x64 Zip with symbols - * `win7-x86-symbols` - * Builds the Windows x86 Zip with symbols +* `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 +## Running Linux Release Builds Locally From PowerShell on Linux or macOS, run `.\vstsbuild.ps1 -ReleaseTag -Name `. Linux Build Names: - * `ubuntu.14.04` - * Builds the Ubuntu 14.04 Package and AppImage Package - * `ubuntu.16.04` - * Builds the Ubuntu 16.04 Package - * `centos.7` - * Builds the CentOS 7 Package +* `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) diff --git a/tools/releaseBuild/azureDevOps/diagram.png b/tools/releaseBuild/azureDevOps/diagram.png deleted file mode 100644 index 0c5329719886ed9d1ce805be5bcf3440913d280a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53397 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 -archimate #Business "Build RPM" as BuildRPM <> -archimate #Business "Build Alpine" as BuildAlpine <> -archimate #Business "Build Linux-FxDependent" as BuildLinuxFx <> -archimate #Business "Upload DEB" as UploadDEB <> -archimate #Business "Upload RPM" as UploadRPM <> -archimate #Business "Upload Alpine" as UploadAlpine <> -archimate #Business "Upload Linux-FxDependent" as UploadLinuxFx <> +folder "Linux Builds" { + ' Define the build tasks as business processes + agent "DEB" as BuildDEB + agent "RPM" as BuildRPM + agent "Alpine" as BuildAlpine + agent "Linux-FxDependent" as BuildLinuxFx -archimate #Business "Build macOS" as BuildMac <> -archimate #Business "macOS Package Signing and Upload" as SignMac <> +} -archimate #Business "Build Windows - x64" as BuildWinX64 <> -archimate #Business "Build Windows - x86" as BuildWinX86 <> -archimate #Business "Build Windows - arm32" as BuildWinArm32 <> -archimate #Business "Build Windows - arm64" as BuildWinArm64 <> -archimate #Business "Build Windows - FxDependent" as BuildWinFx <> -archimate #Business "Windows Package Signing and Upload" as SignWin <> +agent "macOS Build" as BuildMac -archimate #Business "ComponentRegistration" as BuildCG <> +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 +} -archimate #Business "Compliance" as Compliance <> +agent "ComponentRegistration" as BuildCG + +folder "Linux Package Scanning and Upload" { + agent "DEB" as UploadDEB + agent "RPM" as UploadRPM + agent "Alpine" as UploadAlpine + agent "Linux-FxDependent" as UploadLinuxFx +} + +folder "Package Signing and Upload" { + agent "macOS" as SignMac + + agent "Windows" as SignWin +} + + +agent "Compliance" as Compliance + +folder "Create & Upload FxDependent DotNet SDK" { + agent "Linux" as BuildLinuxFxSdk + agent "Windows" as BuildWinFxSdk +} ' Define finishing the build as a goal filled -archimate #Goal "Finish" as Finish <> +control "Finish" as Finish +control "Start" as Start ' map the various Upload task dependencies BuildDEB -down-> UploadDEB @@ -37,25 +56,42 @@ BuildAlpine -down-> UploadAlpine BuildMac -down-> SignMac ' map all of the SignWin task dependencies -BuildWinX64 -down-> SignWin -BuildWinX86 -down-> SignWin -BuildWinArm32 -down-> SignWin -BuildWinArm64 -down-> SignWin -BuildWinFx -down-> SignWin +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 +BuildLinuxFx -down-> BuildLinuxFxSdk +SignWin -down-> BuildWinFxSdk + ' map all leafs to finish -Compliance -down-> Finish -UploadAlpine -down-> Finish -UploadDEB -down-> Finish -UploadRPM -down-> Finish -UploadLinuxFx -down-> Finish -SignWin -down-> Finish -SignMac -down-> Finish -BuildCG -down-> Finish +Compliance ~~ Finish +UploadAlpine ~~ Finish +UploadDEB ~~ Finish +UploadRPM ~~ Finish +UploadLinuxFx ~~ Finish +SignMac ~~ Finish +BuildCG ~~ Finish +BuildLinuxFxSdk ~~ Finish +BuildWinFxSdk ~~ Finish + +Start ~~ BuildDEB +Start ~~ BuildRPM +Start ~~ BuildAlpine +Start ~~ BuildLinuxFx +Start ~~ BuildMac +Start ~~ BuildWinX64 +Start ~~ BuildWinX86 +Start ~~ BuildWinFx +Start ~~ BuildWinArm32 +Start ~~ BuildWinArm64 +Start ~~ BuildCG @enduml diff --git a/tools/releaseBuild/azureDevOps/diagram.svg b/tools/releaseBuild/azureDevOps/diagram.svg new file mode 100644 index 0000000000..f17b357389 --- /dev/null +++ b/tools/releaseBuild/azureDevOps/diagram.svg @@ -0,0 +1,98 @@ +Linux BuildsWindows BuildsLinux Package Scanning and UploadPackage Signing and UploadCreate & Upload FxDependent DotNet SDKDEBRPMAlpineLinux-FxDependentx64x86arm32arm64FxDependentDEBRPMAlpineLinux-FxDependentmacOSWindowsLinuxWindowsmacOS BuildComponentRegistrationComplianceFinishStart \ No newline at end of file diff --git a/tools/releaseBuild/azureDevOps/templates/compliance.yml b/tools/releaseBuild/azureDevOps/templates/compliance.yml index 9255c247bd..f0d331423e 100644 --- a/tools/releaseBuild/azureDevOps/templates/compliance.yml +++ b/tools/releaseBuild/azureDevOps/templates/compliance.yml @@ -8,6 +8,8 @@ jobs: ${{ parameters.parentJobs }} pool: name: Package ES CodeHub Lab E + # APIScan can take a long time + timeoutInMinutes: 90 steps: - template: SetVersionVariables.yml diff --git a/tools/releaseBuild/azureDevOps/templates/insert-nuget-config.yml b/tools/releaseBuild/azureDevOps/templates/insert-nuget-config-azfeed.yml similarity index 100% rename from tools/releaseBuild/azureDevOps/templates/insert-nuget-config.yml rename to tools/releaseBuild/azureDevOps/templates/insert-nuget-config-azfeed.yml diff --git a/tools/releaseBuild/azureDevOps/templates/linux.yml b/tools/releaseBuild/azureDevOps/templates/linux.yml index 3da9d24062..dbe768258b 100644 --- a/tools/releaseBuild/azureDevOps/templates/linux.yml +++ b/tools/releaseBuild/azureDevOps/templates/linux.yml @@ -27,7 +27,7 @@ jobs: } displayName: 'Skip Alpine or fxdependent for PS v6.0.*' - - template: insert-nuget-config.yml + - template: insert-nuget-config-azfeed.yml - powershell: | @@ -81,7 +81,7 @@ jobs: displayName: 'Run Defender Scan' - task: AzureFileCopy@1 - displayName: 'Upload to azure deb and tar.gz' + displayName: 'Upload to Azure - DEB and tar.gz' inputs: SourcePath: '$(System.ArtifactsDirectory)\finished\release' azureSubscription: '$(AzureFileCopySubscription)' @@ -89,8 +89,12 @@ jobs: storage: '$(StorageAccount)' ContainerName: '$(AzureVersion)' + - template: upload-final-results.yml + parameters: + artifactPath: $(System.ArtifactsDirectory)\finished\release + - task: AzureFileCopy@1 - displayName: 'Upload to azure rpm' + displayName: 'Upload to Azure - RPM' inputs: SourcePath: '$(System.ArtifactsDirectory)\rpm\release' azureSubscription: '$(AzureFileCopySubscription)' @@ -98,3 +102,7 @@ jobs: storage: '$(StorageAccount)' ContainerName: '$(AzureVersion)-unsigned' condition: and(eq(variables['buildName'], 'RPM'),succeeded()) + + - template: upload-final-results.yml + parameters: + artifactPath: $(System.ArtifactsDirectory)\rpm\release diff --git a/tools/releaseBuild/azureDevOps/templates/mac-package-signing.yml b/tools/releaseBuild/azureDevOps/templates/mac-package-signing.yml index 68c536097e..f9f8fd7c72 100644 --- a/tools/releaseBuild/azureDevOps/templates/mac-package-signing.yml +++ b/tools/releaseBuild/azureDevOps/templates/mac-package-signing.yml @@ -52,19 +52,10 @@ jobs: signConfigXml: '$(System.ArtifactsDirectory)\package.xml' outPathRoot: '$(Build.StagingDirectory)\signedMacOSPackages' - - powershell: | - dir "$(System.ArtifactsDirectory)\*.tar.gz" -Recurse | foreach-object { - $fullname = $_.fullname - Write-Host "##vso[artifact.upload containerfolder=signed;artifactname=signed]$fullname" - } - displayName: 'Upload tar.gz' - - - powershell: | - dir "$(Build.StagingDirectory)\signedMacOSPackages\powershell-*.zip" -Recurse | foreach-object { - $fullname = $_.fullname - Write-Host "##vso[artifact.upload containerfolder=signed;artifactname=signed]$fullname" - } - displayName: 'Upload macOS signed package' + - template: upload-final-results.yml + parameters: + artifactPath: $(System.ArtifactsDirectory) + artifactFilter: "*.tar.gz" - powershell: | $destination = "$(System.ArtifactsDirectory)\azureMacOs" @@ -73,7 +64,12 @@ jobs: Expand-Archive -Path $zipPath -DestinationPath $destination $targzPath = dir "$(System.ArtifactsDirectory)\*.tar.gz" -Recurse | select-object -expandproperty fullname Copy-Item -Path $targzPath -Destination $destination - displayName: 'Extract and copy macOS artifacts for upload to azure' + displayName: 'Extract and copy macOS artifacts for upload' + + - template: upload-final-results.yml + parameters: + artifactPath: $(System.ArtifactsDirectory)\azureMacOs + artifactFilter: "*.pkg" - task: AzureFileCopy@1 displayName: 'AzureBlob File Copy' diff --git a/tools/releaseBuild/azureDevOps/templates/upload-final-results.yml b/tools/releaseBuild/azureDevOps/templates/upload-final-results.yml new file mode 100644 index 0000000000..287ca50ba5 --- /dev/null +++ b/tools/releaseBuild/azureDevOps/templates/upload-final-results.yml @@ -0,0 +1,14 @@ +parameters: + artifactPath: + artifactFilter: '*' + condition: succeeded() + +steps: + - powershell: | + Get-ChildItem -Path '${{ parameters.artifactPath }}' -File -filter '${{ parameters.artifactFilter }}' -ErrorAction SilentlyContinue | + Select-Object -ExpandProperty FullName | + ForEach-Object { + Write-Host "##vso[artifact.upload containerfolder=finalResults;artifactname=finalResults]$_" + } + displayName: Upload Final Artifacts ${{ parameters.artifactFilter }} from ${{ parameters.artifactPath }} + condition: ${{ parameters.condition }} diff --git a/tools/releaseBuild/azureDevOps/templates/upload.yml b/tools/releaseBuild/azureDevOps/templates/upload.yml index 8003917d07..f1402eb15c 100644 --- a/tools/releaseBuild/azureDevOps/templates/upload.yml +++ b/tools/releaseBuild/azureDevOps/templates/upload.yml @@ -4,14 +4,11 @@ parameters: msi: yes steps: -- powershell: | - $packagePath = "$(Build.StagingDirectory)\signedPackages\PowerShell-${{ parameters.version }}-win-${{ parameters.architecture }}.msi" - if(Test-Path -Path $packagePath) - { - Write-Host "##vso[artifact.upload containerfolder=signedResults;artifactname=signedResults]$packagePath" - } - displayName: '[create script] upload signed msi - ${{ parameters.architecture }}' - condition: and(succeeded(), eq('${{ parameters.msi }}', 'yes')) +- template: upload-final-results.yml + parameters: + artifactPath: $(Build.StagingDirectory)\signedPackages + artifactFilter: PowerShell-${{ parameters.version }}-win-${{ parameters.architecture }}.msi + condition: and(succeeded(), eq('${{ parameters.msi }}', 'yes')) - task: AzureFileCopy@1 displayName: 'upload signed msi to Azure - ${{ parameters.architecture }}' @@ -23,13 +20,10 @@ steps: ContainerName: '$(AzureVersion)' condition: and(succeeded(), eq('${{ parameters.msi }}', 'yes')) -- powershell: | - $packagePath = "$(System.ArtifactsDirectory)\signed\PowerShell-${{ parameters.version }}-win-${{ parameters.architecture }}.zip" - if(Test-Path -Path $packagePath) - { - Write-Host "##vso[artifact.upload containerfolder=signedResults;artifactname=signedResults]$packagePath" - } - displayName: '[create script] upload signed zip - ${{ parameters.architecture }}' +- template: upload-final-results.yml + parameters: + artifactPath: $(System.ArtifactsDirectory)\signed + artifactFilter: PowerShell-${{ parameters.version }}-win-${{ parameters.architecture }}.zip - task: AzureFileCopy@1 displayName: 'upload signed zip to Azure - ${{ parameters.architecture }}' diff --git a/tools/releaseBuild/azureDevOps/templates/windows-build.yml b/tools/releaseBuild/azureDevOps/templates/windows-build.yml index 2aa279178d..6b457cfd78 100644 --- a/tools/releaseBuild/azureDevOps/templates/windows-build.yml +++ b/tools/releaseBuild/azureDevOps/templates/windows-build.yml @@ -53,7 +53,7 @@ jobs: Write-Host -Object "##$vstsCommandString" displayName: 'Skip FxDependent for PS v6.0.*' - - template: insert-nuget-config.yml + - template: insert-nuget-config-azfeed.yml - powershell: | docker container prune --force diff --git a/tools/releaseBuild/azureDevOps/templates/windows-component-governance.yml b/tools/releaseBuild/azureDevOps/templates/windows-component-governance.yml index c40cd08062..d4698f84a4 100644 --- a/tools/releaseBuild/azureDevOps/templates/windows-component-governance.yml +++ b/tools/releaseBuild/azureDevOps/templates/windows-component-governance.yml @@ -49,7 +49,7 @@ jobs: # Diagnostics is not critical it passes every time it runs continueOnError: true - - template: insert-nuget-config.yml + - template: insert-nuget-config-azfeed.yml - powershell: | ./tools/releaseBuild/vstsbuild.ps1 -ReleaseTag $(ReleaseTagVar) -Name win-x64-component-registration