Skip to content

Add --save-on-render-failure flag to fn render#4400

Merged
liamfallon merged 3 commits into
kptdev:mainfrom
Nordix:fn-render-save-on-failure-flag
Feb 23, 2026
Merged

Add --save-on-render-failure flag to fn render#4400
liamfallon merged 3 commits into
kptdev:mainfrom
Nordix:fn-render-save-on-failure-flag

Conversation

@aravindtga
Copy link
Copy Markdown
Contributor

@aravindtga aravindtga commented Feb 18, 2026

This PR implements the kpt side of the feature to save partially rendered resources when pipeline execution fails, enabling better debugging of render failures.

Part of: kptdev/porch#768

Note

125 of the 131 changed files are E2E test data and test scenarios. The core implementation changes are in 6 files.

Changes

New CLI Flag:

  • --save-on-render-failure: Saves partially rendered resources when rendering fails (opt-in, default: disabled)

Core Modifications:

  • Modified hydrate() and hydrateBfsOrder() to preserve intermediate resources on failure
  • Enhanced runPipeline() to return partial output instead of nil on error
  • Added clearAnnotationsOnMutFailure() to clean up internal annotations on mutation failure
  • Implemented printPipelineExecutionSummary() for contextual feedback (success/partial/failed)

Testing:

  • 17 e2e test scenarios covering DFS/BFS rendering modes with various failure scenarios
  • Unit tests for summary printing and annotation cleanup

Next Steps:

  • Add render status conditions to Kptfile
  • Add per-function execution results to Kptfile

Copilot AI review requested due to automatic review settings February 18, 2026 17:21
@netlify
Copy link
Copy Markdown

netlify Bot commented Feb 18, 2026

Deploy Preview for kptdocs ready!

Name Link
🔨 Latest commit 3fdce3d
🔍 Latest deploy log https://app.netlify.com/projects/kptdocs/deploys/6998455f0b9e6b0008422590
😎 Deploy Preview https://deploy-preview-4400--kptdocs.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Implements the --save-on-render-failure feature for kpt fn render, enabling users to persist partially rendered resources when pipeline execution fails to improve debugging.

Changes:

  • Added --save-on-render-failure CLI flag and propagated it through runner options and test runner config.
  • Updated renderer/hydration flow to preserve partial resources and return partial outputs on failure.
  • Added unit tests and extensive e2e fixtures/expected outputs for DFS/BFS failure scenarios.

Reviewed changes

