build-1es-pipeline.yaml (1,061 lines of code) (raw):

variables: AZCOPY_GOLANG_VERSION: '1.24.0' parameters: - name: publish_to_container displayName: 'Publish To Container' type: boolean default: false - name: publish_to_m1_container displayName: 'Publish To M1 Container' type: boolean default: false - name: publish_docker_image displayName: 'Build and Push Docker Image' type: boolean default: false - name: post_release displayName: 'Post Release on Github' type: boolean default: false - name: draft displayName: 'Post as Draft Release' type: boolean default: false - name: prerelease displayName: 'Post as PreRelease' type: boolean default: false - name: publish_artifacts displayName: 'Publish Artifacts to Linux Repos' type: boolean default: false - name: update_version displayName: 'Update Version' type: boolean default: false # Do not trigger this pipeline automatically trigger: none pr: none resources: repositories: - repository: 1esPipelines type: git name: 1ESPipelineTemplates/1ESPipelineTemplates ref: refs/tags/release extends: # The pipeline extends the 1ES PT which will inject different SDL and compliance tasks. # For non-production pipelines, use "Unofficial" as defined below. # For productions pipelines, use "Official". template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines parameters: sdl: sourceAnalysisPool: name: azcopy-pool # Name of your hosted pool image: windows2022-1espt os: windows # OS of the image. Allowed values: windows, linux, macOS stages: - stage: AzCopyVersion jobs: - job: GetAzCopyVersion pool: name: azcopy-pool image: ubuntu22-1espt os: linux steps: - checkout: self displayName: 'Checkout repository' - task: GoTool@0 env: GO111MODULE: 'on' inputs: version: $(AZCOPY_GOLANG_VERSION) - script: | go build -tags "netgo" -o azcopy displayName: 'Build AzCopy' - script: | # Run azcopy --version and capture the output azcopyOutput=$(./azcopy --version) # Extract the version part if echo "$azcopyOutput" | grep -q "azcopy version"; then version=$(echo "$azcopyOutput" | sed -n 's/^azcopy version \([0-9]*\.[0-9]*\.[0-9]*[^ ]*\).*/\1/p') if [[ -n "$version" ]]; then echo "Extracted version: $version" echo "##vso[task.setvariable variable=azcopy_version;isOutput=true]$version" else echo "Unable to extract version from azcopy output" exit 1 fi else echo "azcopy version string not found in output" exit 1 fi displayName: 'Verify and extract the generated build version' name: SetAzCopyVersion - stage: BuildArtifacts dependsOn: AzCopyVersion jobs: - job: Linux_Amd64 timeoutInMinutes: 120 pool: name: azcopy-pool image: ubuntu20-custom1espt os: linux templateContext: outputs: - output: pipelineArtifact targetPath: $(System.DefaultWorkingDirectory)/unsigned artifactName: 'azcopy-linux-amd64-unsigned' displayName: 'Upload Linux Amd64 Unsigned' - output: pipelineArtifact targetPath: $(System.DefaultWorkingDirectory)/binaries artifactName: 'azcopy-binaries-linux-amd64' displayName: 'Upload Linux Amd64 Binaries' variables: - name: archives value: $(System.DefaultWorkingDirectory)/archives - name: unsigned value: $(System.DefaultWorkingDirectory)/unsigned - name: binaries value: $(System.DefaultWorkingDirectory)/binaries - name: azcopy_version value: $[ stageDependencies.AzCopyVersion.GetAzCopyVersion.outputs['SetAzCopyVersion.azcopy_version'] ] steps: - template: azurePipelineTemplates/build_linux.yml@self parameters: host_architecture: 'amd64' host_suffix: 'x86_64' - job: Linux_Arm64 timeoutInMinutes: 120 pool: name: azcopy-arm-pool image: ubuntu20arm-custom1espt os: linux hostArchitecture: Arm64 templateContext: outputs: - output: pipelineArtifact targetPath: $(System.DefaultWorkingDirectory)/unsigned artifactName: 'azcopy-linux-arm64-unsigned' displayName: 'Upload Linux Arm64 Unsigned' - output: pipelineArtifact targetPath: $(System.DefaultWorkingDirectory)/binaries artifactName: 'azcopy-binaries-linux-arm64' displayName: 'Upload Linux Arm64 Binaries' variables: - name: archives value: $(System.DefaultWorkingDirectory)/archives - name: unsigned value: $(System.DefaultWorkingDirectory)/unsigned - name: binaries value: $(System.DefaultWorkingDirectory)/binaries - name: azcopy_version value: $[ stageDependencies.AzCopyVersion.GetAzCopyVersion.outputs['SetAzCopyVersion.azcopy_version'] ] steps: - template: azurePipelineTemplates/build_linux.yml@self parameters: host_architecture: 'arm64' host_suffix: 'arm64' - job: Windows timeoutInMinutes: 120 pool: name: azcopy-pool image: windows2022-1espt os: windows # If the pipeline publishes artifacts, use `templateContext` to define the artifacts. # This will enable 1ES PT to run SDL analysis tools on the artifacts and then upload them. templateContext: outputs: - output: pipelineArtifact targetPath: $(System.DefaultWorkingDirectory)\binaries artifactName: 'azcopy-windows-unsigned' displayName: 'Upload Windows Unsigned' variables: - name: binaries value: '$(System.DefaultWorkingDirectory)\binaries' steps: - template: azurePipelineTemplates/build_windows.yml@self - job: MacOS timeoutInMinutes: 360 pool: name: Azure Pipelines image: macos-latest os: macOS templateContext: outputs: - output: pipelineArtifact targetPath: $(System.DefaultWorkingDirectory)/unsigned artifactName: 'azcopy-mac-unsigned' displayName: 'Upload Mac Unsigned' variables: - name: unsigned value: $(System.DefaultWorkingDirectory)/unsigned - name: azcopy_version value: $[ stageDependencies.AzCopyVersion.GetAzCopyVersion.outputs['SetAzCopyVersion.azcopy_version'] ] steps: - template: azurePipelineTemplates/build_macos.yml@self - job: MacOS_M1 timeoutInMinutes: 360 pool: name: azcopy-pool image: ubuntu22-1espt os: linux templateContext: outputs: - output: pipelineArtifact targetPath: $(System.DefaultWorkingDirectory)/unsigned artifactName: 'azcopy-mac-m1-unsigned' displayName: 'Upload Mac M1 Unsigned' variables: - group: AZCOPY_TESTS_VAR - name: unsigned value: $(System.DefaultWorkingDirectory)/unsigned - name: azcopy_version value: $[ stageDependencies.AzCopyVersion.GetAzCopyVersion.outputs['SetAzCopyVersion.azcopy_version'] ] steps: - template: azurePipelineTemplates/build_macos_m1.yml@self # BuildArtifacts end here - stage: SignArtifacts dependsOn: - AzCopyVersion - BuildArtifacts jobs: - job: Linux timeoutInMinutes: 120 pool: name: azcopy-pool image: ubuntu22-1espt os: linux templateContext: inputs: - input: pipelineArtifact artifactName: azcopy-linux-amd64-unsigned targetPath: $(System.DefaultWorkingDirectory)/amd64 displayName: 'Download Linux Amd64 Unsigned' - input: pipelineArtifact artifactName: azcopy-linux-arm64-unsigned targetPath: $(System.DefaultWorkingDirectory)/arm64 displayName: 'Download Linux Arm64 Unsigned' outputs: - output: pipelineArtifact targetPath: $(System.DefaultWorkingDirectory)/signed artifactName: 'azcopy-linux-signed' displayName: 'Upload Linux Signed' variables: - group: AZCOPY_SECRET_VAULT - name: amd64 value: $(System.DefaultWorkingDirectory)/amd64 - name: arm64 value: $(System.DefaultWorkingDirectory)/arm64 - name: mariner value: $(System.DefaultWorkingDirectory)/mariner - name: signed value: $(System.DefaultWorkingDirectory)/signed steps: - checkout: none - script: | sudo apt-get clean sudo apt-get update sudo apt-get upgrade -y sudo apt-get install -f --fix-missing wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo apt install apt-transport-https -y sudo apt install dotnet-sdk-6.0 -y displayName: "Update dependencies" - script: | mkdir -p $(mariner) chmod 755 $(mariner) cp $(amd64)/*x86_64.rpm $(mariner) cp $(arm64)/*arm64.rpm $(mariner) displayName: 'Copy artifacts for Mariner' - template: setup/esrp_sign_linux.yml@self parameters: FolderPath: $(amd64) ESRP_AZCOPY_KEY_CODE: $(ESRP_AZCOPY_KEY_CODE) Pattern: '*.rpm, *.deb' DisplayName: 'ESRP CodeSigning azcopy linux amd64' - template: setup/esrp_sign_linux.yml@self parameters: FolderPath: $(arm64) ESRP_AZCOPY_KEY_CODE: $(ESRP_AZCOPY_KEY_CODE) Pattern: '*.rpm, *.deb' DisplayName: 'ESRP CodeSigning azcopy linux arm64' - template: setup/esrp_sign_linux.yml@self parameters: FolderPath: $(mariner) ESRP_AZCOPY_KEY_CODE: $(ESRP_AZCOPY_MARINER_KEY_CODE) Pattern: '*.rpm, *.deb' DisplayName: 'ESRP CodeSigning azcopy mariner' - script: | mkdir -p $(signed) mkdir -p $(signed)/mariner chmod 755 $(amd64)/* rm -rf $(amd64)/*.md mv $(amd64)/* $(signed) chmod 755 $(arm64)/* rm -rf $(arm64)/*.md mv $(arm64)/* $(signed) chmod 755 $(mariner)/* rm -rf $(mariner)/*.md mv $(mariner)/* $(signed)/mariner displayName: 'Make Artifacts executable' - job: Windows timeoutInMinutes: 120 pool: name: azcopy-pool image: ubuntu22-1espt os: linux templateContext: inputs: - input: pipelineArtifact artifactName: azcopy-windows-unsigned targetPath: $(System.DefaultWorkingDirectory)/windows displayName: 'Download Windows Unsigned' outputs: - output: pipelineArtifact targetPath: $(System.DefaultWorkingDirectory)/signed artifactName: 'azcopy-windows-signed' displayName: 'Upload Windows Signed' - output: pipelineArtifact targetPath: $(System.DefaultWorkingDirectory)/binaries artifactName: 'azcopy-binaries-windows' displayName: 'Upload Windows Binaries' variables: - group: AZCOPY_SECRET_VAULT - name: windows value: '$(System.DefaultWorkingDirectory)/windows' - name: signed value: '$(System.DefaultWorkingDirectory)/signed' - name: binaries value: '$(System.DefaultWorkingDirectory)/binaries' - name: azcopy_version value: $[ stageDependencies.AzCopyVersion.GetAzCopyVersion.outputs['SetAzCopyVersion.azcopy_version'] ] steps: - script: | sudo apt-get clean sudo apt-get update sudo apt-get upgrade -y sudo apt-get install -f --fix-missing wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo apt install apt-transport-https -y sudo apt install dotnet-sdk-6.0 -y sudo apt-get install -y zip displayName: "Update dependencies" - template: setup/esrp_sign_windows.yml@self parameters: FolderPath: $(windows) ESRP_AZCOPY_WIN_KEY_CODE: $(ESRP_AZCOPY_WIN_KEY_CODE) Pattern: 'azcopy_windows*' - script: | mkdir -p $(binaries) mkdir -p $(signed) chmod 755 $(windows)/* rm -rf $(windows)/*.md displayName: 'Make Artifacts executable' - script: | windows_amd64="$(System.DefaultWorkingDirectory)/azcopy_windows_amd64_$(azcopy_version)" echo "##vso[task.setvariable variable=windows_amd64]$windows_amd64" windows_arm64="$(System.DefaultWorkingDirectory)/azcopy_windows_arm64_$(azcopy_version)" echo "##vso[task.setvariable variable=windows_arm64]$windows_arm64" windows_386="$(System.DefaultWorkingDirectory)/azcopy_windows_386_$(azcopy_version)" echo "##vso[task.setvariable variable=windows_386]$windows_386" mkdir -p $windows_amd64 mkdir -p $windows_arm64 mkdir -p $windows_386 displayName: 'Create required directories' - script: | cp $(windows)/* $(System.DefaultWorkingDirectory)/binaries rm -rf $(windows)/azcopy_windows_v7_arm.exe mv $(windows)/azcopy_windows_amd64.exe $(windows_amd64)/azcopy.exe cp NOTICE.txt $(windows_amd64) mv $(windows)/azcopy_windows_arm64.exe $(windows_arm64)/azcopy.exe cp NOTICE.txt $(windows_arm64) mv $(windows)/azcopy_windows_386.exe $(windows_386)/azcopy.exe cp NOTICE.txt $(windows_386) displayName: 'Copy required files' - task: ArchiveFiles@2 displayName: 'Archive Windows 64 bit AMD Build' inputs: rootFolderOrFile: '$(windows_amd64)' archiveFile: '$(signed)/azcopy_windows_amd64_$(azcopy_version).zip' - task: ArchiveFiles@2 displayName: 'Archive Windows 64 bit ARM Build' inputs: rootFolderOrFile: '$(windows_arm64)' archiveFile: '$(signed)/azcopy_windows_arm64_$(azcopy_version).zip' - task: ArchiveFiles@2 displayName: 'Archive Windows 32 bit Build' inputs: rootFolderOrFile: '$(windows_386)' archiveFile: '$(signed)/azcopy_windows_386_$(azcopy_version).zip' - job: Mac timeoutInMinutes: 120 pool: name: azcopy-pool image: ubuntu22-1espt os: linux templateContext: inputs: - input: pipelineArtifact artifactName: azcopy-mac-unsigned targetPath: $(System.DefaultWorkingDirectory)/mac displayName: 'Download Mac Unsigned' - input: pipelineArtifact artifactName: azcopy-mac-m1-unsigned targetPath: $(System.DefaultWorkingDirectory)/mac-m1 displayName: 'Download Mac M1 Unsigned' outputs: - output: pipelineArtifact targetPath: $(System.DefaultWorkingDirectory)/signed artifactName: 'azcopy-mac-signed' displayName: 'Upload Mac Signed' - output: pipelineArtifact targetPath: $(System.DefaultWorkingDirectory)/binaries artifactName: 'azcopy-binaries-mac' displayName: 'Upload Mac Binaries' variables: - group: AZCOPY_SECRET_VAULT - name: mac value: '$(System.DefaultWorkingDirectory)/mac' - name: mac-m1 value: '$(System.DefaultWorkingDirectory)/mac-m1' - name: signed value: '$(System.DefaultWorkingDirectory)/signed' - name: binaries value: '$(System.DefaultWorkingDirectory)/binaries' steps: - checkout: none - script: | sudo apt-get clean sudo apt-get update sudo apt-get upgrade -y sudo apt-get install unzip -y sudo apt-get install -f --fix-missing wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo apt install apt-transport-https -y sudo apt install dotnet-sdk-6.0 -y displayName: "Update dependencies" - template: setup/esrp_sign_notarize_macos.yml@self parameters: FolderPath: $(mac) ESRP_AZCOPY_MAC_KEY_CODE: $(ESRP_AZCOPY_MAC_KEY_CODE) Pattern: '*.zip' - template: setup/esrp_sign_notarize_macos.yml@self parameters: FolderPath: $(mac-m1) ESRP_AZCOPY_MAC_KEY_CODE: $(ESRP_AZCOPY_MAC_KEY_CODE) Pattern: '*.zip' # Validate signed images have md5sum changed - script: | mkdir -p $(binaries) mkdir -p $(signed) chmod 755 $(mac)/* rm -rf $(mac)/*.md chmod 755 $(mac-m1)/* rm -rf $(mac-m1)/*.md displayName: 'Make Artifacts executable' - script: | mv $(mac)/azcopy* $(signed)/ mv $(mac-m1)/azcopy* $(signed)/ displayName: 'Copy required files' - script: | mkdir -p unzipped_amd64 unzip -o $(signed)/azcopy*amd64*.zip -d unzipped_amd64 # Use find to retrieve the folder name amd64FolderName=$(find unzipped_amd64 -maxdepth 1 -type d -name "azcopy_darwin_amd64*") echo "AMD64 Folder name: $amd64FolderName" # Check if there is exactly one matching directory for amd64 if [ $(echo "$amd64FolderName" | wc -l) -eq 1 ]; then echo "Found matching AMD64 directory: $amd64FolderName" mv $amd64FolderName/azcopy $(binaries)/azcopy_darwin_amd64 else echo "Error: Expected exactly one matching AMD64 directory, found $(echo "$amd64FolderName" | wc -l)." exit 1 fi mkdir -p unzipped_arm64 unzip -o $(signed)/azcopy_darwin_arm64*.zip -d unzipped_arm64 arm64FolderName=$(find unzipped_arm64 -maxdepth 1 -type d -name "azcopy_darwin_arm64*") echo "ARM64 Folder name: $arm64FolderName" # Check if there is exactly one matching directory for arm64 if [ $(echo "$arm64FolderName" | wc -l) -eq 1 ]; then echo "Found matching ARM64 directory: $arm64FolderName" mv $arm64FolderName/azcopy $(binaries)/azcopy_darwin_arm64 else echo "Error: Expected exactly one matching ARM64 directory, found $(echo "$arm64FolderName" | wc -l)." exit 1 fi mkdir -p unzipped_m1_arm64 unzip -o $(signed)/azcopy_darwin_m1_arm64*.zip -d unzipped_m1_arm64 m1Arm64FolderName=$(find unzipped_m1_arm64 -maxdepth 1 -type d -name "azcopy_darwin_m1_arm64*") echo "ARM64 M1 Folder name: $m1Arm64FolderName" # Check if there is exactly one matching directory for arm64 if [ $(echo "$m1Arm64FolderName" | wc -l) -eq 1 ]; then echo "Found matching ARM64 M1 directory: $m1Arm64FolderName" mv $m1Arm64FolderName/azcopy $(binaries)/azcopy_darwin_m1_arm64 else echo "Error: Expected exactly one matching ARM64 M1 directory, found $(echo "$m1Arm64FolderName" | wc -l)." exit 1 fi displayName: 'Copy signed mac binaries' # SignArtifacts end here - stage: VerifyArtifacts dependsOn: SignArtifacts jobs: - job: Ubuntu_Amd64 timeoutInMinutes: 120 pool: name: azcopy-pool image: ubuntu20-custom1espt os: linux templateContext: inputs: - input: pipelineArtifact artifactName: azcopy-binaries-linux-amd64 targetPath: $(System.DefaultWorkingDirectory)/binaries displayName: 'Download Linux Amd64 Binaries' - input: pipelineArtifact artifactName: azcopy-linux-signed targetPath: $(System.DefaultWorkingDirectory)/signed displayName: 'Download Linux Signed' variables: - name: signed value: '$(System.DefaultWorkingDirectory)/signed' - name: binaries value: '$(System.DefaultWorkingDirectory)/binaries' - name: extracted value: '$(System.DefaultWorkingDirectory)/extracted' steps: - template: azurePipelineTemplates/verify_linux.yml@self parameters: host_architecture: 'amd64' host_suffix: 'x86_64' - job: Ubuntu_Arm64 timeoutInMinutes: 120 pool: name: azcopy-arm-pool image: ubuntu20arm-custom1espt os: linux hostArchitecture: Arm64 templateContext: inputs: - input: pipelineArtifact artifactName: azcopy-binaries-linux-arm64 targetPath: $(System.DefaultWorkingDirectory)/binaries displayName: 'Download Linux Arm64 Binaries' - input: pipelineArtifact artifactName: azcopy-linux-signed targetPath: $(System.DefaultWorkingDirectory)/signed displayName: 'Download Linux Signed' variables: - name: signed value: '$(System.DefaultWorkingDirectory)/signed' - name: binaries value: '$(System.DefaultWorkingDirectory)/binaries' - name: extracted value: '$(System.DefaultWorkingDirectory)/extracted' steps: - template: azurePipelineTemplates/verify_linux.yml@self parameters: host_architecture: 'arm64' host_suffix: 'arm64' - job: Mariner_Amd64 timeoutInMinutes: 120 pool: name: azcopy-pool image: mariner2-1espt os: linux templateContext: inputs: - input: pipelineArtifact artifactName: azcopy-linux-signed targetPath: $(System.DefaultWorkingDirectory)/signed item_pattern: 'mariner/azcopy-*x86_64.rpm' displayName: 'Download Linux Signed' variables: - name: signed value: '$(System.DefaultWorkingDirectory)/signed/mariner' steps: - checkout: none - script: | sudo rpm -qip $(signed)/azcopy*x86_64.rpm sudo rpm -i $(signed)/azcopy*x86_64.rpm azcopy --version displayName: 'Verify rpm' - job: MacOS timeoutInMinutes: 120 pool: name: Azure Pipelines image: macos-latest os: macOS templateContext: inputs: - input: pipelineArtifact artifactName: azcopy-mac-signed targetPath: $(System.DefaultWorkingDirectory)/signed itemPattern: 'azcopy*amd64*.zip' displayName: 'Download Mac Signed' variables: - name: signed value: '$(System.DefaultWorkingDirectory)/signed' - name: extracted value: '$(System.DefaultWorkingDirectory)/extracted' steps: - checkout: none - script: | mkdir -p $(extracted) displayName: 'Create extracted path' - task: ExtractFiles@1 inputs: archiveFilePatterns: '$(signed)/azcopy*amd64*.zip' destinationFolder: $(extracted) - script: | $(extracted)/azcopy*amd64*/azcopy --version displayName: 'Verify binary in zip' - job: Windows_Amd64 timeoutInMinutes: 120 pool: name: azcopy-pool image: windows2022-1espt os: windows templateContext: inputs: - input: pipelineArtifact artifactName: azcopy-windows-signed targetPath: $(System.DefaultWorkingDirectory)\signed itemPattern: 'azcopy*amd64*.zip' displayName: 'Download Windows Signed' variables: - name: signed value: '$(System.DefaultWorkingDirectory)\signed' - name: extracted value: '$(System.DefaultWorkingDirectory)\extracted' steps: - checkout: none - script: | mkdir -p $(extracted) displayName: 'Create extracted path' - task: ExtractFiles@1 inputs: archiveFilePatterns: '$(signed)\azcopy*amd64*.zip' destinationFolder: $(extracted) - script: | cd $(extracted)\azcopy*amd64* azcopy.exe --version displayName: 'Verify exe in zip' - job: Windows_Arm64 timeoutInMinutes: 120 pool: name: azcopy-arm-pool image: windows2022arm-1espt os: windows hostArchitecture: Arm64 templateContext: inputs: - input: pipelineArtifact artifactName: azcopy-windows-signed targetPath: $(System.DefaultWorkingDirectory)\signed itemPattern: 'azcopy*arm64*.zip' displayName: 'Download Windows Signed' variables: - name: signed value: '$(System.DefaultWorkingDirectory)\signed' - name: extracted value: '$(System.DefaultWorkingDirectory)\extracted' steps: - checkout: none - script: | mkdir -p $(extracted) displayName: 'Create extracted path' - task: ExtractFiles@1 inputs: archiveFilePatterns: '$(signed)\azcopy*arm64*.zip' destinationFolder: $(extracted) - script: | cd $(extracted)\azcopy*arm64* azcopy.exe --version displayName: 'Verify exe in zip' # VerifyArtifacts end here - stage: UploadToStorage dependsOn: - AzCopyVersion - VerifyArtifacts jobs: - job: Job pool: name: azcopy-pool image: ubuntu22-1espt os: linux variables: - name: input value: '$(System.DefaultWorkingDirectory)/input' - name: release value: '$(System.DefaultWorkingDirectory)/release' - name: drop value: '$(System.DefaultWorkingDirectory)/drop' - name: publish_to_container value: ${{ parameters.publish_to_container }} - name: publish_to_m1_container value: ${{ parameters.publish_to_m1_container }} - name: azcopy_version value: $[ stageDependencies.AzCopyVersion.GetAzCopyVersion.outputs['SetAzCopyVersion.azcopy_version'] ] steps: - checkout: self displayName: 'Checkout repository' - script: | sudo apt-get clean sudo apt-get update --fix-missing sudo apt-get install -y zip unzip displayName: 'Install Dependencies' - task: GoTool@0 env: GO111MODULE: 'on' inputs: version: $(AZCOPY_GOLANG_VERSION) - script: | go build -tags "netgo" -o azcopy displayName: 'Build AzCopy' # DownloadPipelineArtifacts AFTER checkout since checkout wipes out the DefaultWorkingDirectory - task: DownloadPipelineArtifact@2 inputs: artifactName: azcopy-linux-signed targetPath: $(System.DefaultWorkingDirectory)/input/azcopy-linux-signed displayName: "Download Linux Signed" - task: DownloadPipelineArtifact@2 inputs: artifactName: azcopy-windows-signed targetPath: $(System.DefaultWorkingDirectory)/input/azcopy-windows-signed displayName: "Download Windows Signed" - task: DownloadPipelineArtifact@2 inputs: artifactName: azcopy-mac-signed targetPath: $(System.DefaultWorkingDirectory)/input/azcopy-mac-signed displayName: "Download Mac Signed" - script: | mkdir -p $(release) cp $(input)/azcopy-linux-signed/azcopy* $(release) cp $(input)/azcopy-windows-signed/azcopy* $(release) cp $(input)/azcopy-mac-signed/azcopy* $(release) displayName: 'Prepare release folder' - task: DownloadPipelineArtifact@2 inputs: artifactName: azcopy-binaries-linux-amd64 targetPath: $(System.DefaultWorkingDirectory)/input/azcopy-binaries-linux-amd64 displayName: "Download Linux AMD64 Binaries" - task: DownloadPipelineArtifact@2 inputs: artifactName: azcopy-binaries-linux-arm64 targetPath: $(System.DefaultWorkingDirectory)/input/azcopy-binaries-linux-arm64 displayName: "Download Linux ARM64 Binaries" - task: DownloadPipelineArtifact@2 inputs: artifactName: azcopy-binaries-windows targetPath: $(System.DefaultWorkingDirectory)/input/azcopy-binaries-windows displayName: "Download Windows Binaries" - task: DownloadPipelineArtifact@2 inputs: artifactName: azcopy-binaries-mac targetPath: $(System.DefaultWorkingDirectory)/input/azcopy-binaries-mac displayName: "Download Mac Binaries" - script: | mkdir -p $(drop) cp $(input)/azcopy-binaries-linux-amd64/azcopy* $(drop) cp $(input)/azcopy-binaries-linux-arm64/azcopy* $(drop) cp $(input)/azcopy-binaries-windows/azcopy* $(drop) cp $(input)/azcopy-binaries-mac/azcopy* $(drop) cp $(System.DefaultWorkingDirectory)/NOTICE.txt $(drop) displayName: 'Prepare drop folder' - task: ArchiveFiles@2 displayName: 'Archive drop' inputs: rootFolderOrFile: '$(drop)' archiveFile: '$(release)/drop.zip' - task: AzureCLI@2 inputs: azureSubscription: 'ESRP KeyVault identity' scriptType: bash scriptLocation: inlineScript inlineScript: | today=$(date +"%Y%m%d") if [ $(publish_to_container) = "True" ]; then container_url="https://azcopyvnextrelease.blob.core.windows.net/%24web/releases/release-$(azcopy_version)-$today" else container_url="https://azcopyprivatedrops.blob.core.windows.net/%24web/releases/release-$(azcopy_version)-$today" fi echo "Artifacts will be uploaded to: $container_url" AZCOPY_AUTO_LOGIN_TYPE=AzCLI ./azcopy cp "$(release)/*" "$container_url" --recursive --put-md5=true if [ $(publish_to_m1_container) = "True" ]; then m1_container_url="https://azcopyvnextrelease.blob.core.windows.net/%24web/azcopy-m1-drops/azcopy-$(azcopy_version)-$today" AZCOPY_AUTO_LOGIN_TYPE=AzCLI ./azcopy cp "$(input)/azcopy-binaries-mac/azcopy_darwin_m1_arm64" "$m1_container_url" --recursive --put-md5=true fi # UploadToStorage ends here - ${{ if eq(parameters.publish_docker_image, true) }}: - stage: BuildAndPublishDockerImage dependsOn: - AzCopyVersion - VerifyArtifacts jobs: - job: LinuxAMD64 pool: name: azcopy-pool image: ubuntu22-1espt os: linux templateContext: authenticatedContainerRegistries: - serviceConnection: AzCopyContainers_ACR variables: - group: AZCOPY_SECRET_VAULT - name: azcopy_version value: $[ lower(stageDependencies.AzCopyVersion.GetAzCopyVersion.outputs['SetAzCopyVersion.azcopy_version']) ] steps: - checkout: self displayName: 'Checkout repository' - task: DownloadPipelineArtifact@2 inputs: artifactName: azcopy-binaries-linux-amd64 targetPath: $(System.DefaultWorkingDirectory) itemPattern: 'azcopy_linux_amd64' displayName: "Download Linux AMD64 Binary" - script: | mv azcopy_linux_amd64 azcopy displayName: 'Setup AzCopy in expected location' - task: 1ES.BuildContainerImage@1 inputs: image: azcopycontainers.azurecr.io/azure-azcopy-ubuntu-x86_64.$(azcopy_version):latest path: '$(System.DefaultWorkingDirectory)' dockerfile: docker/Dockerfile - task: 1ES.PushContainerImage@1 inputs: image: azcopycontainers.azurecr.io/azure-azcopy-ubuntu-x86_64.$(azcopy_version):latest remoteImage: azcopycontainers.azurecr.io/azure-azcopy-ubuntu-x86_64.$(azcopy_version):latest - task: 1ES.BuildContainerImage@1 inputs: image: azcopycontainers.azurecr.io/azure-azcopy-mariner-x86_64.$(azcopy_version):latest path: '$(System.DefaultWorkingDirectory)' dockerfile: docker/DockerfileMariner - task: 1ES.PushContainerImage@1 inputs: image: azcopycontainers.azurecr.io/azure-azcopy-mariner-x86_64.$(azcopy_version):latest remoteImage: azcopycontainers.azurecr.io/azure-azcopy-mariner-x86_64.$(azcopy_version):latest - task: 1ES.BuildContainerImage@1 inputs: image: azcopycontainers.azurecr.io/azure-azcopy-mariner-arm64.$(azcopy_version):latest path: '$(System.DefaultWorkingDirectory)' dockerfile: docker/DockerfileMarinerArm64 - task: 1ES.PushContainerImage@1 inputs: image: azcopycontainers.azurecr.io/azure-azcopy-mariner-arm64.$(azcopy_version):latest remoteImage: azcopycontainers.azurecr.io/azure-azcopy-mariner-arm64.$(azcopy_version):latest - job: LinuxARM64 pool: name: azcopy-arm-pool image: ubuntu22arm-custom1espt os: linux hostArchitecture: Arm64 templateContext: authenticatedContainerRegistries: - serviceConnection: AzCopyContainers_ACR variables: - group: AZCOPY_SECRET_VAULT - name: azcopy_version value: $[ lower(stageDependencies.AzCopyVersion.GetAzCopyVersion.outputs['SetAzCopyVersion.azcopy_version']) ] steps: - checkout: self displayName: 'Checkout repository' - task: DownloadPipelineArtifact@2 inputs: artifactName: azcopy-binaries-linux-arm64 targetPath: $(System.DefaultWorkingDirectory) itemPattern: 'azcopy_linux_arm64' displayName: "Download Linux ARM64 Binary" - script: | mv azcopy_linux_arm64 azcopy displayName: 'Setup AzCopy in expected location' - task: 1ES.BuildContainerImage@1 inputs: image: azcopycontainers.azurecr.io/azure-azcopy-ubuntu-arm64.$(azcopy_version):latest path: '$(System.DefaultWorkingDirectory)' dockerfile: docker/Dockerfile - task: 1ES.PushContainerImage@1 inputs: image: azcopycontainers.azurecr.io/azure-azcopy-ubuntu-arm64.$(azcopy_version):latest remoteImage: azcopycontainers.azurecr.io/azure-azcopy-ubuntu-arm64.$(azcopy_version):latest - ${{ if eq(parameters.post_release, true) }}: - stage: ReleaseToGithub dependsOn: - AzCopyVersion - VerifyArtifacts jobs: - job: Job pool: name: azcopy-pool image: ubuntu22-1espt os: linux variables: - name: azcopy_version value: $[ stageDependencies.AzCopyVersion.GetAzCopyVersion.outputs['SetAzCopyVersion.azcopy_version'] ] steps: - checkout: none - script: | echo "v$(azcopy_version)" displayName: 'AzCopy Tag Name' - task: GithubRelease@1 inputs: githubConnection: 'azcopy-github-connection' repositoryName: 'Azure/azure-storage-azcopy' action: 'edit' target: '$(Build.SourceVersion)' tagSource: 'userSpecifiedTag' title: "AzCopy v$(azcopy_version)" tag: "v$(azcopy_version)" changeLogCompareToRelease: 'lastFullRelease' changeLogType: 'commitBased' isDraft: ${{ parameters.draft }} isPreRelease: ${{ parameters.prerelease }} assetUploadMode: replace - ${{ if eq(parameters.publish_artifacts, true) }}: - stage: PublishArtifacts dependsOn: - AzCopyVersion - UploadToStorage jobs: - job: Job timeoutInMinutes: 120 pool: name: azcopy-pool image: ubuntu22-1espt os: linux variables: - group: AZCOPY_SECRET_VAULT - name: signed value: '$(System.DefaultWorkingDirectory)/signed' steps: - checkout: self - task: PipAuthenticate@1 inputs: artifactFeeds: 'DevExGlobalFeed' displayName: 'Connect to PMC artifact' - script: | sudo apt-get clean sudo apt-get update --fix-missing sudo apt-get install -y tree displayName: 'Install Dependencies' - script: | pip install pmc-cli echo '##vso[task.prependpath]$(HOME)/.local/bin' displayName: 'Install pmc-cli' - task: DownloadSecureFile@1 name: pmcCertificate displayName: 'Download pmc pem file' inputs: secureFile: 'blobfusebuildvault-blobfuse-release-pmc1-20230911.pem' - task: DownloadSecureFile@1 name: settings displayName: 'Download settings.toml file' inputs: secureFile: 'settings.toml' - script: | pmc --version pmc --msal-cert-path $(pmcCertificate.secureFilePath) --config $(settings.secureFilePath) repo list --limit 1 if [ $? -ne 0 ]; then exit 1 fi displayName: 'Test PMC installation' # DownloadPipelineArtifacts AFTER checkout since checkout wipes out the DefaultWorkingDirectory - task: DownloadPipelineArtifact@2 inputs: artifactName: azcopy-linux-signed targetPath: $(signed) displayName: "Download Linux Signed" - script: | arm64file=$(ls "$(signed)/mariner/azcopy"*.arm64.rpm) amd64file=$(ls "$(signed)/mariner/azcopy"*.x86_64.rpm) marinerArmFileName="${arm64file/.arm64.rpm/-cm2.arm64.rpm}" marinerAmdFileName="${amd64file/.x86_64.rpm/-cm2.x86_64.rpm}" mv -v "$(signed)/mariner/azcopy"*.arm64.rpm "$marinerArmFileName" mv -v "$(signed)/mariner/azcopy"*.x86_64.rpm "$marinerAmdFileName" mv "$(signed)/mariner/azcopy"*.rpm "$(signed)/" rm -r "$(signed)/mariner/" displayName: 'Rename Mariner binaries' - script: | rm -r $(signed)/azcopy_linux_*.tar.gz displayName: 'Remove tar gz files' - script: | rm -r $(signed)/_manifest displayName: 'Remove manifest' - script: | pmc --msal-cert-path $(pmcCertificate.secureFilePath) --config $(settings.secureFilePath) package upload signed displayName: 'Upload files' - script: | azcopyAmdDeb=`pmc --msal-cert-path $(pmcCertificate.secureFilePath) --config $(settings.secureFilePath) --id-only package upload azcopy*.x86_64.deb` echo "Azcopy AMD DEB ID: $azcopyAmdDeb" azcopyAmdRpmFile=$(ls azcopy-* | grep -vE 'cm2\.x86_64\.rpm|arm64\.deb|x86_64\.deb|arm64\.rpm') azcopyAmdRpm=$(pmc --msal-cert-path $(pmcCertificate.secureFilePath) --config $(settings.secureFilePath) --id-only package upload $azcopyAmdRpmFile) echo "Azcopy AMD RPM ID: $azcopyAmdRpm" azcopyArmDeb=`pmc --msal-cert-path $(pmcCertificate.secureFilePath) --config $(settings.secureFilePath) --id-only package upload azcopy*.arm64.deb` echo "Azcopy ARM DEB ID: $azcopyArmDeb" azcopyArmRpmFile=$(ls azcopy* | grep -vE 'cm2\.arm64\.rpm|arm64\.deb|x86_64\.deb|x86_64\.rpm') azcopyArmRpm=$(pmc --msal-cert-path $(pmcCertificate.secureFilePath) --config $(settings.secureFilePath) --id-only package upload $azcopyArmRpmFile) echo "Azcopy ARM RPM $azcopyArmRpmFile" echo "Azcopy ARM RPM ID: $azcopyArmRpm" # Find the Mariner RPM file and upload marinerAmdRpmFile=$(ls azcopy-* | grep 'cm2\.x86_64\.rpm') marinerAmdRpm=$(pmc --msal-cert-path $(pmcCertificate.secureFilePath) --config $(settings.secureFilePath) --id-only package upload $marinerAmdRpmFile) echo "Azcopy mariner AMD RPM $marinerAmdRpmFile" echo "Azcopy mariner AMD RPM ID: $marinerAmdRpm" marinerAarchRpmFile=$(ls azcopy-* | grep 'cm2\.arm64\.rpm') marinerAarchRpm=$(pmc --msal-cert-path $(pmcCertificate.secureFilePath) --config $(settings.secureFilePath) --id-only package upload $marinerAarchRpmFile) echo "Azcopy mariner ARM RPM: $marinerAarchRpmFile" echo "Azcopy mariner ARM RPM ID: $marinerAarchRpm" is_preview="false" echo "##vso[task.setvariable variable=is_preview]$is_preview" if [[ $marinerAmdRpmFile == *"preview"* ]]; then is_preview="true" echo "##vso[task.setvariable variable=is_preview]$is_preview" fi while IFS=, read -r distro archetype repoName releaseName; do # If the package is preview, publish to mariner preview package if [[ $distro == *"Mariner-"* ]]; then if [ $is_preview = "true" ]; then repoName=$(echo $repoName | sed 's/prod/preview/') fi fi echo "Uploading packages for $distro" echo "Repo Name: $repoName" pmc --msal-cert-path $(pmcCertificate.secureFilePath) --config $(settings.secureFilePath) repo package update --add-packages ${!archetype} $repoName $releaseName done < <(tail -n +3 ../packages.csv) displayName: 'Add uploaded packages to repository' workingDirectory: $(signed) - script: | while IFS=, read -r distro archetype repoName releaseName; do if [[ $archetype == *"Arm"* ]]; then echo "Skipping for ARM type on $distro" else if [[ $distro == *"Mariner-"* ]]; then if [ "$(is_preview)" = "true" ]; then repoName=$(echo $repoName | sed 's/prod/preview/') fi fi echo "Repo Name: $repoName" pmc --msal-cert-path $(pmcCertificate.secureFilePath) --config $(settings.secureFilePath) repo publish $repoName fi done < <(tail -n +3 ../packages.csv) displayName: 'Publish the repository' workingDirectory: $(signed) - ${{ if eq(parameters.update_version, true) }}: - stage: UpdateLatestVersion dependsOn: - AzCopyVersion - UploadToStorage jobs: - job: Job pool: name: azcopy-pool image: ubuntu22-1espt os: linux variables: - name: azcopy_version value: $[ stageDependencies.AzCopyVersion.GetAzCopyVersion.outputs['SetAzCopyVersion.azcopy_version'] ] steps: - checkout: self displayName: 'Checkout repository' - task: GoTool@0 env: GO111MODULE: 'on' inputs: version: $(AZCOPY_GOLANG_VERSION) - script: | go build -tags "netgo" -o azcopy displayName: 'Build AzCopy' - task: AzureCLI@2 inputs: azureSubscription: 'ESRP KeyVault identity' scriptType: bash scriptLocation: inlineScript inlineScript: | export AZCOPY_AUTO_LOGIN_TYPE=AzCLI echo "azcopy version: $(azcopy_version)" #Upload to release version blob file upload_url="https://azcopyvnextrelease.blob.core.windows.net/%24web/releasemetadata/latest_version.txt" echo "Version will be uploaded to: $upload_url" echo $(azcopy_version) | ./azcopy copy "$upload_url" --from-to=PipeBlob --log-level=DEBUG --output-type=text 2>&1 | tee /dev/null exit ${PIPESTATUS[1]}