Skip to content

Commit 7ea4308

Browse files
committed
fix: always overwrite workflow files on init so upgrades take effect
The scaffolder used writeIfNotExists for CI workflow files, which meant re-running `apx init canonical` on an existing repo would silently keep stale workflows (e.g. the old commit-based on-merge instead of the new Docker build/push/attest flow). Workflow files are APX-managed templates, not user-customized files, so they should always be overwritten. Removes the writeIfNotExists helper entirely — apx.yaml is the only file that still uses a skip-if-exists guard (it contains user config).
1 parent f4d4297 commit 7ea4308

2 files changed

Lines changed: 8 additions & 16 deletions

File tree

internal/schema/app.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,9 @@ func (s *AppScaffolder) Generate(baseDir string) error {
8080
if err := os.MkdirAll(workflowDir, 0755); err != nil {
8181
return fmt.Errorf("failed to create .github/workflows: %w", err)
8282
}
83+
// Always overwrite so upgrades pick up new templates
8384
releasePath := filepath.Join(workflowDir, "apx-release.yml")
84-
if err := writeIfNotExists(releasePath, templates.GenerateAppRelease(s.org, "apis")); err != nil {
85+
if err := os.WriteFile(releasePath, []byte(templates.GenerateAppRelease(s.org, "apis")), 0644); err != nil {
8586
return fmt.Errorf("failed to write apx-release.yml: %w", err)
8687
}
8788

internal/schema/canonical.go

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,13 @@ func (s *CanonicalScaffolder) Generate(targetDir string) error {
7777

7878
// Generate catalog/.gitignore so generated catalog data is not committed
7979
catalogGitignorePath := filepath.Join(targetDir, "catalog", ".gitignore")
80-
if err := writeIfNotExists(catalogGitignorePath, "catalog.yaml\n"); err != nil {
80+
if err := os.WriteFile(catalogGitignorePath, []byte("catalog.yaml\n"), 0644); err != nil {
8181
return fmt.Errorf("failed to write catalog/.gitignore: %w", err)
8282
}
8383

8484
// Generate catalog/Dockerfile for CI-based container builds
8585
dockerfilePath := filepath.Join(targetDir, "catalog", "Dockerfile")
86-
if err := writeIfNotExists(dockerfilePath, templates.GenerateCatalogDockerfile(s.org)); err != nil {
86+
if err := os.WriteFile(dockerfilePath, []byte(templates.GenerateCatalogDockerfile(s.org)), 0644); err != nil {
8787
return fmt.Errorf("failed to write catalog/Dockerfile: %w", err)
8888
}
8989

@@ -117,26 +117,17 @@ func (s *CanonicalScaffolder) Generate(targetDir string) error {
117117
}
118118
}
119119

120-
// Generate CI workflow
120+
// Generate CI workflow — always overwrite so upgrades pick up new templates
121121
ciPath := filepath.Join(targetDir, ".github", "workflows", "ci.yml")
122-
if err := writeIfNotExists(ciPath, templates.GenerateCanonicalCI()); err != nil {
122+
if err := os.WriteFile(ciPath, []byte(templates.GenerateCanonicalCI()), 0644); err != nil {
123123
return fmt.Errorf("failed to write ci.yml: %w", err)
124124
}
125125

126-
// Generate on-merge workflow
126+
// Generate on-merge workflow — always overwrite so upgrades pick up new templates
127127
onMergePath := filepath.Join(targetDir, ".github", "workflows", "on-merge.yml")
128-
if err := writeIfNotExists(onMergePath, templates.GenerateCanonicalOnMerge(s.org)); err != nil {
128+
if err := os.WriteFile(onMergePath, []byte(templates.GenerateCanonicalOnMerge(s.org)), 0644); err != nil {
129129
return fmt.Errorf("failed to write on-merge.yml: %w", err)
130130
}
131131

132132
return nil
133133
}
134-
135-
// writeIfNotExists writes content to path only if the file does not
136-
// already exist, making scaffolding idempotent.
137-
func writeIfNotExists(path, content string) error {
138-
if _, err := os.Stat(path); err == nil {
139-
return nil // already exists — skip
140-
}
141-
return os.WriteFile(path, []byte(content), 0644)
142-
}

0 commit comments

Comments
 (0)