name: winget (manual fallback) # Primary winget submission is handled by GoReleaser during automated release. # This workflow exists as a manual fallback for re-submitting a specific version. on: workflow_dispatch: inputs: version: description: "Version to submit (e.g. 1.2.3 or v1.2.3)" required: true type: string asset_url: description: "Optional explicit Windows x64 asset URL" required: false type: string permissions: contents: read jobs: submit: runs-on: windows-2025 env: PACKAGE_ID: Hanthor.BluefinCLI WINGET_TOKEN: ${{ secrets.WINGET_CREATE_GITHUB_TOKEN }} steps: - name: Validate token secret shell: pwsh run: | if ([string]::IsNullOrWhiteSpace($env:WINGET_TOKEN)) { throw "Missing required secret: WINGET_CREATE_GITHUB_TOKEN" } - name: Resolve version and installer URL id: resolve env: INPUT_VERSION: ${{ inputs.version }} INPUT_ASSET_URL: ${{ inputs.asset_url }} EVENT_NAME: ${{ github.event_name }} RELEASE_TAG: ${{ github.event.release.tag_name }} shell: pwsh run: | if ("$env:EVENT_NAME" -eq "release") { $tag = "$env:RELEASE_TAG" } else { $tag = "$env:INPUT_VERSION" } if ([string]::IsNullOrWhiteSpace($tag)) { throw "Version/tag is empty" } $version = $tag.TrimStart('v') if ([string]::IsNullOrWhiteSpace($version)) { throw "Normalized version is empty" } $repo = "${{ github.repository }}" $manualUrl = "$env:INPUT_ASSET_URL" if (-not [string]::IsNullOrWhiteSpace($manualUrl)) { $assetUrl = $manualUrl } else { $assetUrl = "https://github.com/$repo/releases/download/$tag/bluefin-cli_${version}_windows_amd64.zip" } "tag=$tag" >> $env:GITHUB_OUTPUT "version=$version" >> $env:GITHUB_OUTPUT "asset_url=$assetUrl" >> $env:GITHUB_OUTPUT - name: Download wingetcreate shell: pwsh run: | Invoke-WebRequest https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe - name: Wait for Release Assets shell: pwsh run: | $url = "${{ steps.resolve.outputs.asset_url }}" Write-Host "Waiting for asset to be available at: $url" $maxRetries = 10 $retryCount = 0 $success = $false while ($retryCount -lt $maxRetries -and -not $success) { try { $response = Invoke-WebRequest -Uri $url -Method Head -ErrorAction Stop if ($response.StatusCode -eq 200) { $success = $true Write-Host "Asset is available!" } } catch { $retryCount++ Write-Host "Asset not ready yet (Attempt $retryCount/$maxRetries). Waiting 30s..." Start-Sleep -Seconds 30 } } if (-not $success) { Write-Host "Error: Asset did not become available in time." exit 1 } - name: Submit update shell: pwsh run: | $pkg = $env:PACKAGE_ID $ver = "${{ steps.resolve.outputs.version }}" $url = "${{ steps.resolve.outputs.asset_url }}" $token = $env:WINGET_TOKEN Write-Host "Submitting to winget-pkgs: $pkg $ver" Write-Host "Installer URL: $url" ./wingetcreate.exe update $pkg -u $url -v $ver -t $token --submit if ($LASTEXITCODE -eq 0) { Write-Host "Update submitted successfully." exit 0 } Write-Host "::error::wingetcreate update failed (exit $LASTEXITCODE)." Write-Host "If this is a first-time submission, create the initial manifest manually" Write-Host "or via GoReleaser: https://goreleaser.com/customization/winget/" exit 1