Copilot reviewed 130 out of 131 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
pkg/test/runner/runner.go Passes the new flag through the e2e runner when configured.
pkg/test/runner/config.go Adds test-case config knob for saveOnRenderFailure.
pkg/lib/runneroptions/runneroptions.go Introduces SaveOnRenderFailure runner option.
internal/util/render/executor.go Saves partial resources on failures, returns partial output, clears internal annotations on mutator failure, prints execution summary.
internal/util/render/executor_test.go Adds unit tests for summary printing and annotation cleanup.
commands/fn/render/cmdrender.go Exposes the new CLI flag on kpt fn render.
e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/resources.yaml Adds e2e fixture for non-saving behavior scenario.
e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/Kptfile Adds e2e pipeline fixture for non-saving behavior scenario.
e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/.krmignore Ignores golden output directory in e2e scenario.
e2e/testdata/fn-render/save-on-render-failure/no-save-on-render-failure/.expected/config.yaml Adds expected stderr/exit code for non-saving behavior scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/subpkg/deployment.yaml Adds DFS e2e subpackage resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/subpkg/Kptfile Adds DFS e2e subpackage pipeline fixture (validator failure).
e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/deployment.yaml Adds DFS e2e root resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/Kptfile Adds DFS e2e root pipeline fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/.krmignore Ignores golden output directory in DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/.expected/diff.patch Adds expected diff output for DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-validator-fails/.expected/config.yaml Adds expected stderr/exit code for DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/subpkg/deployment.yaml Adds DFS e2e subpackage resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/subpkg/Kptfile Adds DFS e2e subpackage pipeline fixture (mutator failure).
e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/deployment.yaml Adds DFS e2e root resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/Kptfile Adds DFS e2e root pipeline fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/.krmignore Ignores golden output directory in DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/.expected/diff.patch Adds expected diff output for DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-subpkg-mutator-fails/.expected/config.yaml Adds expected stderr/exit code for DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/subpkg/service.yaml Adds DFS e2e subpackage resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/subpkg/Kptfile Adds DFS e2e subpackage pipeline fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/configmap.yaml Adds DFS e2e root resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/Kptfile Adds DFS e2e root pipeline fixture (validator failure).
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/.krmignore Ignores golden output directory in DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/.expected/diff.patch Adds expected diff output for DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-validator-fails/.expected/config.yaml Adds expected stderr/exit code for DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/subpkg/service.yaml Adds DFS e2e subpackage resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/subpkg/Kptfile Adds DFS e2e subpackage pipeline fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/configmap.yaml Adds DFS e2e root resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/Kptfile Adds DFS e2e root pipeline fixture (mutator failure).
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/.krmignore Ignores golden output directory in DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/.expected/diff.patch Adds expected diff output for DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-mutator-fails/.expected/config.yaml Adds expected stderr/exit code for DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/subpkg/service.yaml Adds DFS e2e subpackage resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/subpkg/Kptfile Adds DFS e2e subpackage pipeline fixture (failure).
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/configmap.yaml Adds DFS e2e root resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/Kptfile Adds DFS e2e root pipeline fixture (failure).
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/.krmignore Ignores golden output directory in DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/.expected/diff.patch Adds expected diff output for DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-parent-and-subpkg-both-fail/.expected/config.yaml Adds expected stderr/exit code for DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub3/deployment.yaml Adds DFS e2e subpackage resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub3/Kptfile Adds DFS e2e subpackage pipeline fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub2/deployment.yaml Adds DFS e2e subpackage resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub2/Kptfile Adds DFS e2e subpackage pipeline fixture (failure).
e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub1/deployment.yaml Adds DFS e2e subpackage resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/sub1/Kptfile Adds DFS e2e subpackage pipeline fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/service.yaml Adds DFS e2e root resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/Kptfile Adds DFS e2e root pipeline fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/.krmignore Ignores golden output directory in DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/.expected/diff.patch Adds expected diff output for DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-multiple-subpkgs-one-fails/.expected/config.yaml Adds expected stderr/exit code for DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/level1/level2/configmap.yaml Adds DFS e2e nested resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/level1/level2/Kptfile Adds DFS e2e nested pipeline fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/level1/configmap.yaml Adds DFS e2e level1 resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/level1/Kptfile Adds DFS e2e level1 pipeline fixture (failure).
e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/configmap.yaml Adds DFS e2e root resource fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/Kptfile Adds DFS e2e root pipeline fixture.
e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/.krmignore Ignores golden output directory in DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/.expected/diff.patch Adds expected diff output for DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-deep-nested-middle-fails/.expected/config.yaml Adds expected stderr/exit code for DFS scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/resources.yaml Adds basic DFS fixture resources.
e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/Kptfile Adds basic DFS fixture pipeline (failure).
e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/.krmignore Ignores golden output directory in DFS basic scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/.expected/diff.patch Adds expected diff output for DFS basic scenario.
e2e/testdata/fn-render/save-on-render-failure/dfs-basicpipeline/.expected/config.yaml Adds expected stderr/exit code for DFS basic scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/subpkg/deployment.yaml Adds BFS e2e subpackage resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/subpkg/Kptfile Adds BFS e2e subpackage pipeline fixture (failure).
e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/deployment.yaml Adds BFS e2e root resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/Kptfile Adds BFS e2e root pipeline fixture (BFS rendering mode).
e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/.krmignore Ignores golden output directory in BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/.expected/diff.patch Adds expected diff output for BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-validator-fails/.expected/config.yaml Adds expected stderr/exit code for BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/subpkg/deployment.yaml Adds BFS e2e subpackage resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/subpkg/Kptfile Adds BFS e2e subpackage pipeline fixture (failure).
e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/deployment.yaml Adds BFS e2e root resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/Kptfile Adds BFS e2e root pipeline fixture (BFS rendering mode).
e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/.krmignore Ignores golden output directory in BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/.expected/diff.patch Adds expected diff output for BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-subpkg-mutator-fails/.expected/config.yaml Adds expected stderr/exit code for BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/subpkg/service.yaml Adds BFS e2e subpackage resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/subpkg/Kptfile Adds BFS e2e subpackage pipeline fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/configmap.yaml Adds BFS e2e root resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/Kptfile Adds BFS e2e root pipeline fixture (failure).
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/.krmignore Ignores golden output directory in BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/.expected/diff.patch Adds expected diff output for BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-validator-fails/.expected/config.yaml Adds expected stderr/exit code for BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/subpkg/service.yaml Adds BFS e2e subpackage resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/subpkg/Kptfile Adds BFS e2e subpackage pipeline fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/configmap.yaml Adds BFS e2e root resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/Kptfile Adds BFS e2e root pipeline fixture (failure).
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/.krmignore Ignores golden output directory in BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/.expected/diff.patch Adds expected diff output for BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-mutator-fails/.expected/config.yaml Adds expected stderr/exit code for BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/subpkg/service.yaml Adds BFS e2e subpackage resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/subpkg/Kptfile Adds BFS e2e subpackage pipeline fixture (failure).
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/configmap.yaml Adds BFS e2e root resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/Kptfile Adds BFS e2e root pipeline fixture (failure).
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/.krmignore Ignores golden output directory in BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/.expected/diff.patch Adds expected diff output for BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-parent-and-subpkg-both-fail/.expected/config.yaml Adds expected stderr/exit code for BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub3/deployment.yaml Adds BFS e2e subpackage resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub3/Kptfile Adds BFS e2e subpackage pipeline fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub2/deployment.yaml Adds BFS e2e subpackage resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub2/Kptfile Adds BFS e2e subpackage pipeline fixture (failure).
e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub1/deployment.yaml Adds BFS e2e subpackage resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/sub1/Kptfile Adds BFS e2e subpackage pipeline fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/service.yaml Adds BFS e2e root resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/Kptfile Adds BFS e2e root pipeline fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/.krmignore Ignores golden output directory in BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/.expected/diff.patch Adds expected diff output for BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-multiple-subpkgs-one-fails/.expected/config.yaml Adds expected stderr/exit code for BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/level1/level2/configmap.yaml Adds BFS e2e nested resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/level1/level2/Kptfile Adds BFS e2e nested pipeline fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/level1/configmap.yaml Adds BFS e2e level1 resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/level1/Kptfile Adds BFS e2e level1 pipeline fixture (failure).
e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/configmap.yaml Adds BFS e2e root resource fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/Kptfile Adds BFS e2e root pipeline fixture.
e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/.krmignore Ignores golden output directory in BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/.expected/diff.patch Adds expected diff output for BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-deep-nested-middle-fails/.expected/config.yaml Adds expected stderr/exit code for BFS scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/resources.yaml Adds basic BFS fixture resources.
e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/Kptfile Adds basic BFS fixture pipeline (failure).
e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/.krmignore Ignores golden output directory in BFS basic scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/.expected/diff.patch Adds expected diff output for BFS basic scenario.
e2e/testdata/fn-render/save-on-render-failure/bfs-basicpipeline/.expected/config.yaml Adds expected stderr/exit code for BFS basic scenario.
Comments suppressed due to low confidence (6)

