Skip to content

Publish WinGet Manifest #11

Publish WinGet Manifest

Publish WinGet Manifest #11

name: Publish WinGet Manifest
on:
release:
types: [published]
workflow_dispatch:
inputs:
tag:
description: Release tag (e.g. v1.0.2)
required: true
type: string
permissions:
contents: read
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
WINGET_PACKAGE_IDENTIFIER: TamKungZ.ImageMerge
WINGET_INSTALLER_NAME: ImageMerge-windows-x64.msi
jobs:
winget:
name: Submit to WinGet
runs-on: windows-latest
if: github.event_name == 'workflow_dispatch' || github.event.release.prerelease == false
steps:
- name: Resolve release tag
id: meta
shell: powershell
run: |
$tag = "${{ github.event.release.tag_name }}"
if ([string]::IsNullOrWhiteSpace($tag)) {
$tag = "${{ inputs.tag }}"
}
if ([string]::IsNullOrWhiteSpace($tag)) { throw "Missing release tag" }
$version = $tag
if ($version.StartsWith('v')) { $version = $version.Substring(1) }
if ([string]::IsNullOrWhiteSpace($version)) { throw "Invalid version from tag: $tag" }
"tag=$tag" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
"version=$version" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
- name: Resolve installer URL from release assets
id: asset
shell: powershell
env:
GH_TOKEN: ${{ github.token }}
run: |
$tag = "${{ steps.meta.outputs.tag }}"
$release = gh api "repos/${{ github.repository }}/releases/tags/$tag" | ConvertFrom-Json
$asset = $release.assets | Where-Object { $_.name -eq $env:WINGET_INSTALLER_NAME } | Select-Object -First 1
if (-not $asset) {
throw "Asset '$env:WINGET_INSTALLER_NAME' not found in release $tag"
}
"url=$($asset.browser_download_url)" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
- name: Install wingetcreate
shell: powershell
run: |
Invoke-WebRequest -Uri "https://aka.ms/wingetcreate/latest" -OutFile "wingetcreate.exe"
- name: Sync winget-pkgs fork
shell: powershell
env:
WINGET_GITHUB_TOKEN: ${{ secrets.WINGET_GITHUB_TOKEN }}
run: |
$ErrorActionPreference = 'Stop'
if ([string]::IsNullOrWhiteSpace($env:WINGET_GITHUB_TOKEN)) {
throw "Missing secret: WINGET_GITHUB_TOKEN"
}
$env:GH_TOKEN = $env:WINGET_GITHUB_TOKEN
$owner = (gh api user --jq .login).Trim()
if ([string]::IsNullOrWhiteSpace($owner)) {
throw "Unable to resolve GitHub login for WINGET_GITHUB_TOKEN"
}
$upstreamDefaultBranch = (gh api repos/microsoft/winget-pkgs --jq .default_branch).Trim()
if ([string]::IsNullOrWhiteSpace($upstreamDefaultBranch)) {
throw "Unable to resolve microsoft/winget-pkgs default branch"
}
$forkExists = $true
try {
gh api "repos/$owner/winget-pkgs" | Out-Null
} catch {
$forkExists = $false
}
if (-not $forkExists) {
gh api -X POST "repos/microsoft/winget-pkgs/forks" | Out-Null
Start-Sleep -Seconds 5
}
gh api -X POST "repos/$owner/winget-pkgs/merge-upstream" -f branch="$upstreamDefaultBranch" | Out-Null
- name: Submit WinGet manifest update
shell: powershell
env:
WINGET_GITHUB_TOKEN: ${{ secrets.WINGET_GITHUB_TOKEN }}
run: |
$ErrorActionPreference = 'Stop'
if ([string]::IsNullOrWhiteSpace($env:WINGET_GITHUB_TOKEN)) {
throw "Missing secret: WINGET_GITHUB_TOKEN"
}
$id = $env:WINGET_PACKAGE_IDENTIFIER
$version = "${{ steps.meta.outputs.version }}"
$url = "${{ steps.asset.outputs.url }}"
.\wingetcreate.exe update $id --urls $url --version $version --submit --token $env:WINGET_GITHUB_TOKEN
if ($LASTEXITCODE -ne 0) {
throw "wingetcreate update failed. For first submission, run wingetcreate new <installerUrl> manually and submit to microsoft/winget-pkgs. After first merge, this workflow will update automatically."
}