GoogleContainerTools/skaffold · error

upgrading pipeline of profile %d: %w

Error message

upgrading pipeline of profile %d: %w

What it means

For each profile index i, profiles() upgrades old.Profiles[i].Pipeline to the new struct and wraps any failure with 'upgrading pipeline of profile %d: %w'. The index is 1-based in the message to match human profile numbering in skaffold.yaml. The wrapped cause is the error returned by the versioned pipeline Upgrade() for that specific profile.

Source

Thrown at pkg/skaffold/schema/util/upgrade_pipelines.go:90

func (u *pipelineUpgrader) profiles() error {
	const (
		fieldProfilePipeline = "Pipeline"
		fieldProfiles        = "Profiles"
	)

	profilesOld := u.oldConfig.FieldByName(fieldProfiles)
	profilesNew := u.newConfig.FieldByName(fieldProfiles)

	if profilesOld.Len() != profilesNew.Len() {
		return fmt.Errorf("lengths of old and new profiles differ")
	}

	for i := 0; i < profilesOld.Len(); i++ {
		oldPipeline := profilesOld.Index(i).FieldByName(fieldProfilePipeline).Addr().Interface()
		newPipeline := profilesNew.Index(i).FieldByName(fieldProfilePipeline).Addr().Interface()

		if err := u.upgrade(oldPipeline, newPipeline); err != nil {
			return fmt.Errorf("upgrading pipeline of profile %d: %w", i+1, err)
		}
	}

	return nil
}

View on GitHub (pinned to a1189de023)

Solutions

  1. Open the profile named by the index in skaffold.yaml and compare it against the target-version schema
  2. Remove or migrate the unsupported field inside that profile's pipeline, then retry
  3. Run `skaffold fix --profile <name>` if available to upgrade profile contents

Example fix

// before
profiles:
  - name: prod
    build:
      acr: {...}
// after
profiles:
  - name: prod
    build:
      artifacts: [...]
Defensive patterns

Strategy: try-catch

Validate before calling

for i, p := range cfg.Profiles { if p.Build == nil || p.Deploy == nil { return fmt.Errorf("profile %d incomplete", i+1) } }

Try / catch

if err := util.UpgradePipelines(old, new, upgradeFn); err != nil {
	if m := regexp.MustCompile(`profile (\d+)`).FindStringSubmatch(err.Error()); m != nil {
		idx, _ := strconv.Atoi(m[1])
		// inspect cfg.Profiles[idx-1]
	}
}

Prevention

When it happens

Trigger: Calling UpgradePipelines on a config where profile number N (message shows i+1) contains pipeline content the versioned Upgrade() rejects — removed fields, unsupported deployers, or malformed blocks only present in that profile.

Common situations: Profiles that carry legacy build/deploy config no longer supported in the target version; a profile overriding fields the main pipeline doesn't have, hitting an upgrade path only that profile exercises.

Related errors


AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05). Data as JSON: /api/errors/7f4d566f8737dbc5. Report an issue: GitHub.