internal/util/render/executor_test.go:1

  • clearAnnotationsOnMutFailure is implemented as a package-level function in executor.go, but the test calls it as a method on pkgNode, which will not compile. Update the test to call clearAnnotationsOnMutFailure(nodes) directly (and consider renaming the test to match the function name if it’s no longer a pkgNode method)."
    internal/util/render/executor.go:1
  • Hydration errors (hydErr) are handled only after adjustRelPath(hctx) runs, which can (a) mutate state after a failed hydration and (b) mask the original hydration failure if adjustRelPath returns an error. Restructure to short-circuit on hydErr before running adjustRelPath when partial-saving is disabled; when partial-saving is enabled, treat adjustRelPath as best-effort and ensure the returned error remains the hydration error (e.g., log/attach the adjust error rather than replacing hydErr).
    internal/util/render/executor.go:1
  • Hydration errors (hydErr) are handled only after adjustRelPath(hctx) runs, which can (a) mutate state after a failed hydration and (b) mask the original hydration failure if adjustRelPath returns an error. Restructure to short-circuit on hydErr before running adjustRelPath when partial-saving is disabled; when partial-saving is enabled, treat adjustRelPath as best-effort and ensure the returned error remains the hydration error (e.g., log/attach the adjust error rather than replacing hydErr).
    internal/util/render/executor.go:1
  • Because hydErr is only checked after the output branch, the e.Output != nil path can write partially-rendered resources even when --save-on-render-failure is NOT enabled. If the flag is meant to be opt-in (per PR description), gate the output-writing logic the same way as the in-place writer: only write when hydErr == nil OR SaveOnRenderFailure is true.
    internal/util/render/executor.go:1
  • Because hydErr is only checked after the output branch, the e.Output != nil path can write partially-rendered resources even when --save-on-render-failure is NOT enabled. If the flag is meant to be opt-in (per PR description), gate the output-writing logic the same way as the in-place writer: only write when hydErr == nil OR SaveOnRenderFailure is true.
    internal/util/render/executor.go:1
  • There is an extra space in the parameter list (hydErr error). Please format to a single space to satisfy gofmt/style consistency.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread commands/fn/render/cmdrender.go Outdated
