Review: Set up Woodpecker CI pipeline for westside-basketball
Verdict: NEEDS_REFINEMENT
Board item #1603: Set up Woodpecker CI pipeline for westside-basketball (5pts, sprint:3)
Forgejo issue: ldraney/westside-basketball#53
Template Completeness
- [x] Type — Feature
- [x] Lineage — discovered during sprint:2 validation
- [x] Repo — ldraney/westside-basketball
- [x] User Story — present and well-formed
- [x] Context — comprehensive, explains the gap
- [x] File Targets — present with create/modify/don't-touch sections
- [x] Feature Flag — none (correct for infra work)
- [x] Acceptance Criteria — 4 criteria, all measurable
- [x] Test Expectations — integration test and kubectl verification
- [x] Constraints — references paldocs pattern, Harbor registry, base-images
- [x] Checklist — standard PR checklist present
- [x] Related — project page and blocking PRs referenced
Traceability
- [x] story:WS-S1 label — "As superadmin, I want to deploy platform changes via IaC so that infrastructure is reproducible and auditable"
- [x] story note verified — found in project-westside-basketball user-stories section under Superadmin (Lucas)
- [x] arch:ci-cd label — CI/CD pipeline component
- [ ] arch note MISSING — [SCOPE] search for "arch-ci-cd" returned no results. Create architecture note
arch-ci-cddocumenting the Woodpecker CI/CD pattern across repos. - [x] Forgejo issue — ldraney/westside-basketball#53, state: open
File Targets
- [x]
.woodpecker.yaml(create) — verified: file does not exist yet in westside-basketball. Correct target. - [x]
~/pal-e-deployments/overlays/westside-ror/prod/kustomization.yaml(modify) — verified: file exists, currently usesruby:3.4-slimas image with no Harbor reference. Confirmed this is the right file to switch to Harbor image. - [ ]
~/pal-e-deployments/overlays/westside-ror/prod/deployment-patch.yaml— ISSUE: not mentioned in file targets but MUST be modified. Currently hashostPath: /home/ldraney/westside-rorvolume mount (line 58) and inlineapt-get install && bundle installin the command (line 14). When switching to a Harbor-built image, this hostPath mount becomes invalid and the inline build command is redundant — the Dockerfile handles all of this. The agent needs to know this file needs changes too. - [ ]
~/pal-e-deployments/overlays/westside-ror/prod/kustomization.yamlline 32-33 — ISSUE: the kustomization explicitly removesimagePullSecretsbecause it uses a public ruby image. When switching to Harbor, imagePullSecrets must be KEPT (Harbor requires auth). This patch removal must be reversed, and aharbor-creds.enc.yamlresource may be needed (thewestsidekingsandqueensoverlay already has one as reference).
Repo Placement
Issue is filed on westside-basketball (correct for
.woodpecker.yaml), but the kustomization changes are in pal-e-deployments. This cross-repo pattern is consistent with how other pipelines work (paldocs pipeline updates pal-e-deployments too). The issue correctly identifies both repos. However, the agent will need to make two PRs (one per repo) or the pal-e-deployments changes need a separate issue. The issue should clarify whether this is a single-PR or two-PR workflow.Dependencies
- No explicit
depends:label on board item — correct, this is foundational infrastructure. - Other sprint:3 items (email #1598, domain #1607, email #1580) do NOT depend on this CI pipeline — they can proceed independently.
- However, sprint:2 merged PRs #50 and #51 are undeployed BECAUSE this pipeline doesn't exist. This ticket unblocks their deployment.
- Woodpecker CI secrets (
forgejo_token,harbor_username,harbor_password) must exist in Woodpecker for the westside-basketball repo. The issue does not mention creating these secrets. Paldocs and pal-e-docs already have them — the agent needs to know whether these are global secrets (shared) or per-repo secrets that need creation.
Acceptance Criteria
- [x] AC1 "pipeline triggers on push to main and pull_request" — verifiable via Woodpecker UI, well-defined
- [x] AC2 "Pipeline runs lint, test, build-and-push, update-kustomize-tag" — verifiable BUT the test step must use
rails test(Minitest), NOTrspec. The paldocs reference uses rspec. Also, westside-basketball has nodb/ci_schema.sql— the test step needsrails db:schema:loadinstead ofpsql -f db/ci_schema.sql. - [x] AC3 "ArgoCD auto-syncs new image" — verifiable via ArgoCD UI / kubectl
- [x] AC4 "Pod runs Harbor-built image" — verifiable via
kubectl describe pod
All criteria are agent-verifiable. The test expectations are reasonable (integration test via commit push, kubectl verification).
Blast Radius
- The
westsidekingsandqueensoverlay in pal-e-deployments is "being replaced by westside-ror" per its README. It already has Harbor creds and a different deployment pattern. Changes to westside-ror overlay do not affect westsidekingsandqueens. - The
update-kustomize-tag.shscript is shared across all pipelines (fetched frompal-e-platform/scripts/). It uses theOVERLAYenv var to target the right overlay directory. No blast radius concern here — standard pattern. - No other repos reference westside-basketball's CI config.
- The Dockerfile currently uses
ruby:3.4.8-slimdirectly. The constraints say "Base image should come from base-images repo." The base-images repo has a Dockerfile at~/base-images/Dockerfileusingruby:3.4.9-slim. If the ticket means the CI build step should useharbor.tail5b443a.ts.net/library/ruby-rails-build:latest(like paldocs CI), that's fine. But if it also means the production Dockerfile should be rebased onto the Harbor base image, that's additional scope not captured in file targets.
Decomposition Assessment
2 file targets across 2 repos, 4 acceptance criteria. Estimated agent work: ~5 minutes. Fits within single agent pass. No decomposition needed.
However, the missing file target (
deployment-patch.yaml) and the imagePullSecrets reversal add complexity. With those additions it remains within a single pass but is at the upper bound.Recommendations
[BODY]Adddeployment-patch.yamlto File Targets (modify section): "Remove hostPath volume mount and inline build command — the Harbor image handles all of this via the Dockerfile. Remove the volume and volumeMounts entries."[BODY]Add note to File Targets (modify section) forkustomization.yaml: "Reverse the imagePullSecrets removal patch — Harbor requires auth. Addharbor-creds.enc.yamlresource if not already present (see westsidekingsandqueens overlay as reference)."[BODY]Add note to Constraints or Context: "westside-basketball uses Minitest (test/ directory), not RSpec. CI test step should userails testandrails db:schema:load, notrspecandci_schema.sql."[BODY]Add to Context or Dependencies: "Verify Woodpecker CI secrets (forgejo_token, harbor_username, harbor_password) exist as global secrets or create per-repo secrets for westside-basketball."[SCOPE]Create architecture notearch-ci-cddocumenting the Woodpecker CI/CD pattern (pipeline stages, shared scripts, Harbor registry, kustomize tag updates).