117 lines
5.5 KiB
YAML
117 lines
5.5 KiB
YAML
name: WinGet Releaser
|
|
description: Publish new releases of your application to Windows Package Manager easily.
|
|
author: vedantmgoyal9 (Vedant)
|
|
inputs:
|
|
identifier:
|
|
required: true
|
|
description: The PackageIdentifier of the package (case-sensitive).
|
|
version:
|
|
required: false
|
|
description: The PackageVersion of the package you want to release.
|
|
installers-regex:
|
|
required: true
|
|
description: The regex to match the installers.
|
|
default: '.(exe|msi|msix|appx)(bundle){0,1}$'
|
|
max-versions-to-keep:
|
|
required: true
|
|
description: 'The maximum number of versions to keep in WinGet Community Repository (Default: 0 - no limit)'
|
|
default: '0'
|
|
release-repository:
|
|
required: true
|
|
description: The repository where the release is present (should be present under same user/organization).
|
|
default: ${{ github.event.repository.name }}
|
|
release-tag:
|
|
required: true
|
|
description: The release tag to be used for creating manifests.
|
|
default: ${{ github.event.release.tag_name || github.ref_name }}
|
|
token:
|
|
required: true
|
|
description: GitHub token to create pull request on Windows Package Manager Community Repository.
|
|
fork-user:
|
|
required: true
|
|
description: GitHub username where the fork of winget-pkgs is present.
|
|
default: ${{ github.repository_owner }}
|
|
runs:
|
|
using: composite
|
|
steps:
|
|
- run: |
|
|
# check if at least one version of the package is already present in winget-pkgs repository
|
|
$ErrorActionPreference = 'SilentlyContinue'
|
|
$PkgId = '${{ inputs.identifier }}'
|
|
Invoke-WebRequest -Uri "https://github.com/microsoft/winget-pkgs/tree/master/manifests/$($PkgId.ToLower()[0])\$($PkgId.Replace('.', '/'))" -Method Head
|
|
if (-not $?) {
|
|
Write-Output "::error::Package $PkgId does not exist in the winget-pkgs repository. Please add atleast one version of the package before using this action."
|
|
exit 1
|
|
}
|
|
shell: pwsh
|
|
- run: |
|
|
# check if max-versions-to-keep is a valid number and is 0 (keep all versions) or greater than 0
|
|
$MaxVersionsToKeep = '${{ inputs.max-versions-to-keep }}'
|
|
if (-not [int]::TryParse($MaxVersionsToKeep, [ref]$null) -or $MaxVersionsToKeep -lt 0) {
|
|
Write-Output "::error::Invalid input: max-versions-to-keep should be 0 (zero - keep all versions) or a POSITIVE INTEGER."
|
|
exit 1
|
|
}
|
|
shell: pwsh
|
|
- uses: cargo-bins/cargo-binstall@main
|
|
env:
|
|
GITHUB_TOKEN: ${{ github.token }}
|
|
- run: cargo binstall komac -y
|
|
env:
|
|
GITHUB_TOKEN: ${{ github.token }}
|
|
shell: pwsh
|
|
- run: |
|
|
# get release information
|
|
$ReleaseInfo = Invoke-RestMethod `
|
|
-Uri 'https://api.github.com/repos/${{ github.repository_owner }}/${{ inputs.release-repository }}/releases/tags/${{ inputs.release-tag }}' `
|
|
-Headers @{ Authorization = "token $env:GITHUB_TOKEN" }
|
|
If ('' -eq '${{ inputs.version }}') {
|
|
Write-Output "version=$($ReleaseInfo.tag_name -replace '^v')" >> $env:GITHUB_OUTPUT
|
|
} Else {
|
|
Write-Output "version=${{ inputs.version }}" >> $env:GITHUB_OUTPUT
|
|
}
|
|
Write-Output "urls=$($ReleaseInfo.assets.Where({ $_.name -match '${{ inputs.installers-regex }}' }).browser_download_url -join ' ')" >> $env:GITHUB_OUTPUT
|
|
env:
|
|
GITHUB_TOKEN: ${{ github.token }}
|
|
id: version-and-urls
|
|
shell: pwsh
|
|
- run: komac update '${{ inputs.identifier }}' --version '${{ steps.version-and-urls.outputs.version }}' --submit --urls ${{ steps.version-and-urls.outputs.urls }}
|
|
env:
|
|
KOMAC_FORK_OWNER: ${{ inputs.fork-user }}
|
|
KOMAC_CREATED_WITH: WinGet Releaser
|
|
KOMAC_CREATED_WITH_URL: ${{ github.server_url }}/${{ github.action_repository }}
|
|
GITHUB_TOKEN: ${{ inputs.token }}
|
|
shell: pwsh
|
|
- run: 'komac cleanup --only-merged # clean up stale branches (for which PRs have been merged)'
|
|
env:
|
|
KOMAC_FORK_OWNER: ${{ inputs.fork-user }}
|
|
GITHUB_TOKEN: ${{ inputs.token }}
|
|
shell: pwsh
|
|
- if: fromJSON(inputs.max-versions-to-keep) > 0 # https://docs.github.com/en/actions/learn-github-actions/expressions
|
|
run: |
|
|
# delete previous versions w.r.t. max-versions-to-keep (if any)
|
|
$ToNatural = { [regex]::Replace($_, '\d+', { $args[0].Value.PadLeft(20) }) }
|
|
#[Issue #307] -NoEnumerate has been added so that $Versions does not get converted to a string, when only one version exists in winget-pkgs
|
|
$Versions = komac list-versions '${{ inputs.identifier }}' --json | ConvertFrom-Json -NoEnumerate | Sort-Object $ToNatural -Descending
|
|
$Reason = 'This version is older than what has been set in `max-versions-to-keep` by the publisher.'
|
|
|
|
If ($Versions.Count + 1 -gt ${{ inputs.max-versions-to-keep }}) {
|
|
$VersionsToDelete = $Versions[(${{ inputs.max-versions-to-keep }} - 1)..($Versions.Count - 1)]
|
|
Write-Output "Versions to delete: $($VersionsToDelete -join ', ')"
|
|
|
|
ForEach ($Version in $VersionsToDelete) {
|
|
Write-Output "Deleting version: $Version"
|
|
komac remove '${{ inputs.identifier }}' --version $Version --reason "$Reason" --submit
|
|
}
|
|
} Else {
|
|
Write-Output "No versions to delete. All good :)"
|
|
}
|
|
env:
|
|
KOMAC_FORK_OWNER: ${{ inputs.fork-user }}
|
|
KOMAC_CREATED_WITH: WinGet Releaser
|
|
KOMAC_CREATED_WITH_URL: ${{ github.server_url }}/${{ github.action_repository }}
|
|
GITHUB_TOKEN: ${{ inputs.token }}
|
|
shell: pwsh
|
|
branding:
|
|
color: blue
|
|
icon: package
|