Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
## Template Version Alignment
- Go: 1.23 → 1.25 across all templates (go.work, go.mod, Dockerfiles, CI)
- Alpine: latest → 3.19 (explicit version pinning)
- Woodpecker: failure:retry → failure:ignore (invalid syntax fix)
## SDLC Tree Fixes (slackpath-5-full-lifecycle)
Fixed merge failures by correcting lifecycle flow:
1. **Branch Creation**: Added missing create-branch step (planned → ready)
- Bug: Merge command requires feature.Branch field to be set
- Fix: POST /projects/{id}/sdlc/features/{slug}/branch
2. **Artifact Status**: Changed approval to pass for execution artifacts
- Bug: Review/audit/QA need status="passed" not "approved"
- Fix: /artifacts/{type}/approve → /artifacts/{type}/pass
- Added: pass-qa step after wait-qa
3. **Phase Transition Order**: Reordered merge phase transition
- Bug: Merge command checks if phase == "merge" first
- Fix: transition-to-merge BEFORE merge-feature (not after)
## GCS Provisioner Fix
- Replaced deprecated option.WithCredentialsFile with env var approach
- Now uses GOOGLE_APPLICATION_CREDENTIALS for ADC (Application Default Credentials)
- Avoids security risk from deprecated credential options
- Fixed test: Added ComponentTypeGCS to ValidComponentTypes test
## Critical Rules Added
- Version alignment: All template versions must stay in sync
- When updating versions, grep entire templates/ tree
## Files Changed
- 27 template files: Go version + Woodpecker syntax
- 1 tree file: SDLC lifecycle flow corrections
- 1 CLAUDE.md: Version alignment rule
- 1 GCS provisioner: Deprecated API fix
- 1 test file: Added missing component type
Root cause: Skeleton templates lagged behind Go 1.25 release and had
invalid Woodpecker syntax. SDLC tree skipped required branch creation
and used wrong artifact approval endpoints.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
73 lines
1.6 KiB
Go
73 lines
1.6 KiB
Go
package gcs
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestSanitizeForGCP(t *testing.T) {
|
|
tests := []struct {
|
|
input string
|
|
expected string
|
|
}{
|
|
{"my-project", "my-project"},
|
|
{"My_Project", "my-project"},
|
|
{"test@123", "test-123"},
|
|
{"--edge--", "edge"},
|
|
{"UPPERCASE", "uppercase"},
|
|
{"spaces and stuff", "spaces-and-stuff"},
|
|
{"special!@#$%chars", "special-chars"},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.input, func(t *testing.T) {
|
|
result := sanitizeForGCP(tt.input)
|
|
if result != tt.expected {
|
|
t.Errorf("sanitizeForGCP(%q) = %q, want %q", tt.input, result, tt.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBucketNameFor(t *testing.T) {
|
|
p := &Provisioner{}
|
|
tests := []struct {
|
|
projectID string
|
|
expected string
|
|
}{
|
|
{"my-app", "project-my-app-media"},
|
|
{"Test_App", "project-test-app-media"},
|
|
{"app123", "project-app123-media"},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.projectID, func(t *testing.T) {
|
|
result := p.bucketNameFor(tt.projectID)
|
|
if result != tt.expected {
|
|
t.Errorf("bucketNameFor(%q) = %q, want %q", tt.projectID, result, tt.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestServiceAccountEmailFor(t *testing.T) {
|
|
p := &Provisioner{
|
|
gcpProjectID: "threesix-prod",
|
|
}
|
|
tests := []struct {
|
|
projectID string
|
|
expected string
|
|
}{
|
|
{"my-app", "project-my-app-storage@threesix-prod.iam.gserviceaccount.com"},
|
|
{"Test_App", "project-test-app-storage@threesix-prod.iam.gserviceaccount.com"},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.projectID, func(t *testing.T) {
|
|
result := p.serviceAccountEmailFor(tt.projectID)
|
|
if result != tt.expected {
|
|
t.Errorf("serviceAccountEmailFor(%q) = %q, want %q", tt.projectID, result, tt.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|