Fix/release create tag before verify (#407)

* fix(release): rebind untagged draft releases to expected app-v tag

After create/update, fetch release by id and force tag_name/target_commitish when
GitHub returns an unexpected tag (including untagged placeholders). This self-heals
release metadata before downstream upload steps consume release_id.

* fix(release): remove tauri-action release publishing side effects

Build macOS/Windows bundles with tauri CLI and upload artifacts explicitly via
gh release upload to the expected app-v tag. This prevents tauri-action from
creating untagged releases while keeping release assets deterministic.

* fix(release): wait for tag ref visibility before release API calls

Before create/update release, poll GitHub REST git.getRef(tags/app-v...) until the
new tag is visible. This avoids release API timing gaps where tag exists in git
but release endpoints still return inconsistent not-found/untagged behavior.
This commit is contained in:
cucadmuh
2026-05-01 22:43:36 +03:00
committed by GitHub
parent 951f2d6163
commit 9ad345e43d
+58 -9
View File
@@ -174,6 +174,27 @@ jobs:
throw new Error(`Invalid RELEASE_COMMIT_SHA '${targetCommitish ?? ""}'`);
}
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
let tagVisible = false;
for (let attempt = 1; attempt <= 10; attempt++) {
try {
await github.rest.git.getRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: `tags/${tag}`,
});
tagVisible = true;
break;
} catch (e) {
if (e.status !== 404) throw e;
core.warning(`Tag ref '${tag}' not visible in REST API yet (attempt ${attempt}/10); retrying...`);
await sleep(1000 * attempt);
}
}
if (!tagVisible) {
throw new Error(`Tag ref 'tags/${tag}' is still not visible in REST API after retries`);
}
try {
const { data } = await github.rest.repos.getReleaseByTag({
owner: context.repo.owner,
@@ -357,9 +378,8 @@ jobs:
mkdir -p ~/private_keys
echo "${{ secrets.APPLE_API_KEY_B64 }}" | base64 --decode > ~/private_keys/AuthKey.p8
echo "APPLE_API_KEY_PATH=$HOME/private_keys/AuthKey.p8" >> "$GITHUB_ENV"
- uses: tauri-apps/tauri-action@v1
- name: build app bundles (no release side effects)
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VITE_LASTFM_API_KEY: ${{ secrets.VITE_LASTFM_API_KEY }}
VITE_LASTFM_API_SECRET: ${{ secrets.VITE_LASTFM_API_SECRET }}
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
@@ -370,13 +390,42 @@ jobs:
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
with:
tagName: ${{ needs.create-release.outputs.release_tag }}
releaseName: Psysonic v${{ needs.create-release.outputs.package_version }}
releaseDraft: ${{ inputs.draft_release }}
prerelease: ${{ inputs.prerelease }}
releaseId: ${{ needs.create-release.outputs.release_id }}
args: ${{ matrix.settings.args }}
run: npm run tauri:build -- ${{ matrix.settings.args }}
- name: upload macOS artifacts
if: runner.os == 'macOS'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
RELEASE_TAG="${{ needs.create-release.outputs.release_tag }}"
TARGET_ARG='${{ matrix.settings.args }}'
if echo "$TARGET_ARG" | grep -q 'aarch64'; then
TARGET="aarch64-apple-darwin"
else
TARGET="x86_64-apple-darwin"
fi
mapfile -t FILES < <(find "src-tauri/target/${TARGET}/release/bundle" -type f \
\( -name "*.dmg" -o -name "*.app.tar.gz" -o -name "*.sig" \))
if [ "${#FILES[@]}" -eq 0 ]; then
echo "::error::No macOS artifacts found to upload."
exit 1
fi
gh release upload "$RELEASE_TAG" "${FILES[@]}" --clobber
- name: upload Windows artifacts
if: runner.os == 'Windows'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
RELEASE_TAG='${{ needs.create-release.outputs.release_tag }}'
$files = Get-ChildItem -Path "src-tauri/target/release/bundle" -Recurse -File `
| Where-Object { $_.Name -match '\.(exe|msi|msix|zip)$' }
if ($files.Count -eq 0) {
Write-Error "No Windows artifacts found to upload."
exit 1
}
foreach ($f in $files) {
gh release upload "$RELEASE_TAG" "$($f.FullName)" --clobber
}
- name: re-sign updater bundle + upload .sig (macOS only)
if: runner.os == 'macOS'
env: