From 6c305c395ccafe4173dbcc068b181655d35adec1 Mon Sep 17 00:00:00 2001 From: eding Date: Fri, 31 Jul 2026 19:32:45 +0200 Subject: [PATCH] fix: propagate delivery template updates --- internal/bootstrap/bootstrap.go | 24 +++++++----- internal/bootstrap/bootstrap_test.go | 55 +++++++++++++++++++--------- 2 files changed, 52 insertions(+), 27 deletions(-) diff --git a/internal/bootstrap/bootstrap.go b/internal/bootstrap/bootstrap.go index fc4899f..dde298d 100644 --- a/internal/bootstrap/bootstrap.go +++ b/internal/bootstrap/bootstrap.go @@ -125,10 +125,7 @@ func (r Runner) Run() error { if err := renderCiliumConfig(filepath.Join(dir, "base", "cilium-config"), r.Config); err != nil { return err } - if err := copyAndRenderTektonBase(cicdTemplateDir, dir, r.Config); err != nil { - return err - } - if err := renderDeliveryConfig(filepath.Join(dir, "base", "tekton-triggers"), r.Config); err != nil { + if err := copyAndRenderDeliveryBases(cicdTemplateDir, dir, r.Config); err != nil { return err } if err := writeDemocraticCSISecret(filepath.Join(dir, "base", "democratic-csi", "secret.sops.yaml"), r.Config.DemocraticCSI, r.Config.SOPS.AgeKeyPath); err != nil { @@ -256,12 +253,21 @@ func renderDeliveryConfig(dir string, cfg config.Config) error { }) } -func copyAndRenderTektonBase(templateDir, repoDir string, cfg config.Config) error { - tektonDir := filepath.Join(repoDir, "base", "tekton") - if err := copyDir(filepath.Join(templateDir, "base", "tekton"), tektonDir, true); err != nil { - return err +func copyAndRenderDeliveryBases(templateDir, repoDir string, cfg config.Config) error { + bases := []string{"gateway", "tekton", "tekton-triggers"} + for _, base := range bases { + baseDir := filepath.Join(repoDir, "base", base) + if err := copyDir(filepath.Join(templateDir, "base", base), baseDir, true); err != nil { + return err + } } - return renderDeliveryConfig(tektonDir, cfg) + for _, base := range bases { + baseDir := filepath.Join(repoDir, "base", base) + if err := renderDeliveryConfig(baseDir, cfg); err != nil { + return err + } + } + return nil } func writeDemocraticCSISecret(path string, csi config.DemocraticCSIConfig, ageKeyPath string) error { diff --git a/internal/bootstrap/bootstrap_test.go b/internal/bootstrap/bootstrap_test.go index 36f3654..cf9e9bc 100644 --- a/internal/bootstrap/bootstrap_test.go +++ b/internal/bootstrap/bootstrap_test.go @@ -51,34 +51,53 @@ func TestRenderDeliveryConfig(t *testing.T) { } } -func TestCopyAndRenderTektonBaseOverwritesExistingMigrationOutput(t *testing.T) { +func TestCopyAndRenderDeliveryBasesOverwritesExistingMigrationOutput(t *testing.T) { templateDir := t.TempDir() repoDir := t.TempDir() - templateCatalog := filepath.Join(templateDir, "base", "tekton", "catalog-source.yaml") - outputCatalog := filepath.Join(repoDir, "base", "tekton", "catalog-source.yaml") - if err := os.MkdirAll(filepath.Dir(templateCatalog), 0755); err != nil { - t.Fatal(err) + files := []struct { + base, name, template, want string + }{ + {"gateway", "route.yaml", "host: ${WEBHOOK_HOSTNAME}\npath: ${WEBHOOK_PATH}\n", "host: tekton.example.test\npath: /hooks/forgejo\n"}, + {"tekton", "catalog-source.yaml", "url: ${TEKTON_CATALOG_REPO_URL}\nref: ${TEKTON_CATALOG_REPO_REF}\n", "url: https://catalog.example.test/tekton.git\nref: release\n"}, + {"tekton-triggers", "trigger.yaml", "app: ${APP_NAME}\nrepo: ${APP_REPO_URL}\n", "app: demo\nrepo: https://git.example.test/demo.git\n"}, } - if err := os.MkdirAll(filepath.Dir(outputCatalog), 0755); err != nil { - t.Fatal(err) + for _, file := range files { + templatePath := filepath.Join(templateDir, "base", file.base, file.name) + outputPath := filepath.Join(repoDir, "base", file.base, file.name) + if err := os.MkdirAll(filepath.Dir(templatePath), 0755); err != nil { + t.Fatal(err) + } + if err := os.MkdirAll(filepath.Dir(outputPath), 0755); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(templatePath, []byte(file.template), 0644); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(outputPath, []byte("stale: output\n"), 0644); err != nil { + t.Fatal(err) + } } - if err := os.WriteFile(templateCatalog, []byte("url: ${TEKTON_CATALOG_REPO_URL}\nref: ${TEKTON_CATALOG_REPO_REF}\n"), 0644); err != nil { - t.Fatal(err) - } - if err := os.WriteFile(outputCatalog, []byte("stale: catalog\n"), 0644); err != nil { + customGatewayFile := filepath.Join(repoDir, "base", "gateway", "custom.yaml") + if err := os.WriteFile(customGatewayFile, []byte("custom: route\n"), 0644); err != nil { t.Fatal(err) } - cfg := config.Config{Templates: config.TemplateConfig{TektonCatalogRepoURL: "https://catalog.example.test/tekton.git", TektonCatalogRepoRef: "release"}} - if err := copyAndRenderTektonBase(templateDir, repoDir, cfg); err != nil { + cfg := config.Config{ + Delivery: config.DeliveryConfig{AppName: "demo", AppRepoURL: "https://git.example.test/demo.git", WebhookHostname: "tekton.example.test", WebhookPath: "/hooks/forgejo"}, + Templates: config.TemplateConfig{TektonCatalogRepoURL: "https://catalog.example.test/tekton.git", TektonCatalogRepoRef: "release"}, + } + if err := copyAndRenderDeliveryBases(templateDir, repoDir, cfg); err != nil { t.Fatal(err) } - content, err := os.ReadFile(outputCatalog) - if err != nil { - t.Fatal(err) + for _, file := range files { + content, err := os.ReadFile(filepath.Join(repoDir, "base", file.base, file.name)) + if err != nil || string(content) != file.want { + t.Fatalf("%s was not copied and rendered: %q, %v", file.base, content, err) + } } - if string(content) != "url: https://catalog.example.test/tekton.git\nref: release\n" { - t.Fatalf("Tekton catalog source was not copied and rendered: %q", content) + content, err := os.ReadFile(customGatewayFile) + if err != nil || string(content) != "custom: route\n" { + t.Fatalf("custom gateway file was not preserved: %q, %v", content, err) } } -- 2.43.7