badges/shields · error · NotFound
plugin not found
Error message
plugin not found
What it means
The Jenkins plugin version badge service throws a NotFound error when the requested plugin name does not appear in the plugin version data fetched from the Jenkins update-center/API. After fetching the version map, `versions[plugin]` is undefined, meaning Jenkins has no record of that plugin. This is an upstream-data lookup miss, not a network failure.
Source
Thrown at services/jenkins/jenkins-plugin-version.service.js:47
}
async fetch() {
return getCachedResource({
url: 'https://updates.jenkins-ci.org/current/update-center.actual.json',
ttl: 4 * 3600 * 1000, // 4 hours in milliseconds
scraper: json =>
Object.keys(json.plugins).reduce((previous, current) => {
previous[current] = json.plugins[current].version
return previous
}, {}),
})
}
async handle({ plugin }) {
const versions = await this.fetch()
const version = versions[plugin]
if (version === undefined) {
throw new NotFound({ prettyMessage: 'plugin not found' })
}
return this.constructor.render({ version })
}
}
View on GitHub (pinned to 766fd8bc89)
Solutions
- Verify the exact plugin id on https://plugins.jenkins.io/ and use it in the badge URL (ids are case-sensitive).
- If the plugin was renamed or deprecated, switch the badge to the new plugin id or remove it.
- Confirm the service's fetch() target (Jenkins update center) is reachable and the plugin exists there, not just in a private update site.
Example fix
// before /badges/jenkins/plugin/v/Blue Ocean // after /badges/jenkins/plugin/v/blueocean
Defensive patterns
Strategy: validation
Validate before calling
const PLUGIN_ID_RE = /^[a-z0-9-]+$/;
if (!PLUGIN_ID_RE.test(plugin)) {
throw new Error(`Invalid Jenkins plugin id: ${plugin}`);
}
// confirm existence first:
const res = await fetch(`https://plugins.jenkins.io/api/plugin/${plugin}`);
if (res.status === 404) throw new Error(`Unknown Jenkins plugin: ${plugin}`); Type guard
function hasPluginVersion(versions, plugin) {
return Object.prototype.hasOwnProperty.call(versions, plugin) && typeof versions[plugin] === 'string';
} Try / catch
try {
const badge = await getJenkinsPluginVersionBadge(plugin);
} catch (e) {
if (e.name === 'NotFound') {
renderFallback(`plugin '${plugin}' not found in Jenkins update center`);
} else throw e;
} Prevention
- Copy plugin ids directly from plugins.jenkins.io instead of typing them
- Remember ids are case-sensitive kebab-case artifact ids, not display names
- Pre-validate the plugin id format before building badge URLs
When it happens
Trigger: Requesting /jenkins/plugin/v/<plugin> where the plugin key is not a key in the fetched versions object — i.e. a misspelled plugin id, a plugin that was deleted/renamed, or a plugin not published to the Jenkins update center.
Common situations: Typo in the plugin artifact id in the badge URL (e.g. using the display name 'Blue Ocean' instead of the id 'blueocean'); plugin removed from the update center; private/custom plugin never published; case-sensitive key mismatch.
Related errors
AI-assisted analysis of badges/shields@766fd8bc89 (2026-08-30).
Data as JSON: /api/errors/384d7408976accad.
Report an issue: GitHub.