|
| 1 | +name: Publish to WinGet |
| 2 | + |
| 3 | +# Continuous delivery into microsoft/winget-pkgs via WingetCreate. |
| 4 | +# Docs for maintainers: docs/winget.md |
| 5 | +# Official CD overview: https://github.com/microsoft/winget-create#using-windows-package-manager-manifest-creator-in-a-cicd-pipeline |
| 6 | +# Token setup: https://aka.ms/winget-create-token |
| 7 | + |
| 8 | +on: |
| 9 | + release: |
| 10 | + types: [published] |
| 11 | + workflow_dispatch: |
| 12 | + inputs: |
| 13 | + tag: |
| 14 | + description: Release tag to publish (e.g. v1.0.31). Leave empty to use the latest non-prerelease release. |
| 15 | + required: false |
| 16 | + type: string |
| 17 | + submit: |
| 18 | + description: Submit a PR to microsoft/winget-pkgs (requires WINGET_TOKEN secret) |
| 19 | + required: false |
| 20 | + type: boolean |
| 21 | + default: false |
| 22 | + |
| 23 | +permissions: |
| 24 | + contents: read |
| 25 | + |
| 26 | +jobs: |
| 27 | + winget: |
| 28 | + name: Submit Turso.CLI to WinGet |
| 29 | + runs-on: windows-latest |
| 30 | + # Skip prereleases on the automatic release trigger |
| 31 | + if: ${{ github.event_name == 'workflow_dispatch' || !github.event.release.prerelease }} |
| 32 | + # Prefer the env var over --token so the PAT is not logged on the CLI. |
| 33 | + # https://aka.ms/winget-create-token |
| 34 | + env: |
| 35 | + WINGET_CREATE_GITHUB_TOKEN: ${{ secrets.WINGET_TOKEN }} |
| 36 | + PACKAGE_ID: Turso.CLI |
| 37 | + steps: |
| 38 | + - name: Resolve release assets |
| 39 | + id: release |
| 40 | + shell: pwsh |
| 41 | + run: | |
| 42 | + if ("${{ github.event_name }}" -eq "release") { |
| 43 | + $tag = "${{ github.event.release.tag_name }}" |
| 44 | + $assetsJson = '${{ toJSON(github.event.release.assets) }}' |
| 45 | + $assets = $assetsJson | ConvertFrom-Json |
| 46 | + } else { |
| 47 | + $env:GH_TOKEN = $env:GITHUB_TOKEN |
| 48 | + $tag = "${{ inputs.tag }}".Trim() |
| 49 | + if ([string]::IsNullOrWhiteSpace($tag)) { |
| 50 | + $release = gh release view --json tagName,assets | ConvertFrom-Json |
| 51 | + } else { |
| 52 | + $release = gh release view $tag --json tagName,assets | ConvertFrom-Json |
| 53 | + } |
| 54 | + $tag = $release.tagName |
| 55 | + $assets = $release.assets |
| 56 | + } |
| 57 | +
|
| 58 | + $version = $tag.TrimStart('v') |
| 59 | + $x64 = $assets | Where-Object { $_.name -eq "turso-cli_Windows_x86_64.zip" } | Select-Object -First 1 |
| 60 | + $arm64 = $assets | Where-Object { $_.name -eq "turso-cli_Windows_arm64.zip" } | Select-Object -First 1 |
| 61 | +
|
| 62 | + if (-not $x64 -or -not $arm64) { |
| 63 | + $names = ($assets | ForEach-Object { $_.name }) -join ", " |
| 64 | + throw "Missing Windows zip assets on $tag. Expected turso-cli_Windows_x86_64.zip and turso-cli_Windows_arm64.zip. Found: $names" |
| 65 | + } |
| 66 | +
|
| 67 | + "tag=$tag" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8 |
| 68 | + "version=$version" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8 |
| 69 | + "x64_url=$($x64.browser_download_url)" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8 |
| 70 | + "arm64_url=$($arm64.browser_download_url)" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8 |
| 71 | + Write-Host "Publishing $env:PACKAGE_ID $version" |
| 72 | + Write-Host "x64: $($x64.browser_download_url)" |
| 73 | + Write-Host "arm64: $($arm64.browser_download_url)" |
| 74 | +
|
| 75 | + - name: Download WingetCreate |
| 76 | + shell: pwsh |
| 77 | + run: | |
| 78 | + curl.exe -fsSL -JLO https://aka.ms/wingetcreate/latest |
| 79 | + Get-Item .\wingetcreate.exe | Format-List Name, Length |
| 80 | +
|
| 81 | + - name: Update WinGet manifest |
| 82 | + shell: pwsh |
| 83 | + run: | |
| 84 | + $submit = $false |
| 85 | + if ("${{ github.event_name }}" -eq "release") { |
| 86 | + $submit = $true |
| 87 | + } elseif ("${{ inputs.submit }}" -eq "true") { |
| 88 | + $submit = $true |
| 89 | + } |
| 90 | +
|
| 91 | + if ($submit -and [string]::IsNullOrWhiteSpace($env:WINGET_CREATE_GITHUB_TOKEN)) { |
| 92 | + throw "WINGET_TOKEN repository secret is required to submit. See docs/winget.md" |
| 93 | + } |
| 94 | +
|
| 95 | + $args = @( |
| 96 | + "update", $env:PACKAGE_ID, |
| 97 | + "--version", "${{ steps.release.outputs.version }}", |
| 98 | + "--urls", |
| 99 | + "${{ steps.release.outputs.x64_url }}", |
| 100 | + "${{ steps.release.outputs.arm64_url }}" |
| 101 | + ) |
| 102 | + if ($submit) { |
| 103 | + $args += "--submit" |
| 104 | + } |
| 105 | +
|
| 106 | + Write-Host "Running: .\wingetcreate.exe $($args -join ' ')" |
| 107 | + & .\wingetcreate.exe @args |
| 108 | + if ($LASTEXITCODE -ne 0) { |
| 109 | + throw "wingetcreate exited with code $LASTEXITCODE" |
| 110 | + } |
0 commit comments