release.ps1

<#
.SYNOPSIS
    Create a tag and release on GitHub

.DESCRIPTION
    Create a tag on the repo and a release to that tag on GitHub remote repo.
    This script works very well with GitHub Actions workflow that run on release creation.

    Check the following workflow as an example:
    https://raw.githubusercontent.com/rulasg/DemoPsModule/main/.github/workflows/publish_module_on_release.yml


.PARAMETER VersionTag
    Tag to create (Sample: v10.0.01-alpha). This is the same tag that will be used for the release.

.PARAMETER Force
    Force the script to run without confirmation.

.PARAMETER CreateTag
    Create the tag on the repo. If not specified, the script will only create the release.

.EXAMPLE
    .\release.ps1 -VersionTag v10.0.01-alpha

    Create a release on the existing tag v10.0.01-alpha.

.EXAMPLE
    .\release.ps1 -VersionTag v10.0.01-alpha -CreateTag

    Create a release on the existing tag v10.0.01-alpha and create the tag on the repo.

.EXAMPLE
    .\release.ps1 -VersionTag v10.0.01-alpha -CreateTag -Force

    Create tag and create release without confirmation.
    
.LINK
    https://raw.githubusercontent.com/rulasg/DemoPsModule/main/release.ps1
#>


[cmdletbinding(SupportsShouldProcess, ConfirmImpact='High')]
param(
    # Update the module manifest with the version tag (Sample: v10.0.01-alpha)
    [Parameter(Mandatory)] [string]$VersionTag,
    [Parameter()] [switch]$Force,
    [Parameter()] [switch]$CreateTag,
    [Parameter()] [switch]$NotPreRelease
)

# Confirm if not forced
if ($Force -and -not $Confirm){
    $ConfirmPreference = 'None'
}

if ($CreateTag) {
    if ($PSCmdlet.ShouldProcess($VersionTag, "git tag creation")) {
        git tag -a $VersionTag -m "Release tag" -s ; git push --tags
    }
}

if ($PSCmdlet.ShouldProcess($VersionTag, "gh release create")) {

    if ($NotPreRelease) {
        gh release create $VersionTag --generate-notes --verify-tag --title "Release $VersionTag"  

    } else {
        gh release create $VersionTag --generate-notes --verify-tag --title "Release $VersionTag (PreRelease)"  --prerelease
    }
}