Helpers/Publish-IBHGitHubArtifact.ps1

<#
    .SYNOPSIS
        Upload an artifact to GitHub.
#>

function Publish-IBHGitHubArtifact
{
    [CmdletBinding()]
    param
    (
        # GitHub repository user.
        [Parameter(Mandatory = $true)]
        [System.String]
        $RepositoryUser,

        # GitHub repository name.
        [Parameter(Mandatory = $true)]
        [System.String]
        $RepositoryName,

        # Authentication token.
        [Parameter(Mandatory = $true)]
        [System.Security.SecureString]
        $Token,

        # Release id.
        [Parameter(Mandatory = $true)]
        [System.String]
        $ReleaseId,

        # Artifact file name.
        [Parameter(Mandatory = $true)]
        [System.String]
        $Name,

        # Artifact path.
        [Parameter(Mandatory = $true)]
        [System.String]
        $Path
    )

    # Add TLS 1.2 for GitHub
    if (([System.Net.ServicePointManager]::SecurityProtocol -band [System.Net.SecurityProtocolType]::Tls12) -ne [System.Net.SecurityProtocolType]::Tls12)
    {
        [System.Net.ServicePointManager]::SecurityProtocol += [System.Net.SecurityProtocolType]::Tls12
    }

    # Unprotect token
    $tokenCredentialStub = [System.Management.Automation.PSCredential]::new('Token', $Token)
    $plainToken = $tokenCredentialStub.GetNetworkCredential().Password

    # Upload artifact to GitHub
    $invokeRestMethodSplat = @{
        Method          = 'Post'
        Uri             = "https://uploads.github.com/repos/$RepositoryUser/$RepositoryName/releases/$ReleaseId/assets?name=$Name"
        Headers         = @{
            'Accept'        = 'application/vnd.github.v3+json'
            'Authorization' = "token $plainToken"
            'Content-Type'  = 'application/zip'
        }
        InFile          = $Path
    }
    Invoke-RestMethod @invokeRestMethodSplat -ErrorAction Stop
}