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 = @()

# Allows any containers to be built with a custom version tag, rather than the default SemVer provided by GitVersion
$ContainerImageVersionOverride = $null
$ContainerPublishTag = $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)
        exec {
            docker build `
                -t ("{0}:{1}" -f $buildInfo.ImageName, $containerBuildTag) `
                -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 GenerateContainerBuildTag,{

    foreach ($buildInfo in $ContainersToBuild) {
        $buildTag = "{0}:{1}" -f $buildInfo.ImageName, $containerBuildTag
        $publishTag = $ContainerPublishTag ? `
                            "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
        }
    }
}