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
- Specify the plugin name and update site explicitly using a non-ambiguous identifier.
- Rename or alias the plugin or update site so the dot-split is unambiguous.
- 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
- Use unambiguous plugin identifiers that don't create multiple valid dot-split interpretations.
- Specify the update site explicitly when plugin names contain dots.
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
- No such plugin: {0}
- No such update center: {0}
- {0} is not a Jenkins plugin
- Malformed plugin attribute: {0}
- Null value not allowed as an environment variable: ${key}
AI-assisted analysis of jenkinsci/jenkins@2e228ff40b (2026-08-14).
Data as JSON: /api/errors/350f8dfbeb770b10.
Report an issue: GitHub.