{"record":{"id":"9e1ea131249eb4f4","repo":"theonedev/onedev","slug":"package-version-not-found-in-metadata","errorCode":null,"errorMessage":"Package version not found in metadata","messagePattern":"Package version not found in metadata","errorType":"http","errorClass":"ClientException","httpStatus":400,"severity":"error","filePath":"server-plugin/server-plugin-pack-gem/src/main/java/io/onedev/server/plugin/pack/gem/GemPackHandler.java","lineNumber":187,"sourceCode":"\t\t\t\t\tif (keyNode.getValue().equals(\"name\")) {\n\t\t\t\t\t\tname = ((ScalarNode) tuple.getValueNode()).getValue();\n\t\t\t\t\t} else if (keyNode.getValue().equals(\"version\")) {\n\t\t\t\t\t\tvar versionNode = (MappingNode) tuple.getValueNode();\n\t\t\t\t\t\tfor (var versionTuple : versionNode.getValue()) {\n\t\t\t\t\t\t\tvar versionKeyNode = (ScalarNode) versionTuple.getKeyNode();\n\t\t\t\t\t\t\tif (versionKeyNode.getValue().equals(\"version\")) {\n\t\t\t\t\t\t\t\tversion = ((ScalarNode) versionTuple.getValueNode()).getValue();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (keyNode.getValue().equals(\"platform\")) {\n\t\t\t\t\t\tplatform = ((ScalarNode) tuple.getValueNode()).getValue();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (name == null)\n\t\t\t\t\tthrow new ClientException(SC_BAD_REQUEST, \"Package name not found in metadata\");\n\t\t\t\tif (version == null)\n\t\t\t\t\tthrow new ClientException(SC_BAD_REQUEST, \"Package version not found in metadata\");\n\n\t\t\t\tString finalName = name;\n\t\t\t\tString finalVersion = version;\n\t\t\t\tString finalPlatform = platform;\n\t\t\t\tbyte[] finalMetadataBytes = metadataBytes;\n\t\t\t\tLockUtils.run(getLockName(projectId, name), () -> transactionService.run(() -> {\n\t\t\t\t\tvar project = projectService.load(projectId);\n\n\t\t\t\t\tPackBlob packBlob;\n\t\t\t\t\ttry (var is = new FileInputStream(tempFile)) {\n\t\t\t\t\t\tpackBlob = packBlobService.load(packBlobService.uploadBlob(projectId, is, null));\n\t\t\t\t\t} catch (IOException e) {\n\t\t\t\t\t\tthrow new RuntimeException(e);\n\t\t\t\t\t}\n\t\t\t\t\tGemData data;\n\t\t\t\t\tvar pack = packService.findByNameAndVersion(project, TYPE, finalName, finalVersion);\n\t\t\t\t\tif (pack == null) {\n\t\t\t\t\t\tpack = new Pack();","sourceCodeStart":169,"sourceCodeEnd":205,"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#L169-L205","documentation":"The gem metadata must include a 'version' entry. If parsing succeeds but no version value was captured, the handler throws 400 'Package version not found in metadata'. Version is required to store and address the package.","triggerScenarios":"Uploading a gem whose metadata YAML lacks the 'version' key — malformed gemspec, hand-built metadata, or a builder that omitted version.","commonSituations":"Custom packaging scripts dropping the version field; patched gems with stripped metadata; very old or exotic gem formats.","solutions":["Rebuild the gem with a gemspec that sets s.version (e.g. '1.0.0') and verify with `gem specification`.","Confirm metadata contents: `tar -xOf mygem.gem metadata.gz | gunzip | grep version`.","Regenerate metadata with standard tooling rather than editing the archive."],"exampleFix":"# before (gemspec)\n# gem.version missing\n# after\nGem::Specification.new do |s|\n  s.version = '1.0.0'\nend","handlingStrategy":"validation","validationCode":"# confirm metadata has a version before upload\nmeta=$(tar -xOf mygem.gem metadata.gz | gunzip)\necho \"$meta\" | grep -q '^version:' || { echo 'missing version in metadata'; exit 1; }","typeGuard":null,"tryCatchPattern":"try { upload(gemFile) } catch (e) { if (e.httpStatus === 400 && /version not found/.test(e.message)) { rebuildFromValidGemspec(); } else { throw e; } }","preventionTips":["Set s.version explicitly in every gemspec.","Never strip fields when repackaging gems.","Validate with `gem specification mygem.gem version` in CI."],"tags":["gem","package-upload","metadata"],"backgroundTag":"missing-required-argument","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"}