Tasks/PublishGitHubRelease.ps1

<#
    .SYNOPSIS
    Creates or updates the GitHub release for a module tag.

    .DESCRIPTION
    Uses the release state tag and notes from the matching changelog section.

    .RUN
    ```powershell
    Invoke-Plumber -Task PublishGitHubRelease
    ```
#>

if ($script:_loadedPlumberReleasePublishGitHubRelease) { return }
$script:_loadedPlumberReleasePublishGitHubRelease = $true

Add-BuildTask -Name PublishGitHubRelease -Jobs SetReleaseState, {
    $config = $script:PlumberReleaseConfig
    if ('GitHub' -notin $config.ReleaseTargets) {
        Write-Build Yellow 'Skipping PublishGitHubRelease because GitHub is not a release target.'
        return
    }

    if (-not (Get-Command gh -ErrorAction SilentlyContinue)) {
        Write-Error 'GitHub CLI is required to publish a GitHub release.'
        return
    }

    $version = $script:PlumberReleaseState.Version
    $tagName = $script:PlumberReleaseState.TagName
    $releaseNotesPath = Get-PlumberReleaseNote -Config $config -Version $version

    gh release view $tagName *> $null
    if ($LASTEXITCODE -eq 0) {
        gh release edit $tagName --title $tagName --notes-file $releaseNotesPath
    } else {
        gh release create $tagName --title $tagName --notes-file $releaseNotesPath
    }
}