alz/azuredevops/pipelines/bicep/templates/helpers/bicep-on-demand-folder.yaml (57 lines of code) (raw):
---
parameters:
- name: repository
type: string
- name: releaseArtifactName
type: string
- name: releaseVersion
type: string
- name: sourcePath
type: string
- name: targetPath
type: string
steps:
- pwsh: |
$repository = "$${{ parameters.repository }}"
$releaseArtifactName = "$${{ parameters.releaseArtifactName }}"
$releaseVersion = "$${{ parameters.releaseVersion }}"
$sourcePath = "$${{ parameters.sourcePath }}"
$targetPath = "$${{ parameters.targetPath }}"
Write-Host "Repository: $repository"
Write-Host "Release Artifact Name: $releaseArtifactName"
Write-Host "Release Version: $releaseVersion"
Write-Host "Source Path: $sourcePath"
Write-Host "Target Path: $targetPath"
$repoOrgPlusRepo = $repository.Split("/")[-2..-1] -join "/"
$repoReleaseUrl = "https://api.github.com/repos/$repoOrgPlusRepo/releases/tags/$releaseVersion"
if($releaseVersion -eq "latest") {
$repoReleaseUrl = "https://api.github.com/repos/$repoOrgPlusRepo/releases/latest"
}
$releaseData = Invoke-RestMethod $repoReleaseUrl -SkipHttpErrorCheck -StatusCodeVariable "statusCode"
Write-Verbose "Status code: $statusCode"
if($statusCode -eq 404) {
Write-Error "The release $releaseVersion does not exist in the GitHub repository $repository - $repoReleaseUrl"
throw "The release $releaseVersion does not exist in the GitHub repository $repository - $repoReleaseUrl"
}
# Handle transient errors like throttling
if($statusCode -ge 400 -and $statusCode -le 599) {
Write-Host "Retrying as got the Status Code $statusCode, which may be a tranisent error." -ForegroundColor Yellow
$releaseData = Invoke-RestMethod $repoReleaseUrl -RetryIntervalSec 3 -MaximumRetryCount 100
}
if($statusCode -ne 200) {
throw "Unable to query repository version, please check your internet connection and try again..."
}
$releaseArtifactUrl = $releaseData.assets | Where-Object { $_.name -eq $releaseArtifactName } | Select-Object -ExpandProperty browser_download_url
$tempFolder = "./download"
New-Item -ItemType Directory -Path $tempFolder | Out-String | Write-Verbose
$targetPathForZip = "$tempFolder/$releaseArtifactName"
Invoke-WebRequest -Uri $releaseArtifactUrl -OutFile $targetPathForZip -RetryIntervalSec 3 -MaximumRetryCount 100 | Out-String | Write-Verbose
$targetPathForExtractedZip = "$tempFolder/extracted"
Expand-Archive -Path $targetPathForZip -DestinationPath $targetPathForExtractedZip | Out-String | Write-Verbose
$sourceFolderPath = "$($targetPathForExtractedZip)/$sourcePath/*"
$targetFolderPath = "./$targetPath"
Write-Host "Copying extracted files from $sourceFolderPath to $targetFolderPath"
New-Item -ItemType Directory -Path $targetFolderPath | Out-String | Write-Verbose
Copy-Item -Path $sourceFolderPath -Destination $targetFolderPath -Recurse -Force | Out-String | Write-Verbose
Remove-Item -Path $tempFolder -Force -Recurse
Write-Host "Successfully copied the files from the release artifact to the target path $targetPath..."
displayName: Get On Demand Folder