From 28f81a8f1cb09f3825d39879c1ddaab6d7549d51 Mon Sep 17 00:00:00 2001 From: MengMengCode <227010654+MengMengCode@users.noreply.github.com> Date: Sat, 6 Jun 2026 10:51:21 +0800 Subject: [PATCH] release: v1.0.6 --- .github/workflows/build.yml | 9 +++ .gitignore | 1 + backend/internal/cli/cli.go | 93 ++++++++++++++++++++++++++--- backend/internal/version/version.go | 3 +- 4 files changed, 96 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9e7dcbb..babbc84 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -35,6 +35,15 @@ jobs: go-version: "1.22.x" cache-dependency-path: backend/go.sum + - name: Set version from tag + shell: bash + run: | + if [[ "$GITHUB_REF" == refs/tags/v* ]]; then + echo "CLICD_VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV + else + echo "CLICD_VERSION=dev" >> $GITHUB_ENV + fi + - name: Build shell: bash run: bash build.sh diff --git a/.gitignore b/.gitignore index baf5dff..6d0afd9 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,4 @@ backend/tmp/ .DS_Store Thumbs.db linux.txt +push-release.ps1 diff --git a/backend/internal/cli/cli.go b/backend/internal/cli/cli.go index fe52388..91c9d69 100644 --- a/backend/internal/cli/cli.go +++ b/backend/internal/cli/cli.go @@ -404,6 +404,44 @@ func fetchLatestRelease(repo string) (*githubRelease, error) { return nil, err } req.Header.Set("Accept", "application/vnd.github+json") + setGitHubRequestHeaders(req) + + client := &http.Client{Timeout: 20 * time.Second} + resp, err := client.Do(req) + if err != nil { + if fallback, fallbackErr := fetchLatestReleaseFallback(repo); fallbackErr == nil { + return fallback, nil + } + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(io.LimitReader(resp.Body, 512)) + apiErr := fmt.Errorf("GitHub API 返回 %s: %s", resp.Status, strings.TrimSpace(string(body))) + if fallback, fallbackErr := fetchLatestReleaseFallback(repo); fallbackErr == nil { + if resp.StatusCode == http.StatusForbidden || resp.StatusCode == http.StatusTooManyRequests { + fmt.Println("GitHub API 被限流,已切换到备用检查方式。") + } else { + fmt.Println("GitHub API 不可用,已切换到备用检查方式。") + } + return fallback, nil + } + return nil, apiErr + } + + var release githubRelease + if err := json.NewDecoder(resp.Body).Decode(&release); err != nil { + return nil, err + } + return &release, nil +} + +func fetchLatestReleaseFallback(repo string) (*githubRelease, error) { + req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("https://github.com/%s/releases/latest", repo), nil) + if err != nil { + return nil, err + } req.Header.Set("User-Agent", "clicd-updater/"+version.Current()) client := &http.Client{Timeout: 20 * time.Second} @@ -412,17 +450,54 @@ func fetchLatestRelease(repo string) (*githubRelease, error) { return nil, err } defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - body, _ := io.ReadAll(io.LimitReader(resp.Body, 512)) - return nil, fmt.Errorf("GitHub API 返回 %s: %s", resp.Status, strings.TrimSpace(string(body))) + if resp.StatusCode >= 400 { + return nil, fmt.Errorf("GitHub releases/latest 返回 %s", resp.Status) } - var release githubRelease - if err := json.NewDecoder(resp.Body).Decode(&release); err != nil { - return nil, err + tag := latestTagFromPath(resp.Request.URL.Path) + if tag == "" { + return nil, fmt.Errorf("无法从 GitHub releases/latest 跳转结果解析最新版本") + } + + const assetName = "clicd-linux-amd64.tar.gz" + return &githubRelease{ + TagName: tag, + Name: tag, + HTMLURL: fmt.Sprintf("https://github.com/%s/releases/tag/%s", repo, tag), + Assets: []struct { + Name string `json:"name"` + BrowserDownloadURL string `json:"browser_download_url"` + }{ + { + Name: assetName, + BrowserDownloadURL: fmt.Sprintf("https://github.com/%s/releases/latest/download/%s", repo, assetName), + }, + }, + }, nil +} + +func latestTagFromPath(path string) string { + const marker = "/releases/tag/" + idx := strings.Index(path, marker) + if idx < 0 { + return "" + } + tag := strings.TrimSpace(path[idx+len(marker):]) + if slash := strings.Index(tag, "/"); slash >= 0 { + tag = tag[:slash] + } + return tag +} + +func setGitHubRequestHeaders(req *http.Request) { + req.Header.Set("User-Agent", "clicd-updater/"+version.Current()) + token := strings.TrimSpace(os.Getenv("CLICD_GITHUB_TOKEN")) + if token == "" { + token = strings.TrimSpace(os.Getenv("GITHUB_TOKEN")) + } + if token != "" { + req.Header.Set("Authorization", "Bearer "+token) } - return &release, nil } func findReleaseAsset(release *githubRelease, name string) string { @@ -495,7 +570,7 @@ func downloadFile(url, dest string) error { if err != nil { return err } - req.Header.Set("User-Agent", "clicd-updater/"+version.Current()) + setGitHubRequestHeaders(req) client := &http.Client{Timeout: 10 * time.Minute} resp, err := client.Do(req) if err != nil { diff --git a/backend/internal/version/version.go b/backend/internal/version/version.go index 5828302..9df621c 100644 --- a/backend/internal/version/version.go +++ b/backend/internal/version/version.go @@ -1,7 +1,7 @@ package version var ( - Version = "dev" + Version = "1.0.6" Repo = "MengMengCode/CLICD" ) @@ -11,3 +11,4 @@ func Current() string { } return Version } +