argoproj/argo-workflows · error

plugin %s has more than one server.* file

Error message

plugin %s has more than one server.* file

What it means

loadPluginManifest found more than one file matching server.* in the executor plugin directory. A plugin must ship exactly one server binary (e.g. server.go or a single server.<ext>), so the manifest load aborts.

Source

Thrown at cmd/argo/commands/executorplugin/io.go:31

)

func loadPluginManifest(pluginDir string) (*spec.Plugin, error) {
	manifest, err := os.ReadFile(filepath.Join(pluginDir, "plugin.yaml"))
	if err != nil {
		return nil, err
	}
	p := &spec.Plugin{}
	err = yaml.UnmarshalStrict(manifest, p)
	if err != nil {
		return nil, err
	}
	files, err := filepath.Glob(filepath.Join(pluginDir, "server.*"))
	if err != nil {
		return nil, err
	}

	if len(files) > 1 {
		return nil, fmt.Errorf("plugin %s has more than one server.* file", p.Name)
	}
	if len(files) == 1 {
		code, err := os.ReadFile(files[0])
		if err != nil {
			return nil, err
		}
		p.Spec.Sidecar.Container.Args = []string{string(code)}
	}
	return p, p.Validate()
}

func addHeader(x []byte, h string) []byte {
	return fmt.Appendf(nil, "%s\n%s", h, string(x))
}

func addCodegenHeader(x []byte) []byte {
	return addHeader(x, "# This is an auto-generated file. DO NOT EDIT")
}

View on GitHub (pinned to 35bff19146)

Solutions

  1. Remove extra server.* files from the plugin directory so exactly one remains
  2. Repackage the plugin with a single server.* entrypoint
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at cmd/argo/commands/executorplugin/io.go:31 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of argoproj/argo-workflows@35bff19146 (2026-09-03). Data as JSON: /api/errors/2690bab57c65e9e5. Report an issue: GitHub.