cube-js/cube · warning

release lookup failed ({}) at {url}

Error message

release lookup failed ({}) at {url}

What it means

latest_release queries the GitHub releases API (with a 10s timeout) to check for CLI updates. Any non-2xx HTTP status from that request is wrapped in this error, which includes the status code and the URL that was fetched. spawn_check runs this in the background, so the error surfaces as a non-fatal update-check notice.

Source

Thrown at rust/cube-cli/src/update.rs:75

        self.assets.iter().find(|a| a.name == name)
    }
}

/// Fetch the latest release metadata from the GitHub API.
pub async fn latest_release(http: &reqwest::Client) -> Result<Release> {
    let url = format!(
        "{}/repos/{}/releases/latest",
        release_api_base(),
        release_repo()
    );
    let res = http
        .get(&url)
        .header(reqwest::header::ACCEPT, "application/vnd.github+json")
        .timeout(Duration::from_secs(10))
        .send()
        .await?;
    if !res.status().is_success() {
        bail!("release lookup failed ({}) at {url}", res.status());
    }
    res.json::<Release>()
        .await
        .map_err(|e| anyhow!("could not parse release metadata: {e}"))
}

/// Order-compare two dotted versions numerically, segment by segment.
fn newer_than(candidate: &str, current: &str) -> bool {
    let parse = |v: &str| -> Vec<u64> {
        v.split(['.', '-'])
            .map_while(|s| s.parse::<u64>().ok())
            .collect()
    };
    let (a, b) = (parse(candidate), parse(current));
    if a.is_empty() || b.is_empty() {
        return candidate != current;
    }
    a > b

View on GitHub (pinned to 7d981676b3)

Solutions

  1. Retry later if it was a GitHub rate limit (403) — the quota resets hourly
  2. Check corporate proxy/firewall access to api.github.com
  3. Ignore the update check (it is advisory) or disable it if the environment is air-gapped
  4. Verify the release URL/repo still exists (404) and consider upgrading the CLI if it points to a renamed repo
Defensive patterns

Strategy: retry

Try / catch

// update checks are advisory — degrade gracefully
match result {
    Err(e) if e.to_string().starts_with("release lookup failed") => {
        // log and continue; the CLI still works without the update notice
    }
    _ => {}
}

Prevention

When it happens

Trigger: The GET to the GitHub releases URL returned a non-success status: 403 rate limit (unauthenticated GitHub API quota exhausted), 404 (repo moved/renamed), 5xx from GitHub, or a proxy/firewall returning an error page.

Common situations: CI runners or corporate networks exhausting GitHub's 60 req/hr unauthenticated rate limit; proxies intercepting api.github.com; offline/air-gapped environments where a captive portal returns 4xx/5xx.

Understand the failure class

Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.

Related errors


AI-assisted analysis of cube-js/cube@7d981676b3 (2026-09-02). Data as JSON: /api/errors/a3a995b67cce8514. Report an issue: GitHub.