Skip to content

delete artifact_version fails with 500 'unknown algorithm prefix' for digest-based versions #239

Description

@3choBoomer

Summary

harness delete artifact_version <registry/artifact/version> always fails with a 500 when
<version> is a content digest (sha256:...), which is the only version identifier
harness list artifact_version / harness get artifact_version return for Docker artifacts
pushed via docker buildx (no tag-based version lookup is exposed by get/list either —
attempting <registry>/<artifact>/<tag-name> as the version segment 404s instead).

$ harness delete artifact_version "<registry>/<artifact>/sha256:<64-hex-digest>" --level org --org <ORG> --force
API error 500: failed to delete artifact version: failed to parse digest: unknown algorithm prefix "sh"

The error string (unknown algorithm prefix "sh") strongly suggests the backend is
mis-splitting the digest string on its : — "sha256" becomes "sh" plus a leftover
remainder, rather than "sha256" + "<hex>".

This affects any Docker artifact version whose only "version" identifier is a content
digest — i.e. essentially every image pushed via docker buildx build --push without
disable_retag/dockerspec-style extra tags, since harness list artifact_version names
the version by digest, not by tag.

Steps to reproduce

  1. Push any Docker image to a Harness Artifact Registry (native har-backed registry, DOCKER package type), e.g. via docker buildx build --push or a Harness CI BuildAndPushDockerRegistry step.
  2. harness list artifact_version <registry>/<artifact> --level org --org <ORG> --all --format json — confirm the pushed version is listed only by its digest (name field = sha256:...), with its tag(s) under metadata.tags.
  3. harness get artifact_version "<registry>/<artifact>/sha256:<digest>" --level org --org <ORG> — succeeds, returns the version metadata correctly.
  4. harness delete artifact_version "<registry>/<artifact>/sha256:<digest>" --level org --org <ORG> --force — fails with the 500 above.

Debug output (--debug) shows the CLI constructs and sends this request:

DELETE /har/api/v1/registry/<ACCOUNT_ID>/<ORG>/<registry>/+/artifact/<artifact>/+/version/sha256:<digest>?accountIdentifier=<ACCOUNT_ID>&orgIdentifier=<ORG>

→ 500 {"failed to delete artifact version: failed to parse digest: unknown algorithm prefix \"sh\""}

I also tried URL-encoding the colon in the version segment (sha256%3A<digest>) client-side —
same result, since the CLI (or the server) appears to normalize/decode it back to a literal
: before constructing the request.

Expected behavior

harness delete artifact_version should successfully delete a version identified by its
content digest, exactly as returned by harness list artifact_version / accepted by
harness get artifact_version.

Workaround used

Bypassed the CLI/har module entirely and used the standard OCI Distribution / Docker
Registry v2 HTTP API directly against the same registry endpoint:

# 1. Get a delete-scoped bearer token (reusing existing local `docker login` credentials
#    for the registry host, read from ~/.docker/config.json)
TOKEN=$(curl -s -u "<user>:<pass>" \
  "https://<registry-host>/v2/token?service=harness-artifact-registry&scope=repository:<account>/<registry>/<artifact>:pull,push,delete" \
  | jq -r .token)

# 2. Delete the manifest by digest via the standard registry API
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
  "https://<registry-host>/v2/<account>/<registry>/<artifact>/manifests/sha256:<digest>"
# -> 202 Accepted

This confirms the underlying registry itself supports manifest deletion by digest just fine —
the bug is specifically in the har CLI plugin's (or its backend API's) request path/digest
handling for the delete artifact_version verb.

Environment

  • harness CLI version: 3.6.2
  • har plugin version: 0.9.3 (us-docker.pkg.dev/... — bundled plugin, not separately installed)
  • OS/Arch: darwin/arm64

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions