{"record":{"id":"e068845ea6d56633","repo":"hyperledger/fabric","slug":"invalid-external-builder-configuration-path-attri","errorCode":null,"errorMessage":"invalid external builder configuration, path attribute missing in one or more builders","messagePattern":"invalid external builder configuration, path attribute missing in one or more builders","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/peer/config.go","lineNumber":304,"sourceCode":"\tc.VMDockerAttachStdout = viper.GetBool(\"vm.docker.attachStdout\")\n\n\tc.VMNetworkMode = viper.GetString(\"vm.docker.hostConfig.NetworkMode\")\n\tif c.VMNetworkMode == \"\" {\n\t\tc.VMNetworkMode = \"host\"\n\t}\n\n\tc.ChaincodePull = viper.GetBool(\"chaincode.pull\")\n\tvar externalBuilders []ExternalBuilder\n\n\terr = viper.UnmarshalKey(\"chaincode.externalBuilders\", &externalBuilders, viper.DecodeHook(viperutil.YamlStringToStructHook(externalBuilders)))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tc.ExternalBuilders = externalBuilders\n\tfor builderIndex, builder := range c.ExternalBuilders {\n\t\tif builder.Path == \"\" {\n\t\t\treturn errors.New(\"invalid external builder configuration, path attribute missing in one or more builders\")\n\t\t}\n\t\tif builder.Name == \"\" {\n\t\t\treturn fmt.Errorf(\"external builder at path %s has no name attribute\", builder.Path)\n\t\t}\n\t\tif builder.Environment != nil && len(builder.PropagateEnvironment) == 0 {\n\t\t\tc.ExternalBuilders[builderIndex].PropagateEnvironment = builder.Environment\n\t\t}\n\t}\n\n\tc.OperationsListenAddress = viper.GetString(\"operations.listenAddress\")\n\tc.OperationsTLSEnabled = viper.GetBool(\"operations.tls.enabled\")\n\tc.OperationsTLSCertFile = config.GetPath(\"operations.tls.cert.file\")\n\tc.OperationsTLSKeyFile = config.GetPath(\"operations.tls.key.file\")\n\tc.OperationsTLSClientAuthRequired = viper.GetBool(\"operations.tls.clientAuthRequired\")\n\n\tfor _, rca := range viper.GetStringSlice(\"operations.tls.clientRootCAs.files\") {\n\t\tc.OperationsTLSClientRootCAs = append(c.OperationsTLSClientRootCAs, config.TranslatePath(configDir, rca))\n\t}","sourceCodeStart":286,"sourceCodeEnd":322,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/core/peer/config.go#L286-L322","documentation":"During peer config load, every entry in externalBuilders must have a non-empty path attribute; if any builder omits it, load() aborts peer startup with this error. The path tells the peer where the builder's binary lives on disk, so a missing path makes the builder unusable. It is a static YAML validation error surfaced at boot.","triggerScenarios":"A core.yaml externalBuilders list entry that specifies a name (and possibly environment/propagateEnvironment) but no path key, or whose path value is empty/whitespace after env expansion.","commonSituations":"Hand-editing core.yaml and forgetting the path key; copying a builder stanza from docs with placeholders left blank; templating/Helm charts that render an empty path variable; YAML anchor merge accidentally dropping the path field.","solutions":["Add the missing path key to every externalBuilders entry in core.yaml (or the mounted config) and restart the peer.","Validate the rendered YAML before deployment: ensure each builder has both path and name set.","If the path comes from a template variable, fix the variable so it resolves to the builder's directory (e.g. /builders/ccaas_builder).","Temporarily remove the incomplete builder entry if it is not needed, then start the peer."],"exampleFix":"# before\nexternalBuilders:\n  - name: ccaas-builder\n    propagateEnvironment:\n      - FABRIC_VERSION\n# after\nexternalBuilders:\n  - name: ccaas-builder\n    path: /builders/ccaas_builder\n    propagateEnvironment:\n      - FABRIC_VERSION","handlingStrategy":"validation","validationCode":"import \"gopkg.in/yaml.v2\"\nvar cfg struct {\n    ExternalBuilders []struct {\n        Name string `yaml:\"name\"`\n        Path string `yaml:\"path\"`\n    } `yaml:\"externalBuilders\"`\n}\nif err := yaml.Unmarshal(coreYAML, &cfg); err != nil { return err }\nfor i, b := range cfg.ExternalBuilders {\n    if b.Path == \"\" {\n        return fmt.Errorf(\"externalBuilders[%d] (%s) missing path\", i, b.Name)\n    }\n}","typeGuard":null,"tryCatchPattern":"if err := peer.Config(); err != nil {\n    if strings.Contains(err.Error(), \"path attribute missing\") {\n        return fmt.Errorf(\"fix core.yaml externalBuilders: %w\", err)\n    }\n    return err\n}","preventionTips":["Lint core.yaml against the ExternalBuilder schema in CI before deploying.","Always pair path and name in every builder stanza.","Validate templated/Helm-rendered YAML output, not just the source template."],"tags":["config","yaml","fabric","external-builder","startup"],"backgroundTag":"missing-config-field","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}