From 4d198e9014af8df6c78894ae5cf4b1335472ab89 Mon Sep 17 00:00:00 2001 From: Vantz Stockwell Date: Tue, 17 Mar 2026 12:30:45 -0400 Subject: [PATCH] fix: create Gitea Release in CI + updater uses releases/latest API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI now creates a proper Gitea Release after uploading packages. The updater queries /api/v1/repos/{owner}/{repo}/releases/latest which requires a Release object (not just a tag). Previous tags won't have releases — the updater will start working from this build forward. Co-Authored-By: Claude Opus 4.6 (1M context) --- .gitea/workflows/build-release.yml | 17 +++++++++++++++++ internal/updater/service.go | 12 +++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/.gitea/workflows/build-release.yml b/.gitea/workflows/build-release.yml index 3c2fd06..553d70e 100644 --- a/.gitea/workflows/build-release.yml +++ b/.gitea/workflows/build-release.yml @@ -426,3 +426,20 @@ jobs: echo "" echo "=== Contents ===" ls -la dist/ + + # =============================================================== + # Create Gitea Release + # =============================================================== + - name: Create Gitea Release + run: | + VERSION="${{ steps.version.outputs.version }}" + GITEA_URL="https://git.command.vigilcyber.com" + + echo "=== Creating Gitea Release for ${VERSION} ===" + curl -s -X POST \ + -H "Authorization: token ${{ secrets.GIT_TOKEN }}" \ + -H "Content-Type: application/json" \ + -d "{\"tag_name\": \"${VERSION}\", \"name\": \"Wraith ${VERSION}\", \"body\": \"Auto-release from CI build.\"}" \ + "${GITEA_URL}/api/v1/repos/vstockwell/wraith/releases" + echo "" + echo "Release created." diff --git a/internal/updater/service.go b/internal/updater/service.go index 64889e1..ca3651e 100644 --- a/internal/updater/service.go +++ b/internal/updater/service.go @@ -80,7 +80,7 @@ func (u *UpdateService) CheckForUpdate() (*UpdateInfo, error) { } // Fetch latest package version from the Gitea API. - // Use Gitea releases API to find the latest release tag + // Use Gitea releases API to find the latest release apiURL := fmt.Sprintf( "%s/api/v1/repos/%s/%s/releases/latest", u.baseURL, u.owner, u.pkg, @@ -101,13 +101,15 @@ func (u *UpdateService) CheckForUpdate() (*UpdateInfo, error) { body, err := io.ReadAll(resp.Body) if err != nil { - return nil, fmt.Errorf("read release API response: %w", err) + return nil, fmt.Errorf("read release response: %w", err) } - slog.Info("release API response", "status", resp.StatusCode, "body", string(body)[:min(len(body), 500)]) + slog.Info("release API response", "status", resp.StatusCode, "bodyLen", len(body)) if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("unexpected status %d from releases API: %s", resp.StatusCode, string(body)) + // No releases yet — not an error, just nothing to update to + slog.Info("no releases found", "status", resp.StatusCode) + return info, nil } var release giteaRelease @@ -116,7 +118,7 @@ func (u *UpdateService) CheckForUpdate() (*UpdateInfo, error) { } if release.TagName == "" { - slog.Info("no releases found") + slog.Info("release has no tag") return info, nil }