Skip to content

Commit 5403b3e

Browse files
authored
fix: Kustomize skip commit if nothing changed (#607)
Signed-off-by: Fs02 <surya.asriadie@gmail.com>
1 parent 13f01ec commit 5403b3e

File tree

2 files changed

+55
-14
lines changed

2 files changed

+55
-14
lines changed

pkg/argocd/git.go

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -329,40 +329,51 @@ func writeKustomization(app *v1alpha1.Application, wbc *WriteBackConfig, gitC gi
329329
return err, false
330330
}
331331

332-
if err = updateKustomizeFile(filterFunc, kustFile); err != nil {
333-
return err, false
334-
}
335-
336-
return nil, false
332+
return updateKustomizeFile(filterFunc, kustFile)
337333
}
338334

339335
// updateKustomizeFile reads the kustomization file at path, applies the filter to it, and writes the result back
340336
// to the file. This is the same behavior as kyaml.UpdateFile, but it preserves the original order
341337
// of YAML fields to minimize git diffs.
342-
func updateKustomizeFile(filter kyaml.Filter, path string) error {
338+
func updateKustomizeFile(filter kyaml.Filter, path string) (error, bool) {
343339
// Read the yaml
344340
y, err := kyaml.ReadFile(path)
345341
if err != nil {
346-
return err
342+
return err, false
343+
}
344+
345+
originalData, err := y.String()
346+
if err != nil {
347+
return err, false
347348
}
348349

349350
// Update the yaml
350351
yCpy := y.Copy()
351352
if err := yCpy.PipeE(filter); err != nil {
352-
return err
353+
return err, false
353354
}
354355

355356
// Preserve the original order of fields
356357
if err := order.SyncOrder(y, yCpy); err != nil {
357-
return err
358+
return err, false
359+
}
360+
361+
override, err := yCpy.String()
362+
if err != nil {
363+
return err, false
364+
}
365+
366+
if originalData == override {
367+
log.Debugf("target parameter file and marshaled data are the same, skipping commit.")
368+
return nil, true
358369
}
359370

360371
// Write the yaml
361-
if err := kyaml.WriteFile(yCpy, path); err != nil {
362-
return err
372+
if err := os.WriteFile(path, []byte(override), 0600); err != nil {
373+
return err, false
363374
}
364375

365-
return nil
376+
return nil, false
366377
}
367378

368379
func imagesFilter(images v1alpha1.KustomizeImages) (kyaml.Filter, error) {

pkg/argocd/git_test.go

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,19 +270,49 @@ func Test_updateKustomizeFile(t *testing.T) {
270270
`,
271271
filter: filter,
272272
},
273+
{
274+
name: "no-change",
275+
content: `images:
276+
- name: foo
277+
digest: sha23456
278+
`,
279+
wantContent: "",
280+
filter: filter,
281+
},
282+
{
283+
name: "invalid-path",
284+
content: `images:
285+
- name: foo
286+
digest: sha12345
287+
`,
288+
wantContent: "",
289+
filter: filter,
290+
wantErr: true,
291+
},
273292
}
274293
for _, tt := range tests {
275294
t.Run(tt.name, func(t *testing.T) {
276-
path := makeTmpKustomization(t, []byte(tt.content))
277-
err := updateKustomizeFile(tt.filter, path)
295+
var path string
296+
if tt.wantErr {
297+
path = "/invalid-path"
298+
} else {
299+
path = makeTmpKustomization(t, []byte(tt.content))
300+
}
301+
302+
err, skip := updateKustomizeFile(tt.filter, path)
278303
if tt.wantErr {
279304
assert.Error(t, err)
305+
assert.False(t, skip)
306+
} else if tt.name == "no-change" {
307+
assert.Nil(t, err)
308+
assert.True(t, skip)
280309
} else {
281310
got, err := os.ReadFile(path)
282311
if err != nil {
283312
t.Fatal(err)
284313
}
285314
assert.Equal(t, tt.wantContent, string(got))
315+
assert.False(t, skip)
286316
}
287317
})
288318
}

0 commit comments

Comments
 (0)