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 > bView on GitHub (pinned to 7d981676b3)
Solutions
- Retry later if it was a GitHub rate limit (403) — the quota resets hourly
- Check corporate proxy/firewall access to api.github.com
- Ignore the update check (it is advisory) or disable it if the environment is air-gapped
- 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
- Raise GitHub API rate limits via authenticated requests or reduce check frequency
- Whitelist api.github.com on corporate proxies/firewalls
- Treat update-check failures as non-fatal in automation
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
- HTTP error! status: ${response.status}
- unexpected response ${response.statusText}
- HTTP ${response.status}: ${response.statusText}
- Failed to get access token: ${res.statusText}
- Databricks API error: ${res.statusText}
AI-assisted analysis of cube-js/cube@7d981676b3 (2026-09-02).
Data as JSON: /api/errors/a3a995b67cce8514.
Report an issue: GitHub.