eng/scripts/SignAndHash-MavenPackages.ps1 (148 lines of code) (raw):

#Requires -Version 7 param( [Parameter(Mandatory=$true)][string]$Path, [Parameter(Mandatory=$true)][string]$DestinationPath, [Parameter(Mandatory=$true)][string]$GPGExecutablePath, [Parameter(Mandatory=$false)][AllowEmptyString()][string]$GroupIDFilter, [Parameter(Mandatory=$false)][AllowEmptyString()][string]$ArtifactIDFilter ) Set-StrictMode -Version 2.0 $ErrorActionPreference = "Stop" . $PSScriptRoot\MavenPackaging.ps1 # The Resolve-Path will normalize the path separators and throw if they don't exist. # This is necessary because, the yml passes in ${{parameters.BuildToolsPath}}/ which # on Windows means <drive>:\<BuildToolsPath>/<whatever>/<else>. Maven doesn't always # behave well with different separators in the path. $Path = Resolve-Path $Path $GPGExecutablePath = Resolve-Path $GPGExecutablePath function Get-RandomRepositoryDirectory() { Write-Host "Getting random repository directory." $randomSubDirectoryName = [System.IO.Path]::GetRandomFileName() $randomRepositoryDirectory = New-Item -Type Directory -Path $env:TEMP -Name $randomSubDirectoryName Write-Host "Random repository directory is: $randomRepositoryDirectory" return $randomRepositoryDirectory } function ConvertTo-DeploymentDetails($PackageDetail) { $pomArtifact = $packageDetail.AssociatedArtifacts | Where-Object { ($null -eq $_.Classifier) -and ($_.Type -eq "pom") } $fileArtifact = $packageDetail.AssociatedArtifacts.Length -eq 1 ` ? $packageDetail.AssociatedArtifacts[0] ` : ($packageDetail.AssociatedArtifacts | Where-Object { ($null -eq $_.Classifier) -and (($_.Type -eq "jar") -or ($_.Type -eq "aar")) }) $javadocArtifact = $packageDetail.AssociatedArtifacts | Where-Object { ($_.Classifier -eq "javadoc") -and ($_.Type -eq "jar")} $sourcesArtifact = $packageDetail.AssociatedArtifacts | Where-Object { ($_.Classifier -eq "sources") -and ($_.Type -eq "jar") } [AssociatedArtifact[]]$additionalArtifacts = $packageDetail.AssociatedArtifacts | Where-Object { ($_ -ne $pomArtifact) -and ($_ -ne $fileArtifact) -and ($_ -ne $javadocArtifact) -and ($_ -ne $sourcesArtifact) } return [ordered]@{ FullyQualifiedName= $packageDetail.FullyQualifiedName; GroupId= $packageDetail.GroupId; ArtifactId= $packageDetail.ArtifactId; Version= $packageDetail.Version; PomArtifact= $pomArtifact; FileArtifact= $fileArtifact; JavadocArtifact= $javadocArtifact; SourcesArtifact= $sourcesArtifact; AdditionalArtifacts= $additionalArtifacts; } } Write-Host "PS Script Root is: $PSScriptRoot" Write-Host "Path is: $Path" Write-Host "DestinationPath is: $DestinationPath" Write-Host "GPG Executable Path is: $GPGExecutablePath" Write-Host "Group ID Filter is: $GroupIDFilter" Write-Host "Artifact ID Filter is: $ArtifactIDFilter" Write-Host "Getting filtered package details." [array]$packageDetails = Get-FilteredMavenPackageDetails -ArtifactDirectory $Path -GroupIDFilter $GroupIDFilter -ArtifactIDFilter $ArtifactIDFilter | ForEach-Object { ConvertTo-DeploymentDetails $_ } Write-Host "Found $($packageDetails.Length) packages to publish:" $packageDetails | ForEach-Object { Write-Host $_.FullyQualifiedName } if ($packageDetails.Length -eq 0) { throw "Aborting, no packages to publish." } Write-Host "Creating destination directory $DestinationPath" if (Test-Path $DestinationPath) { Remove-Item $DestinationPath -Force -Recurse | Out-Null } New-Item -Path $DestinationPath -Type Directory | Out-Null $DestinationPath = Resolve-Path -Path $DestinationPath $destinationPathUri = $([Uri]$DestinationPath).AbsoluteUri foreach ($packageDetail in $packageDetails) { Write-Host "GPG signing and publishing package: $($packageDetail.FullyQualifiedName)" $pomOption = "-DpomFile=$($packageDetail.PomArtifact.File.FullName)" Write-Host "POM Option is: $pomOption" $fileOption = "-Dfile=$($packageDetail.FileArtifact.File.FullName)" Write-Host "File Option is: $fileOption" $javadocOption = "" if (-not $packageDetail.JavadocArtifact) { Write-Host "No JavaDoc artifact, omitting JavaDoc Option" } else { $javadocOption = "-Djavadoc=$($packageDetail.JavadocArtifact.File.FullName)" Write-Host "JavaDoc Option is: $javadocOption" } $sourcesOption = "" if (-not $packageDetail.SourcesArtifact) { Write-Host "No Sources artifact, omitting Sources Option" } else { $sourcesOption = "-Dsources=$($packageDetail.SourcesArtifact.File.FullName)" Write-Host "Sources Option is: $sourcesOption" } foreach ($additionalArtifact in $packageDetail.AdditionalArtifacts) { Write-Host "Additional associated artifact is: $($additionalArtifact.File.FullName)" } $commaDelimitedFileNames = "" $commaDelimitedClassifiers = "" $commaDelimitedTypes = "" # AdditionalArtifacts effectively means a changelog. These do not have to exist for # data/track 1 files. $additionalArtifacts = $false if ($null -ne $packageDetail.AdditionalArtifacts) { foreach($additionalArtifact in $packageDetail.AdditionalArtifacts) { $commaDelimitedFileNames += ",$($additionalArtifact.File.FullName)" $commaDelimitedClassifiers += ",$($additionalArtifact.Classifier)" $commaDelimitedTypes += ",$($additionalArtifact.Type)" $additionalArtifacts = $true } $filesOption = "-Dfiles=$($commaDelimitedFileNames.Substring(1))" $classifiersOption = "-Dclassifiers=$($commaDelimitedClassifiers.Substring(1))" $typesOption = "-Dtypes=$($commaDelimitedTypes.Substring(1))" Write-Host "Files Option is: $filesOption" Write-Host "Classifiers Option is: $classifiersOption" Write-Host "Types Option is: $typesOption" } $gpgexeOption = "-Dgpgexe=$GPGExecutablePath" Write-Host "GPG Executable Option is: $gpgexeOption" $urlOption = "-Durl=$destinationPathUri" Write-Host "URL Option is: $urlOption" $settingsOption = "--settings=$(Join-Path $PSScriptRoot '..' 'maven.publish.settings.xml' -Resolve)" Write-Host "Settings Option is: $settingsOption" Write-Host "" Write-Host "Signing package" if ($additionalArtifacts) { Write-Host @" mvn gpg:sign-and-deploy-file "--batch-mode" "-Daether.checksums.algorithms=SHA-256,MD5,SHA-1" "$pomOption" "$fileOption" "$javadocOption" "$sourcesOption" "$filesOption" "$classifiersOption" "$typesOption" "$urlOption" "$gpgexeOption" "-DrepositoryId=target-repo" "$settingsOption" "@ mvn gpg:sign-and-deploy-file "--batch-mode" "-Daether.checksums.algorithms=SHA-256,MD5,SHA-1" "$pomOption" "$fileOption" "$javadocOption" "$sourcesOption" "$filesOption" "$classifiersOption" "$typesOption" "$urlOption" "$gpgexeOption" "-DrepositoryId=target-repo" "$settingsOption" } else { # Track 1 libraries do not require $filesOption, $classifiersOption and $typesOption variables which # will only be set if there's a changelog for one or more of the libraries being released Write-Host @" mvn gpg:sign-and-deploy-file "--batch-mode" "-Daether.checksums.algorithms=SHA-256,MD5,SHA-1" "$pomOption" "$fileOption" "$javadocOption" "$sourcesOption" "$urlOption" "$gpgexeOption" "-DrepositoryId=target-repo" "$settingsOption" "@ mvn gpg:sign-and-deploy-file "--batch-mode" "-Daether.checksums.algorithms=SHA-256,MD5,SHA-1" "$pomOption" "$fileOption" "$javadocOption" "$sourcesOption" "$urlOption" "$gpgexeOption" "-DrepositoryId=target-repo" "$settingsOption" } if ($LASTEXITCODE) { exit $LASTEXITCODE } $groupId = $packageDetail.GroupId $artifactId = $packageDetail.ArtifactId $version = $packageDetail.Version $relativePath = "$($groupId.Replace('.', '/'))/$artifactId/$version" $signedArtifactPath = Join-Path $DestinationPath $relativePath if (-not (Test-Path $signedArtifactPath)) { Write-Error "Unable to located expected gpg output folder $signedArtifactPath" exit 1 } Write-Host "##vso[task.setvariable variable=packageLocation]$signedArtifactPath" Write-Host "" } exit 0