jenkinsci/jenkins · warning · Failure

Ambiguous plugin: {0}

Error message

Ambiguous plugin: {0}

What it means

Failure (a stapler form validation/UI exception) thrown when parsing a plugin identifier string that contains dots, and the split produces more than one valid plugin@updatesite combination. For example, 'plugin.ambiguous.updatesite' could resolve as ('plugin', 'ambiguous.updatesite') and ('plugin.ambiguous', 'updatesite'), both of which match real update sites/plugins.

Source

Thrown at core/src/main/java/hudson/PluginManager.java:1747

            int index = n.indexOf('.');
            UpdateSite.Plugin p = null;

            if (index == -1) {
                p = getPlugin(n, UpdateCenter.ID_DEFAULT);
            } else {
                while (index != -1) {
                    if (index + 1 >= n.length()) {
                        break;
                    }
                    String pluginName = n.substring(0, index);
                    String siteName = n.substring(index + 1);
                    UpdateSite.Plugin plugin = getPlugin(pluginName, siteName);
                    // There could be cases like:
                    // 'plugin.ambiguous.updatesite' where both
                    // 'plugin' @ 'ambiguous.updatesite' and 'plugin.ambiguous' @ 'updatesite' resolve to valid plugins
                    if (plugin != null) {
                        if (p != null) {
                            throw new Failure("Ambiguous plugin: " + n);
                        }
                        p = plugin;
                    }
                    index = n.indexOf('.', index + 1);
                }
            }

            if (p == null) {
                throw new Failure("No such plugin: " + n);
            }
            Future<UpdateCenter.UpdateCenterJob> jobFuture = p.deploy(dynamicLoad, correlationId, batch, false);
            installJobs.add(jobFuture);
        }

        final Jenkins jenkins = Jenkins.get();
        final UpdateCenter updateCenter = jenkins.getUpdateCenter();

        if (dynamicLoad) {

View on GitHub (pinned to 2e228ff40b)

Solutions

  1. Specify the plugin name and update site explicitly using a non-ambiguous identifier.
  2. Rename or alias the plugin or update site so the dot-split is unambiguous.
  3. Use the update site ID in the API call format that avoids dot-based splitting.

Example fix

// before — ambiguous
// request: install 'plugin.ambiguous.updatesite'

// after — disambiguate by specifying exact site
UpdateSite site = jenkins.getUpdateCenter().getById("updatesite");
UpdateSite.Plugin plugin = site.getPlugin("plugin.ambiguous");
plugin.deploy(true, correlationId);
Defensive patterns

Strategy: validation

Validate before calling

// Disambiguate before calling the install API
UpdateSite site = jenkins.getUpdateCenter().getById("default");
UpdateSite.Plugin p = site.getPlugin("exact-plugin-name");
if (p == null) {
    throw new IllegalArgumentException("Plugin not found on default site.");
}

Try / catch

try {
    // call the install API with explicit site
} catch (Failure f) {
    if (f.getMessage().startsWith("Ambiguous plugin")) {
        // resolve by specifying exact update site
        listener.error("Plugin name is ambiguous; specify the update site explicitly.");
    } else {
        throw f;
    }
}

Prevention

When it happens

Trigger: A user or API call specifies a plugin name with dots (e.g., 'foo.bar') where the dot-split is ambiguous: more than one (pluginName, siteName) pair resolves to a real plugin in the configured update centers.

Common situations: Using the plugin install API with a compound name like 'github.api' where both 'github' on update site 'api' and 'github.api' on the default site exist. This is a user-input ambiguity surfaced through the Jenkins UI or REST API.

Related errors


AI-assisted analysis of jenkinsci/jenkins@2e228ff40b (2026-08-14). Data as JSON: /api/errors/350f8dfbeb770b10. Report an issue: GitHub.