eng/scripts/Publish-MavenPackages.ps1 (159 lines of code) (raw):
param(
[Parameter(Mandatory=$true)][string]$ArtifactDirectory,
[Parameter(Mandatory=$true)][string]$RepositoryUrl,
[Parameter(Mandatory=$true)][string]$RepositoryUsername,
[Parameter(Mandatory=$true)][string]$RepositoryPassword,
[Parameter(Mandatory=$true)][string]$GPGExecutablePath,
[Parameter(Mandatory=$false)][switch]$StageOnly,
[Parameter(Mandatory=$false)][switch]$ShouldPublish,
[Parameter(Mandatory=$false)][AllowEmptyString()][string]$GroupIDFilter,
[Parameter(Mandatory=$false)][AllowEmptyString()][string]$ArtifactIDFilter
)
$ErrorActionPreference = "Stop"
. "${PSScriptRoot}/../common/scripts/common.ps1"
. $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.
$ArtifactDirectory = Resolve-Path $ArtifactDirectory
$GPGExecutablePath = Resolve-Path $GPGExecutablePath
function Get-RandomRepositoryDirectory() {
Write-Information "Getting random repository directory."
$randomSubDirectoryName = [System.IO.Path]::GetRandomFileName()
$randomRepositoryDirectory = New-Item -Type Directory -Path $env:TEMP -Name $randomSubDirectoryName
Write-Information "Random repository directory is: $randomRepositoryDirectory"
return $randomRepositoryDirectory
}
Write-Information "PS Script Root is: $PSScriptRoot"
Write-Information "ArtifactDirectory is: $ArtifactDirectory"
Write-Information "Repository URL is: $RepositoryUrl"
Write-Information "Repository Username is: $RepositoryUsername"
Write-Information "Repository Password is: [redacted]"
Write-Information "GPG Executable Path is: $GPGExecutablePath"
Write-Information "Group ID Filter is: $GroupIDFilter"
Write-Information "Artifact ID Filter is: $ArtifactIDFilter"
Write-Information "Stage Only is: $StageOnly"
Write-Information "Should Publish is: $ShouldPublish"
Write-Information "Getting filtered package details."
$packageDetails = Get-FilteredMavenPackageDetails -ArtifactDirectory $ArtifactDirectory -GroupIDFilter $GroupIDFilter -ArtifactIDFilter $ArtifactIDFilter
Write-Host "Found $($packageDetails.Length) packages to publish:"
$packageDetails | % { Write-Host $_.FullyQualifiedName }
if ($packageDetails.Length -eq 0) {
throw "Aborting, no packages to publish."
}
if ($StageOnly)
{
foreach ($packageDetail in $packageDetails) {
if ($packageDetail.IsSnapshot) {
throw "Package $($packageDetail.FullyQualifiedName) is a Snapshot and StageOnly is set to 'true'. Staging of snapshot packages is not supported."
}
}
}
Write-Host "Starting GPG signing and publishing"
foreach ($packageDetail in $packageDetails) {
Write-Host "GPG signing and publishing package: $($packageDetail.FullyQualifiedName)"
$pomAssociatedArtifact = $packageDetail.AssociatedArtifacts | Where-Object { ($_.Classifier -eq $null) -and ($_.Type -eq "pom") }
$pomOption = "-DpomFile=$($pomAssociatedArtifact.File.FullName)"
Write-Information "POM Option is: $pomOption"
if ($packageDetail.AssociatedArtifacts.Length -ne 1) {
$fileAssociatedArtifact = $packageDetail.AssociatedArtifacts | Where-Object { ($_.Classifier -eq $null) -and (($_.Type -eq "jar") -or ($_.Type -eq "aar")) }
} else {
$fileAssociatedArtifact = $packageDetail.AssociatedArtifacts[0]
}
$fileOption = "-Dfile=$($fileAssociatedArtifact.File.FullName)"
Write-Information "File Option is: $fileOption"
$javadocOption = ""
$javadocAssociatedArtifact = $packageDetail.AssociatedArtifacts | Where-Object { ($_.Classifier -eq "javadoc") -and ($_.Type -eq "jar")}
if (-not $javadocAssociatedArtifact) {
Write-Information "No JavaDoc artifact, omitting JavaDoc Option"
} else {
$javadocOption = "-Djavadoc=$($javadocAssociatedArtifact.File.FullName)"
Write-Information "JavaDoc Option is: $javadocOption"
}
$sourcesOption = ""
$sourcesAssociatedArtifact = $packageDetail.AssociatedArtifacts | Where-Object { ($_.Classifier -eq "sources") -and ($_.Type -eq "jar") }
if (-not $sourcesAssociatedArtifact) {
Write-Information "No Sources artifact, omitting Sources Option"
} else {
$sourcesOption = "-Dsources=$($sourcesAssociatedArtifact.File.FullName)"
Write-Information "Sources Option is: $sourcesOption"
}
[AssociatedArtifact[]]$additionalAssociatedArtifacts = @()
foreach ($additionalAssociatedArtifact in $packageDetail.AssociatedArtifacts) {
if (($additionalAssociatedArtifact -ne $pomAssociatedArtifact) -and
($additionalAssociatedArtifact -ne $fileAssociatedArtifact) -and
($additionalAssociatedArtifact -ne $javadocAssociatedArtifact) -and
($additionalAssociatedArtifact -ne $sourcesAssociatedArtifact)) {
Write-Information "Additional associated artifact is: $($additionalAssociatedArtifact.File.FullName)"
$additionalAssociatedArtifacts += $additionalAssociatedArtifact
}
}
if ($additionalAssociatedArtifacts -ne $null) {
$commaDelimitedFileNames = ""
$additionalAssociatedArtifacts | ForEach-Object { $commaDelimitedFileNames += ",$($_.File.FullName)" }
$filesOption = "-Dfiles=$($commaDelimitedFileNames.Substring(1))"
$commaDelimitedClassifiers = ""
$additionalAssociatedArtifacts | ForEach-Object { $commaDelimitedClassifiers += ",$($_.Classifier)" }
$classifiersOption = "-Dclassifiers=$($commaDelimitedClassifiers.Substring(1))"
$commaDelimitedTypes = ""
$additionalAssociatedArtifacts | ForEach-Object { $commaDelimitedTypes += ",$($_.Type)" }
$typesOption = "-Dtypes=$($commaDelimitedTypes.Substring(1))"
}
$shouldPublishPackage = $ShouldPublish
$packageReposityUrl = $RepositoryUrl
if ($packageReposityUrl -match "https://pkgs.dev.azure.com/azure-sdk/\b(internal|public)\b/*") {
# Azure DevOps feeds don't support staging
$shouldPublishPackage = $ShouldPublish -and !$StageOnly
}
else {
throw "Repository URL must be an Azure Artifacts feed, anything else must be published through ESRP."
}
#Local GPG deployment is required when we're not going to publish a package, or when we're publishing to maven central
$requiresLocalGpg = !$shouldPublishPackage -or ($releaseType -eq 'MavenCentralStaging') -or ($releaseType -eq 'MavenCentral')
Write-Information "Release Type: $releaseType"
Write-Information "Should Publish Package: $shouldPublishPackage"
Write-Information "Requires local GPG deployment: $requiresLocalGpg"
Write-Information "Files Option is: $filesOption"
Write-Information "Classifiers Option is: $classifiersOption"
Write-Information "Types Option is: $typesOption"
$gpgexeOption = "-Dgpgexe=$GPGExecutablePath"
Write-Information "GPG Executable Option is: $gpgexeOption"
$gpgPluginVersion = . $PSScriptRoot\Get-ExternalDependencyVersion.ps1 -GroupId 'org.apache.maven.plugins' -ArtifactId 'maven-gpg-plugin'
if ($LASTEXITCODE) {
Write-Information "##vso[task.logissue type=error]Unable to resolve version of external dependency 'org.apache.maven.plugins:maven-gpg-plugin'"
exit $LASTEXITCODE
}
$gpgSignAndDeployWithVer = "org.apache.maven.plugins:maven-gpg-plugin:$gpgPluginVersion`:sign-and-deploy-file"
if ($requiresLocalGpg) {
$localRepositoryDirectory = Get-RandomRepositoryDirectory
$localRepositoryDirectoryUri = $([Uri]$localRepositoryDirectory.FullName).AbsoluteUri
Write-Information "Local Repository Directory URI is: $localRepositoryDirectoryUri"
$urlOption = "-Durl=$localRepositoryDirectoryUri"
Write-Information "URL Option is: $urlOption"
Write-Information "Signing and deploying package to $localRepositoryDirectoryUri"
Write-Information "mvn $gpgSignAndDeployWithVer `"--batch-mode`" `"$pomOption`" `"$fileOption`" `"$javadocOption`" `"$sourcesOption`" `"$filesOption`" $classifiersOption `"$typesOption`" `"$urlOption`" `"$gpgexeOption`" `"-DrepositoryId=target-repo`" `"--settings=$PSScriptRoot\..\maven.publish.settings.xml`""
mvn $gpgSignAndDeployWithVer "--batch-mode" "$pomOption" "$fileOption" "$javadocOption" "$sourcesOption" "$filesOption" $classifiersOption "$typesOption" "$urlOption" "$gpgexeOption" "-DrepositoryId=target-repo" "--settings=$PSScriptRoot\..\maven.publish.settings.xml"
if ($LASTEXITCODE) { exit $LASTEXITCODE }
}
if(!$shouldPublishPackage)
{
Write-Information "Skipping deployment because Should Publish Package == false."
continue
}
Write-Information "GPG Signing and deploying package in one step to devops feed: $packageReposityUrl"
Write-Information "mvn $gpgSignAndDeployWithVer `"--batch-mode`" `"$pomOption`" `"$fileOption`" `"$javadocOption`" `"$sourcesOption`" `"$filesOption`" $classifiersOption `"$typesOption`" `"-Durl=$packageReposityUrl`" `"$gpgexeOption`" `"-DrepositoryId=target-repo`" `"-Drepo.password=[redacted]`" `"--settings=$PSScriptRoot\..\maven.publish.settings.xml`""
mvn $gpgSignAndDeployWithVer "--batch-mode" "$pomOption" "$fileOption" "$javadocOption" "$sourcesOption" "$filesOption" $classifiersOption "$typesOption" "-Durl=$packageReposityUrl" "$gpgexeOption" "-DrepositoryId=target-repo" "-Drepo.password=$RepositoryPassword" "--settings=$PSScriptRoot\..\maven.publish.settings.xml"
if ($LASTEXITCODE -eq 0) {
Write-Information "Package $($packageDetail.FullyQualifiedName) deployed"
continue
}
Write-Information "Release attempt $attemt exited with code $LASTEXITCODE"
Write-Information "Checking Azure DevOps to see if release was successful"
if (Test-ReleasedPackage -RepositoryUrl $packageReposityUrl -PackageDetail $packageDetail -BearerToken $RepositoryPassword) {
Write-Information "Package $($packageDetail.FullyQualifiedName) deployed despite non-zero exit code."
continue
}
exit $LASTEXITCODE
}
exit 0