Signed-off-by: aravind.est <aravindhan.a@est.tech>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 130 out of 131 changed files in this pull request and generated no new comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Full error message comparison doesn't suits this because each docker environment generates the error message in different format.

Signed-off-by: aravind.est <aravindhan.a@est.tech>
Comment thread internal/util/render/executor.go Outdated
Comment thread internal/util/render/executor.go Outdated
Comment thread internal/util/render/executor.go Outdated
@dosubot dosubot Bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Feb 19, 2026
Copilot AI review requested due to automatic review settings February 19, 2026 20:32
@aravindtga aravindtga force-pushed the fn-render-save-on-failure-flag branch from 6400107 to 2353446 Compare February 19, 2026 20:42
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 130 out of 131 changed files in this pull request and generated 1 comment.

Comments suppressed due to low confidence (2)

internal/util/render/executor.go:508

  • The executePipelinesWithScopedVisibility error path only preserves/aggregates resources when output != nil. If runPipeline fails before producing output (e.g., runner construction/validation error), --save-on-render-failure will return early without rebuilding hctx.root.resources, so earlier successful package outputs may not be saved.

Consider aggregating the current allNodes state (and propagating as needed) whenever SaveOnRenderFailure is enabled, regardless of whether output is nil. Also, if output!=nil should be gofmt’d (output != nil).
internal/util/render/executor.go:346

  • In the subpackage hydration error path, saving partial resources is gated on transitiveResources != nil. If a failing subpackage returns nil output (e.g., it fails before producing any resources), the parent/root won't set curr.resources even though input may already contain resources from previously hydrated siblings. This can cause partial output to be lost despite --save-on-render-failure.

