tasks/container.tasks.ps1

# ContainersToBuild must be an array of hashtables of the following structure:
# @(
# @{
# Dockerfile = "<path-to-dockerfile>"
# ImageName = "<container-image-name-without-tag>"
# ContextDir = "<path-to-docker-build-context-dir>"
# }
# )
$ContainersToBuild = @()
$UseAcrTasks = $false

# Allows any containers to be built with a custom version tag, rather than the default SemVer provided by GitVersion
$ContainerImageVersionOverride = $null
$ContainerRegistryPublishPrefix = $null


# Synopsis: Build Container Images
task BuildContainerImages -If {!$SkipContainerImages -and $ContainersToBuild} GenerateContainerBuildTag,{

    foreach ($buildInfo in $ContainersToBuild) {
        $contextDir = $buildInfo.ContainsKey("ContextDir") ? $buildInfo.ContextDir : (Split-Path -Parent $buildInfo.Dockerfile)
        $buildTag = "{0}:{1}" -f $buildInfo.ImageName, $containerBuildTag

        if ($UseAcrTasks) {
            if (!(Test-AzCliConnection)) {
                throw "You must be logged in to Azure CLI to build using ACR Tasks"
            }

            Write-Build White "Building & publishing image with ACR Tasks"
            $acrPublishTag = $ContainerRegistryPublishPrefix ? `
                                "$ContainerRegistryPublishPrefix/$buildTag" : `
                                $buildTag
            exec {
                az acr build `
                    -t $acrPublishTag `
                    --registry $ContainerRegistryFqdn `
                    --file $buildInfo.Dockerfile `
                    $contextDir
            }
        }
        else {
            exec {
                docker build `
                    -t $buildTag `
                    -f $buildInfo.Dockerfile `
                    $contextDir
            }    
        }
    }
}

# Synopsis: Set the container image version
task GenerateContainerBuildTag GitVersion,{

    if ($ContainerImageVersionOverride) {
        Write-Host "Overriding default container image version tag: $ContainerImageVersionOverride"
        $script:containerBuildTag = $ContainerImageVersionOverride
    }
    else {
        $script:containerBuildTag = ($script:GitVersion).SemVer
    }
}

# Synopsis: Publish Container Images to GHCR
task PublishContainerImagesToGhcr -If { $ContainerRegistryType -eq "ghcr" } GenerateContainerBuildTag,{

    foreach ($buildInfo in $ContainersToBuild) {
        $buildTag = "{0}:{1}" -f $buildInfo.ImageName, $containerBuildTag
        $publishTag = $ContainerRegistryPublishPrefix ? `
                            "docker.pkg.github.com/$ContainerPublishTag/$buildTag" : `
                            "docker.pkg.github.com/$(gh repo view --json nameWithOwner | ConvertFrom-Json | Select-Object -ExpandProperty nameWithOwner)/$buildTag"
        Write-Host "Publishing Container: $publishTag"
        exec {
            docker tag $buildTag $publishTag
            docker push $publishTag
        }
    }
}

# Synopsis: Publish Container Images to Azure Container Registry
task PublishContainerImagesToAcr -If { $ContainerRegistryType -eq "acr" -and !$UseAcrTasks} GenerateContainerBuildTag, {

    if (!$ContainerRegistryFqdn) {
        throw "Missing value for 'ContainerRegistryFqdn' - this is required when publishing to Azure Container Registry"
    }

    if (!(Test-AzCliConnection)) {
        throw "You must be logged in to Azure CLI to publish to ACR"
    }

    foreach ($buildInfo in $ContainersToBuild) {
        $buildTag = "{0}:{1}" -f $buildInfo.ImageName, $containerBuildTag
        $publishTag = $ContainerRegistryPublishPrefix ? `
                            "$ContainerRegistryFqdn/$ContainerRegistryPublishPrefix/$buildTag" : `
                            "$ContainerRegistryFqdn/$buildTag"
        Write-Host "Publishing Container: $publishTag"
        exec { az acr login -n $ContainerRegistryFqdn }
        exec { & docker tag $buildTag $publishTag }
        exec { docker push $publishTag }
    }
}

task PublishContainerImages PublishContainerImagesToAcr,PublishContainerImagesToGhcr