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

  1. Verify the exact plugin id on https://plugins.jenkins.io/ and use it in the badge URL (ids are case-sensitive).
  2. If the plugin was renamed or deprecated, switch the badge to the new plugin id or remove it.
  3. 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

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.