Description
What problem are you trying to solve?
I am evaluating the OSS version of Nexus Repository Manager to determine its suitability for automating workflows. One requirement is the ability to search assets by their SHA256 digest. However, the /service/rest/v1/search/assets
API returns an empty result when queried with a valid digest, even though the asset is visible in the response from /service/rest/v1/assets
.
Do you have a workaround you are using at present?
I'm using /service/rest/repository/browse
to manually locate the blob by iterating through all assets, but this is not scalable for automation
What feature or behavior is this required for?
I need to programmatically search blobs by their digest for automating workflows
Tell us about your Nexus Repository deployment: what version, operating system, and database are you using?
Nexus RepositoryOSS 3.75.1-01
Anything else?
Steps to reproduce this issue:
-
Verify Asset Exists: Query the
/service/rest/v1/assets
API to confirm the asset exists:
GET /service/rest/v1/assets?repository=alpine
Json Response
{ "items": [{ "downloadUrl": "http://localhost:8081/repository/alpine/v2/-/blobs/sha256:52f827f723504aa3325bb5a54247f0dc4b92bb72569525bc951532c4ef679bd4", "path": "/v2/-/blobs/sha256:52f827f723504aa3325bb5a54247f0dc4b92bb72569525bc951532c4ef679bd4", "id": "YWxwaW5lOjhmZjM0Nzhh", "repository": "alpine", "format": "docker", "checksum": { "sha256": "52f827f723504aa3325bb5a54247f0dc4b92bb72569525bc951532c4ef679bd4", "sha1": "65608834df7f0af4f23c7b8ea1299746b0843265" }, "contentType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "lastModified": "2025-01-14T15:10:04.582+00:00", "lastDownloaded": "2025-01-14T15:11:01.154+00:00", "uploader": "admin", "uploaderIp": "172.17.0.1", "fileSize": 3992359, "blobCreated": "2025-01-14T15:10:04.598+00:00", "blobStoreName": null, "docker": {} }, { "downloadUrl": "http://localhost:8081/repository/alpine/v2/-/blobs/sha256:7ad00e65ee25911881c06b97a3e562675d255e1265ba4abadd3e906d266c1dcc", "path": "/v2/-/blobs/sha256:7ad00e65ee25911881c06b97a3e562675d255e1265ba4abadd3e906d266c1dcc", "id": "YWxwaW5lOmRmMGYwNDY3", "repository": "alpine", "format": "docker", "checksum": { "sha256": "7ad00e65ee25911881c06b97a3e562675d255e1265ba4abadd3e906d266c1dcc", "sha1": "5c2196cd90d8fa552077d6fa416cf3e9ec4e49cc" }, "contentType": "application/vnd.docker.container.image.v1+json", "lastModified": "2025-01-14T15:10:04.749+00:00", "lastDownloaded": "2025-01-14T15:10:04.772+00:00", "uploader": "admin", "uploaderIp": "172.17.0.1", "fileSize": 597, "blobCreated": "2025-01-14T15:10:04.752+00:00", "blobStoreName": null, "docker": {} }, { "downloadUrl": "http://localhost:8081/repository/alpine/v2/alpine/alpine/manifests/sha256:e109f16fa790ab35054c49d1b7f2a83e7766daa1a8491a1e07998fa180952451", "path": "/v2/alpine/alpine/manifests/sha256:e109f16fa790ab35054c49d1b7f2a83e7766daa1a8491a1e07998fa180952451", "id": "YWxwaW5lOjJlMmFjMTQ0", "repository": "alpine", "format": "docker", "checksum": { "sha256": "e109f16fa790ab35054c49d1b7f2a83e7766daa1a8491a1e07998fa180952451", "sha1": "e241c28861c063e3e172fdcd19a4687be11f4757" }, "contentType": "application/vnd.docker.distribution.manifest.v2+json", "lastModified": "2025-01-14T15:10:04.814+00:00", "lastDownloaded": "2025-01-14T15:11:13.240+00:00", "uploader": "admin", "uploaderIp": "172.17.0.1", "fileSize": 527, "blobCreated": "2025-01-14T15:10:04.819+00:00", "blobStoreName": null, "docker": {} }, { "downloadUrl": "http://localhost:8081/repository/alpine/v2/alpine/alpine/manifests/latest", "path": "/v2/alpine/alpine/manifests/latest", "id": "YWxwaW5lOjdkNDY3ZTIx", "repository": "alpine", "format": "docker", "checksum": { "sha256": "e109f16fa790ab35054c49d1b7f2a83e7766daa1a8491a1e07998fa180952451", "sha1": "e241c28861c063e3e172fdcd19a4687be11f4757" }, "contentType": "application/vnd.docker.distribution.manifest.v2+json", "lastModified": "2025-01-14T15:10:04.919+00:00", "lastDownloaded": null, "uploader": "admin", "uploaderIp": "172.17.0.1", "fileSize": 527, "blobCreated": "2025-01-14T15:10:04.931+00:00", "blobStoreName": null, "docker": {} } ], "continuationToken": null }
-
Search for the Asset by Digest: Query the /service/rest/v1/search/assets API with the asset's SHA256:
GET /service/rest/v1/search/assets?repository=alpine&sha256=7ad00e65ee25911881c06b97a3e562675d255e1265ba4abadd3e906d266c1dcc
OR
GET /service/rest/v1/search/assets?repository=alpine&docker.contentDigest=sha256:7ad00e65ee25911881c06b97a3e562675d255e1265ba4abadd3e906d266c1dcc
returns:
{ "items": [], "continuationToken": null }
I am not sure if I am using the API incorrectly or if I should be using a different parameter to search. Any assistance would be appreciated. Thank you!