{"record":{"id":"83af109f52d0e7e7","repo":"theonedev/onedev","slug":"unable-to-find-requirements-node","errorCode":null,"errorMessage":"Unable to find requirements node","messagePattern":"Unable to find requirements node","errorType":"exception","errorClass":"ExplicitException","httpStatus":null,"severity":"error","filePath":"server-plugin/server-plugin-pack-gem/src/main/java/io/onedev/server/plugin/pack/gem/GemPackHandler.java","lineNumber":538,"sourceCode":"\t\t}\n\t\tthrow new ExplicitException(\"Unable to find version node\");\n\t}\n\t\n\tprivate UserMarshal getGemRequirement(MappingNode node) {\n\t\tcheckArgument(node.getTag().getValue().equals(\"!ruby/object:Gem::Requirement\"));\n\t\tfor (var tuple: node.getValue()) {\n\t\t\tif (((ScalarNode)tuple.getKeyNode()).getValue().equals(\"requirements\")) {\n\t\t\t\tvar requiredVersions = new LinkedHashMap<String, UserMarshal>();\n\t\t\t\tfor (var requirementNode: ((SequenceNode)tuple.getValueNode()).getValue()) {\n\t\t\t\t\tvar operatorAndVersion = ((SequenceNode)requirementNode).getValue();\n\t\t\t\t\tvar operator = ((ScalarNode)operatorAndVersion.get(0)).getValue();\n\t\t\t\t\tvar gemVersion = getGemVersion((MappingNode) operatorAndVersion.get(1));\n\t\t\t\t\trequiredVersions.put(operator, gemVersion);\n\t\t\t\t}\n\t\t\t\treturn getGemRequirement(requiredVersions);\n\t\t\t}\n\t\t}\n\t\tthrow new ExplicitException(\"Unable to find requirements node\");\n\t}\n\t\n\tprivate RubyObject getGemDependency(MappingNode node) {\n\t\tcheckArgument(node.getTag().getValue().equals(\"!ruby/object:Gem::Dependency\"));\n\n\t\tvar members = new HashMap<String, Object>();\n\t\t\n\t\tfor (var tuple: node.getValue()) {\n\t\t\tvar keyValue = ((ScalarNode)tuple.getKeyNode()).getValue();\n\t\t\tswitch (keyValue) {\n\t\t\t\tcase \"name\":\n\t\t\t\tcase \"type\":\n\t\t\t\t\tmembers.put(\"@\" + keyValue, ((ScalarNode)tuple.getValueNode()).getValue());\t\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"requirement\":\n\t\t\t\tcase \"version_requirements\":\n\t\t\t\t\tmembers.put(\"@\" + keyValue, getGemRequirement((MappingNode) tuple.getValueNode()));\n\t\t\t\t\tbreak;","sourceCodeStart":520,"sourceCodeEnd":556,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-plugin/server-plugin-pack-gem/src/main/java/io/onedev/server/plugin/pack/gem/GemPackHandler.java#L520-L556","documentation":"getGemRequirement(MappingNode) parses a YAML node tagged !ruby/object:Gem::Requirement expecting a 'requirements' key holding the version constraints list. When that key is absent it throws ExplicitException(\"Unable to find requirements node\"). Raised during gem publish while parsing dependency entries in the gem's metadata.","triggerScenarios":"Publishing a gem whose metadata Gem::Requirement mapping lacks 'requirements' — malformed dependency YAML, truncated metadata.gz, or gems generated by nonstandard packaging tools.","commonSituations":"Custom gem builders writing dependency data by hand; corrupted/partial uploads; very old or patched RubyGems producing a different serialization layout.","solutions":["Rebuild the gem with standard `gem build` and re-push.","Inspect metadata (tar -xOf mygem-1.0.0.gem metadata.gz | gzip -d) to confirm each Gem::Requirement has a 'requirements' key.","Update RubyGems before building if the producing toolchain is old.","Simplify or regenerate the gemspec's add_dependency declarations so standard tooling serializes them."],"exampleFix":"// before (malformed YAML)\n--- !ruby/object:Gem::Requirement\n  constraints:\n    - [\">=\", !ruby/object:Gem::Version {version: 2.0.0}]\n// after\n--- !ruby/object:Gem::Requirement\n  requirements:\n    - - \">=\"\n      - !ruby/object:Gem::Version\n        version: 2.0.0","handlingStrategy":"validation","validationCode":"# validate dependency metadata before pushing\ntar -xOf mygem-1.0.0.gem metadata.gz | gzip -d | grep -B2 -A6 'Gem::Requirement'\n# ensure every Gem::Requirement mapping contains a 'requirements' key","typeGuard":null,"tryCatchPattern":"begin\n  gem_push('onedev-host', 'mygem-1.0.0.gem')\nrescue => e\n  raise unless e.message.include?('Unable to find requirements node')\n  warn 'Malformed dependency metadata: rebuild with `gem build`'\nend","preventionTips":["Declare dependencies only via add_dependency/add_runtime_dependency in the gemspec.","Build with standard tooling; avoid third-party gem packers.","Verify gem installability locally (gem install ./mygem-1.0.0.gem) before pushing."],"tags":["yaml","rubygems","parsing","dependencies"],"backgroundTag":"schema-validation-failed","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}