diff --git a/workflow/util/util.go b/workflow/util/util.go index 51be4cb90fa0..be5dc4db6e85 100644 --- a/workflow/util/util.go +++ b/workflow/util/util.go @@ -475,7 +475,7 @@ func AddParamToGlobalScope(wf *wfv1.Workflow, log *log.Entry, param wfv1.Paramet wfUpdated = true } else { prevVal := wf.Status.Outputs.Parameters[index].Value - if prevVal == nil || *prevVal != *param.Value { + if prevVal == nil || (param.Value != nil && *prevVal != *param.Value) { log.Infof("overwriting %s: '%s' -> '%s'", paramName, wf.Status.Outputs.Parameters[index].Value, param.Value) wf.Status.Outputs.Parameters[index].Value = param.Value wfUpdated = true diff --git a/workflow/util/util_test.go b/workflow/util/util_test.go index abfb116b3a4b..969daa48a911 100644 --- a/workflow/util/util_test.go +++ b/workflow/util/util_test.go @@ -322,6 +322,31 @@ func TestStopWorkflowByNodeName(t *testing.T) { assert.Equal(t, wfv1.NodeFailed, wf.Status.Nodes.FindByDisplayName("approve").Phase) } +// Regression test for #6478 +func TestAddParamToGlobalScopeValueNil(t *testing.T) { + paramValue := wfv1.AnyString("test") + wf := wfv1.Workflow{ + Status: wfv1.WorkflowStatus{ + Outputs: &wfv1.Outputs{ + Parameters: []wfv1.Parameter{ + { + Name: "test", + Value: ¶mValue, + GlobalName: "global_output_param", + }, + }, + }, + }, + } + + p := AddParamToGlobalScope(&wf, nil, wfv1.Parameter{ + Name: "test", + Value: nil, + GlobalName: "test", + }) + assert.False(t, p) +} + var susWorkflow = ` apiVersion: argoproj.io/v1alpha1 kind: Workflow