{"record":{"id":"706806b6b4e22b09","repo":"theonedev/onedev","slug":"unable-to-find-version-node","errorCode":null,"errorMessage":"Unable to find version node","messagePattern":"Unable to find version 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":521,"sourceCode":"\t\treturn new UserMarshal(\"Gem::Version\", newArrayList(version));\n\t}\n\t\n\tprivate UserMarshal getGemRequirement(Map<String, UserMarshal> requiredVersions) {\n\t\tvar requirements = new ArrayList<>();\n\t\tfor (var entry: requiredVersions.entrySet()) \n\t\t\trequirements.add(newArrayList(entry.getKey(), entry.getValue()));\n\t\tvar value = new ArrayList<>();\n\t\tvalue.add(requirements);\n\t\treturn new UserMarshal(\"Gem::Requirement\", value);\t\n\t}\n\t\n\tprivate UserMarshal getGemVersion(MappingNode node) {\n\t\tcheckArgument(node.getTag().getValue().equals(\"!ruby/object:Gem::Version\"));\t\n\t\tfor (var tuple: node.getValue()) {\n\t\t\tif (((ScalarNode)tuple.getKeyNode()).getValue().equals(\"version\"))\n\t\t\t\treturn getGemVersion(((ScalarNode)tuple.getValueNode()).getValue());\n\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}","sourceCodeStart":503,"sourceCodeEnd":539,"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#L503-L539","documentation":"getGemVersion(MappingNode) parses a YAML node tagged !ruby/object:Gem::Version and expects a mapping key 'version'. If the mapping contains no such key, it throws ExplicitException(\"Unable to find version node\"). This happens while OneDev deserializes gemspec dependency metadata embedded in the gem's metadata.gz during publish.","triggerScenarios":"Publishing a gem whose metadata.gz contains a Gem::Version mapping without a 'version' key — i.e. malformed or hand-edited gemspec YAML; also possible with gems produced by nonstandard tooling.","commonSituations":"Gems built/modified by custom scripts or old exotic RubyGems versions; corrupted upload where metadata.gz was truncated then re-zipped; gems crafted by tools other than gem build.","solutions":["Rebuild the gem with standard tooling: gem build mygem.gemspec, and re-push.","Inspect metadata.gz (tar -xOf mygem-1.0.0.gem metadata.gz | gzip -d) to verify a 'version' key exists in the Gem::Version mapping.","Update local RubyGems (gem update --system) if the gem was built with an unusual version.","Avoid hand-editing gem internals."],"exampleFix":"// before (hand-crafted YAML)\n--- !ruby/object:Gem::Version\n  raw_version: 1.0.0\n// after\n--- !ruby/object:Gem::Version\n  version: 1.0.0","handlingStrategy":"validation","validationCode":"# validate gem metadata before pushing\ntar -xOf mygem-1.0.0.gem metadata.gz | gzip -d | grep -A1 'Gem::Version'\n# ensure each Gem::Version mapping contains a 'version' 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 version node')\n  warn 'Malformed gem metadata: rebuild with `gem build`'\nend","preventionTips":["Always build gems with standard `gem build`, never hand-craft gem internals.","Keep RubyGems updated (gem update --system).","Do not re-zip or modify gem archives after build."],"tags":["yaml","rubygems","parsing","publish"],"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-14T05:17:10.506Z"}