Public/func_Publish-Config.ps1

Function Publish-Config {
    <#
    .SYNOPSIS
    Publishes a CDF config package to an OCI registry.

    .DESCRIPTION
    Packs a config instance directory into an OCI artifact and pushes it to the configured registry.
    Requires a cdf-runtime.json manifest in the config instance directory.

    .PARAMETER ConfigPath
    Path to the config instance directory (e.g. ./src/tsdc/01). Must contain cdf-runtime.json.

    .PARAMETER Registry
    Registry endpoint (e.g. cdfcodex.azurecr.io). Overrides manifest/default.

    .PARAMETER Release
    Override the release version from the manifest. Useful for CI builds.

    .EXAMPLE
    Publish-CdfConfig -ConfigPath ./src/tsdc/01

    .EXAMPLE
    Publish-CdfConfig -ConfigPath ./src/tsdc/01 -Release 1.3.0-pre.1

    .LINK
    Install-CdfPackage
    #>


    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true)]
        [string]$ConfigPath,
        [Parameter(Mandatory = $false)]
        [string]$Registry,
        [Parameter(Mandatory = $false)]
        [string]$Release
    )

    $resolvedPath = Resolve-Path $ConfigPath -ErrorAction Stop
    $manifestPath = Join-Path $resolvedPath 'cdf-runtime.json'

    if (-not (Test-Path $manifestPath)) {
        throw "No cdf-runtime.json found in '$resolvedPath'. Cannot publish without a manifest."
    }

    $manifest = Get-Content -Raw $manifestPath | ConvertFrom-Json -AsHashtable
    $platformId = $manifest.platformId
    $instanceId = $manifest.instanceId
    $releaseTag = $Release ? $Release : $manifest.release

    if (-not $releaseTag) {
        throw "No release version specified. Set 'release' in cdf-runtime.json or use -Release parameter."
    }

    $configKey = "$platformId$instanceId"

    # Resolve registry config (layered: project → user → inline manifest)
    $inlineRegistries = $null
    $pkgManifestPath = Join-Path (Get-Location) 'cdf-packages.json'
    if (Test-Path $pkgManifestPath) {
        $pkgManifest = Get-Content -Raw $pkgManifestPath | ConvertFrom-Json -AsHashtable
        $inlineRegistries = $pkgManifest.registries
    }
    if ($Registry -and $Registry -match '\.') {
        $regConfig = @{ type = 'acr'; endpoint = $Registry }
    }
    else {
        $regName = if ($Registry) { $Registry } else { 'default' }
        $regConfig = Resolve-CdfRegistryConfig -Name $regName -InlineRegistries $inlineRegistries
    }

    $packagePath = "cdf/configs/$configKey"
    $provider = New-CdfRegistryProvider $regConfig

    # Build OCI annotations from manifest metadata
    $annotations = @{
        'org.opencontainers.image.title'   = $configKey
        'org.opencontainers.image.version' = $releaseTag
        'cdf.config.platformId'            = $platformId
        'cdf.config.instanceId'            = $instanceId
    }
    if ($manifest.description) {
        $annotations['org.opencontainers.image.description'] = $manifest.description
    }

    Write-Host "Publishing config ${configKey}:$releaseTag to $($regConfig.endpoint)..."
    $provider.Login()
    $provider.Push($packagePath, $releaseTag, $resolvedPath.Path, $annotations)
    Write-Host "Successfully published ${configKey}:$releaseTag"
}