{"record":{"id":"1b8490cb63584abe","repo":"GoogleContainerTools/skaffold","slug":"no-valid-tagger-found-for-artifact-q","errorCode":null,"errorMessage":"no valid tagger found for artifact: %q","messagePattern":"no valid tagger found for artifact: %q","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/tag/tagger_mux.go","lineNumber":35,"sourceCode":"package tag\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/GoogleContainerTools/skaffold/v2/pkg/skaffold/graph\"\n\t\"github.com/GoogleContainerTools/skaffold/v2/pkg/skaffold/runner/runcontext\"\n\t\"github.com/GoogleContainerTools/skaffold/v2/pkg/skaffold/schema/latest\"\n)\n\ntype TaggerMux struct {\n\tbyImageName map[string]Tagger\n}\n\nfunc (t *TaggerMux) GenerateTag(ctx context.Context, image latest.Artifact) (string, error) {\n\ttagger, found := t.byImageName[image.ImageName]\n\tif !found {\n\t\treturn \"\", fmt.Errorf(\"no valid tagger found for artifact: %q\", image.ImageName)\n\t}\n\treturn tagger.GenerateTag(ctx, image)\n}\n\nfunc NewTaggerMux(runCtx *runcontext.RunContext) (Tagger, error) {\n\tpipelines := runCtx.GetPipelines()\n\tm := make(map[string]Tagger)\n\tfor _, p := range pipelines {\n\t\tt, err := getTagger(runCtx, &p.Build.TagPolicy)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"creating tagger: %w\", err)\n\t\t}\n\t\tfor _, a := range p.Build.Artifacts {\n\t\t\tm[a.ImageName] = t\n\t\t}\n\t}\n\treturn &TaggerMux{byImageName: m}, nil\n}","sourceCodeStart":17,"sourceCodeEnd":53,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/tag/tagger_mux.go#L17-L53","documentation":"TaggerMux dispatches tag generation per artifact by looking up a Tagger in a map keyed by image name. This error means the requested artifact's ImageName was never registered in that map when the mux was built, so no tagger can produce a tag for it. It is thrown because the mux is constructed from the pipelines' artifact lists and only knows those exact image names.","triggerScenarios":"Calling GenerateTag(ctx, image) with a latest.Artifact whose ImageName does not exactly match any artifact ImageName in the RunContext pipelines used to build the mux — e.g. an image built outside the skaffold config, a renamed image, or a mux reused across different run contexts.","commonSituations":"Image name typos in kustomize/helm manifests vs skaffold.yaml; artifacts generated dynamically at runtime; reusing a TaggerMux built from one config with artifacts from another; profile overrides that rename images.","solutions":["Verify the artifact's ImageName exactly matches an artifact defined in skaffold.yaml (case- and tag-sensitive, no :tag suffix)","Rebuild the TaggerMux via NewTaggerMux with the same RunContext that contains the artifact","Add the missing artifact to the skaffold.yaml build.artifacts list"],"exampleFix":"// before\nmux, _ := tag.NewTaggerMux(runCtx) // built from config A\ntag, err := mux.GenerateTag(ctx, latest.Artifact{ImageName: \"my-app\"}) // not in config A\n\n// after\nmux, _ := tag.NewTaggerMux(runCtxWithMyApp) // run context that defines my-app\ntag, err := mux.GenerateTag(ctx, latest.Artifact{ImageName: \"my-app\"})","handlingStrategy":"validation","validationCode":"func artifactHasTagger(mux tag.Tagger, img string) bool {\n    if tm, ok := mux.(*tag.TaggerMux); ok {\n        return tm.HasTagger(img)\n    }\n    return true\n}\n// call before GenerateTag; skip/log artifacts that fail the check","typeGuard":"if tm, ok := mux.(*tag.TaggerMux); ok { /* tm is *tag.TaggerMux; check image membership */ }","tryCatchPattern":"img, err := mux.GenerateTag(ctx, artifact)\nif err != nil {\n    if strings.Contains(err.Error(), \"no valid tagger found for artifact\") {\n        // fall back to sha256 tagger for unregistered images\n        return fallbackTagger.GenerateTag(ctx, artifact)\n    }\n    return \"\", err\n}","preventionTips":["Keep image names in manifests identical to skaffold.yaml build.artifacts entries","Always build the TaggerMux from the same RunContext that owns the artifacts you tag","Add a startup check that every artifact to be deployed has a registered tagger"],"tags":["skaffold","tagging","config"],"backgroundTag":"no-tagger-for-artifact","analyzedSha":"a1189de023efc32d4b8e11f395acc678aa555011","analyzedAt":"2026-09-05T12:09:27.064Z","contentChangedAt":"2026-09-05T12:09:27.064Z","schemaVersion":2},"datasetVersion":"2026-09-12T17:17:11.597Z"}