Fix Windows tag passing: use env var instead of step outputs
All checks were successful
Release / Bump version and tag (push) Successful in 4s

Step outputs via GITHUB_OUTPUT are unreliable with act runner on
Windows (BOM encoding issues). Replaced with job-level env var
RELEASE_TAG set directly from inputs.tag, and checkout ref also
uses inputs.tag directly. Eliminated the Determine tag step
entirely — no intermediate output needed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Developer
2026-04-06 19:06:48 -07:00
parent 68ad31b6a7
commit 76f34fe17d
2 changed files with 45 additions and 53 deletions

View File

@@ -7,31 +7,24 @@ on:
description: 'Release tag to build (e.g. v1.4.5)' description: 'Release tag to build (e.g. v1.4.5)'
required: true required: true
env:
NODE_VERSION: "20"
jobs: jobs:
build-windows: build-windows:
name: Build App (Windows) name: Build App (Windows)
runs-on: windows-latest runs-on: windows-latest
env: env:
NODE_VERSION: "20" RELEASE_TAG: ${{ inputs.tag }}
steps: steps:
- name: Determine tag - name: Show tag
id: tag
shell: powershell shell: powershell
run: | run: |
$TAG = "${{ inputs.tag }}" Write-Host "Building for tag: $env:RELEASE_TAG"
if (-not $TAG) { $TAG = "${{ github.event.inputs.tag }}" }
if (-not $TAG) {
$remote = git ls-remote --tags origin 'refs/tags/v*' 2>$null
if ($remote) {
$TAG = ($remote -split "`n" | Select-Object -Last 1) -replace '.*refs/tags/', ''
}
}
Write-Host "Building for tag: $TAG"
"tag=$TAG" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
ref: ${{ steps.tag.outputs.tag }} ref: ${{ inputs.tag }}
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v4
@@ -64,19 +57,24 @@ jobs:
run: | run: |
$REPO_API = "${{ github.server_url }}/api/v1/repos/${{ github.repository }}" $REPO_API = "${{ github.server_url }}/api/v1/repos/${{ github.repository }}"
$Headers = @{ "Authorization" = "token $env:BUILD_TOKEN" } $Headers = @{ "Authorization" = "token $env:BUILD_TOKEN" }
$TAG = "${{ steps.tag.outputs.tag }}" $TAG = $env:RELEASE_TAG
Write-Host "Release tag: ${TAG}" Write-Host "Release tag: $TAG"
Write-Host "Waiting for release ${TAG} to be available..." if (-not $TAG) {
Write-Host "ERROR: RELEASE_TAG is empty"
exit 1
}
Write-Host "Waiting for release $TAG to be available..."
$RELEASE_ID = $null $RELEASE_ID = $null
for ($i = 1; $i -le 30; $i++) { for ($i = 1; $i -le 30; $i++) {
try { try {
$release = Invoke-RestMethod -Uri "${REPO_API}/releases/tags/${TAG}" -Headers $Headers -ErrorAction Stop $release = Invoke-RestMethod -Uri "$REPO_API/releases/tags/$TAG" -Headers $Headers -ErrorAction Stop
$RELEASE_ID = $release.id $RELEASE_ID = $release.id
if ($RELEASE_ID) { if ($RELEASE_ID) {
Write-Host "Found release: ${TAG} (ID: ${RELEASE_ID})" Write-Host "Found release: $TAG (ID: $RELEASE_ID)"
break break
} }
} catch {} } catch {}
@@ -86,7 +84,7 @@ jobs:
} }
if (-not $RELEASE_ID) { if (-not $RELEASE_ID) {
Write-Host "ERROR: Failed to find release for tag ${TAG} after 30 attempts." Write-Host "ERROR: Failed to find release for tag $TAG after 30 attempts."
exit 1 exit 1
} }
@@ -94,17 +92,17 @@ jobs:
$filename = $_.Name $filename = $_.Name
$encodedName = [System.Uri]::EscapeDataString($filename) $encodedName = [System.Uri]::EscapeDataString($filename)
$size = [math]::Round($_.Length / 1MB, 1) $size = [math]::Round($_.Length / 1MB, 1)
Write-Host "Uploading ${filename} (${size} MB)..." Write-Host "Uploading $filename ($size MB)..."
try { try {
$assets = Invoke-RestMethod -Uri "${REPO_API}/releases/${RELEASE_ID}/assets" -Headers $Headers $assets = Invoke-RestMethod -Uri "$REPO_API/releases/$RELEASE_ID/assets" -Headers $Headers
$existing = $assets | Where-Object { $_.name -eq $filename } $existing = $assets | Where-Object { $_.name -eq $filename }
if ($existing) { if ($existing) {
Invoke-RestMethod -Uri "${REPO_API}/releases/${RELEASE_ID}/assets/$($existing.id)" -Method Delete -Headers $Headers Invoke-RestMethod -Uri "$REPO_API/releases/$RELEASE_ID/assets/$($existing.id)" -Method Delete -Headers $Headers
} }
} catch {} } catch {}
$uploadUrl = "${REPO_API}/releases/${RELEASE_ID}/assets?name=${encodedName}" $uploadUrl = "$REPO_API/releases/$RELEASE_ID/assets?name=$encodedName"
$result = curl.exe --fail --silent --show-error ` $result = curl.exe --fail --silent --show-error `
-X POST ` -X POST `
-H "Authorization: token $env:BUILD_TOKEN" ` -H "Authorization: token $env:BUILD_TOKEN" `
@@ -112,8 +110,8 @@ jobs:
-T "$($_.FullName)" ` -T "$($_.FullName)" `
"$uploadUrl" 2>&1 "$uploadUrl" 2>&1
if ($LASTEXITCODE -eq 0) { if ($LASTEXITCODE -eq 0) {
Write-Host "Upload successful: ${filename}" Write-Host "Upload successful: $filename"
} else { } else {
Write-Host "WARNING: Upload failed for ${filename}: ${result}" Write-Host "WARNING: Upload failed for ${filename}: $result"
} }
} }

View File

@@ -13,25 +13,16 @@ jobs:
runs-on: windows-latest runs-on: windows-latest
env: env:
PYTHON_VERSION: "3.11" PYTHON_VERSION: "3.11"
RELEASE_TAG: ${{ inputs.tag }}
steps: steps:
- name: Determine tag - name: Show tag
id: tag
shell: powershell shell: powershell
run: | run: |
$TAG = "${{ inputs.tag }}" Write-Host "Building for tag: $env:RELEASE_TAG"
if (-not $TAG) { $TAG = "${{ github.event.inputs.tag }}" }
if (-not $TAG) {
$remote = git ls-remote --tags origin 'refs/tags/sidecar-v*' 2>$null
if ($remote) {
$TAG = ($remote -split "`n" | Select-Object -Last 1) -replace '.*refs/tags/', ''
}
}
Write-Host "Building for tag: $TAG"
"tag=$TAG" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
ref: ${{ steps.tag.outputs.tag }} ref: ${{ inputs.tag }}
- name: Install uv - name: Install uv
shell: powershell shell: powershell
@@ -40,7 +31,6 @@ jobs:
Write-Host "uv already installed: $(uv --version)" Write-Host "uv already installed: $(uv --version)"
} else { } else {
irm https://astral.sh/uv/install.ps1 | iex irm https://astral.sh/uv/install.ps1 | iex
# Add both possible uv install locations to PATH
$uvPaths = @( $uvPaths = @(
"$env:USERPROFILE\.local\bin", "$env:USERPROFILE\.local\bin",
"$env:USERPROFILE\.cargo\bin", "$env:USERPROFILE\.cargo\bin",
@@ -81,8 +71,6 @@ jobs:
run: | run: |
Remove-Item -Recurse -Force dist\local-transcription-backend, build -ErrorAction SilentlyContinue Remove-Item -Recurse -Force dist\local-transcription-backend, build -ErrorAction SilentlyContinue
uv pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu --force-reinstall uv pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu --force-reinstall
# Run pyinstaller directly from venv to prevent uv run from
# re-resolving torch back to the CUDA version via pyproject.toml sources
.venv\Scripts\pyinstaller.exe local-transcription-headless.spec .venv\Scripts\pyinstaller.exe local-transcription-headless.spec
- name: Package sidecar (CPU) - name: Package sidecar (CPU)
@@ -97,18 +85,24 @@ jobs:
run: | run: |
$REPO_API = "${{ github.server_url }}/api/v1/repos/${{ github.repository }}" $REPO_API = "${{ github.server_url }}/api/v1/repos/${{ github.repository }}"
$Headers = @{ "Authorization" = "token $env:BUILD_TOKEN" } $Headers = @{ "Authorization" = "token $env:BUILD_TOKEN" }
$TAG = "${{ steps.tag.outputs.tag }}" $TAG = $env:RELEASE_TAG
Write-Host "Release tag: $TAG"
Write-Host "Waiting for sidecar release ${TAG} to be available..." if (-not $TAG) {
Write-Host "ERROR: RELEASE_TAG is empty"
exit 1
}
Write-Host "Waiting for sidecar release $TAG to be available..."
$RELEASE_ID = $null $RELEASE_ID = $null
for ($i = 1; $i -le 30; $i++) { for ($i = 1; $i -le 30; $i++) {
try { try {
$release = Invoke-RestMethod -Uri "${REPO_API}/releases/tags/${TAG}" -Headers $Headers -ErrorAction Stop $release = Invoke-RestMethod -Uri "$REPO_API/releases/tags/$TAG" -Headers $Headers -ErrorAction Stop
$RELEASE_ID = $release.id $RELEASE_ID = $release.id
if ($RELEASE_ID) { if ($RELEASE_ID) {
Write-Host "Found sidecar release: ${TAG} (ID: ${RELEASE_ID})" Write-Host "Found sidecar release: $TAG (ID: $RELEASE_ID)"
break break
} }
} catch {} } catch {}
@@ -118,7 +112,7 @@ jobs:
} }
if (-not $RELEASE_ID) { if (-not $RELEASE_ID) {
Write-Host "ERROR: Failed to find sidecar release for tag ${TAG} after 30 attempts." Write-Host "ERROR: Failed to find sidecar release for tag $TAG after 30 attempts."
exit 1 exit 1
} }
@@ -126,17 +120,17 @@ jobs:
$filename = $_.Name $filename = $_.Name
$encodedName = [System.Uri]::EscapeDataString($filename) $encodedName = [System.Uri]::EscapeDataString($filename)
$size = [math]::Round($_.Length / 1MB, 1) $size = [math]::Round($_.Length / 1MB, 1)
Write-Host "Uploading ${filename} (${size} MB)..." Write-Host "Uploading $filename ($size MB)..."
try { try {
$assets = Invoke-RestMethod -Uri "${REPO_API}/releases/${RELEASE_ID}/assets" -Headers $Headers $assets = Invoke-RestMethod -Uri "$REPO_API/releases/$RELEASE_ID/assets" -Headers $Headers
$existing = $assets | Where-Object { $_.name -eq $filename } $existing = $assets | Where-Object { $_.name -eq $filename }
if ($existing) { if ($existing) {
Invoke-RestMethod -Uri "${REPO_API}/releases/${RELEASE_ID}/assets/$($existing.id)" -Method Delete -Headers $Headers Invoke-RestMethod -Uri "$REPO_API/releases/$RELEASE_ID/assets/$($existing.id)" -Method Delete -Headers $Headers
} }
} catch {} } catch {}
$uploadUrl = "${REPO_API}/releases/${RELEASE_ID}/assets?name=${encodedName}" $uploadUrl = "$REPO_API/releases/$RELEASE_ID/assets?name=$encodedName"
$result = curl.exe --fail --silent --show-error ` $result = curl.exe --fail --silent --show-error `
-X POST ` -X POST `
-H "Authorization: token $env:BUILD_TOKEN" ` -H "Authorization: token $env:BUILD_TOKEN" `
@@ -144,8 +138,8 @@ jobs:
-T "$($_.FullName)" ` -T "$($_.FullName)" `
"$uploadUrl" 2>&1 "$uploadUrl" 2>&1
if ($LASTEXITCODE -eq 0) { if ($LASTEXITCODE -eq 0) {
Write-Host "Upload successful: ${filename}" Write-Host "Upload successful: $filename"
} else { } else {
Write-Host "WARNING: Upload failed for ${filename}: ${result}" Write-Host "WARNING: Upload failed for ${filename}: $result"
} }
} }