Consider setting curr.resources whenever SaveOnRenderFailure is enabled (and appending transitiveResources only if non-nil), so already-collected resources are preserved.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread internal/util/render/executor.go
@aravindtga aravindtga force-pushed the fn-render-save-on-failure-flag branch 2 times, most recently from 6bb41e8 to 33a2660 Compare February 19, 2026 21:12
Copilot AI review requested due to automatic review settings February 19, 2026 21:12
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 130 out of 131 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread internal/util/render/executor.go
Comment thread internal/util/render/executor.go
Comment thread internal/util/render/executor.go
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 130 out of 131 changed files in this pull request and generated 2 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread internal/util/render/executor.go
Comment thread internal/util/render/executor.go
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 130 out of 131 changed files in this pull request and generated 5 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread internal/util/render/executor_test.go
Comment thread internal/util/render/executor.go Outdated
Comment thread internal/util/render/executor.go
Comment thread internal/util/render/executor.go
Comment thread pkg/test/runner/config.go
Signed-off-by: aravind.est <aravindhan.a@est.tech>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 130 out of 131 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (1)

internal/util/render/executor.go:119

  • When SaveOnRenderFailure is enabled and hydration fails, the code continues to execute adjustRelPath() and trackOutputFiles() on the partial resources (lines 112-118). However, if hctx.root.resources is empty or incomplete due to the hydration failure, adjustRelPath() could fail with errors like "path annotation missing" when iterating over resources that may not have proper annotations set.

Consider adding defensive checks to ensure hctx.root.resources is not empty before calling these functions, or handle their errors gracefully when SaveOnRenderFailure is enabled. For example:

if len(hctx.root.resources) > 0 {
    err = adjustRelPath(hctx)
    if err != nil {
        if hydErr != nil {
            // If hydration already failed, log the adjustment error but don't fail
            pr.Printf("Warning: failed to adjust resource paths: %v\n", err)
        } else {
            return nil, err
        }
    }
    
    if err = trackOutputFiles(hctx); err != nil {
        if hydErr != nil {
            pr.Printf("Warning: failed to track output files: %v\n", err)
        } else {
            return nil, err
        }
    }
}

This ensures that when partial resources are being saved, additional errors in path adjustment don't mask the original hydration error.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@dosubot dosubot Bot added the lgtm label Feb 20, 2026
@liamfallon liamfallon merged commit 84feb56 into kptdev:main Feb 23, 2026
18 of 19 checks passed
@dosubot
Copy link
Copy Markdown
Contributor

dosubot Bot commented Feb 23, 2026

Documentation Updates

2 document(s) were updated by changes in this PR:

_index
View Changes
@@ -52,6 +52,9 @@
 
 --allow-network:
   Allow functions to access network during pipeline execution. Default: `false`. Note that this is applicable to container based functions only.
+
+--save-on-render-failure:
+  Save partially rendered resources when rendering fails. Default: `false`. When enabled, this flag preserves the state of resources at the point of failure, which is useful for debugging render failures and understanding what changes were applied before the error occurred.
 
 --image-pull-policy:
   If the image should be pulled before rendering the package(s). It can be set
_index
View Changes
@@ -126,6 +126,18 @@
 
 If any of the functions in the pipeline fails for whatever reason, then the
 entire pipeline is aborted and the local filesystem is left intact.
+
+### Debugging render failures
+
+When a render pipeline fails, you can use the `--save-on-render-failure` flag to save the partially rendered resources to disk. This is particularly useful for debugging function pipeline issues by inspecting what changes were made before the failure occurred.
+
+By default, this flag is disabled and partially rendered resources are not saved when render fails. To enable it:
+
+```shell
+kpt fn render wordpress --save-on-render-failure
+```
+
+With this flag enabled, if a function in the pipeline fails, kpt will save all resources that were successfully processed up to the point of failure. This allows you to examine the intermediate state and understand what transformations were applied before the error.
 
 ### Specifying `function`
 

How did I do? Any feedback?  Join Discord

@efiacor efiacor deleted the fn-render-save-on-failure-flag branch February 23, 2026 11:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/fn-runtime KRM function runtime lgtm size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants