Review: Pipeline CI/CD: Woodpecker + Harbor + ArgoCD (Fase 2)

review-1413-2026-06-11 Review

review needs-refinement

Verdict: NEEDS_REFINEMENT

Template Completeness

  • [x] Type -- Feature
  • [x] Lineage -- Equivalente a html-poster#3
  • [x] Repo -- html-poster-espanol
  • [x] User Story -- present, well-formed
  • [x] Context -- present, references Fase 1 prerequisite
  • [x] File Targets -- present but incomplete (see below)
  • [x] Feature Flag -- None (appropriate for infra work)
  • [x] Acceptance Criteria -- present, 7 items
  • [x] Test Expectations -- present
  • [x] Constraints -- present
  • [x] Checklist -- present
  • [x] Related -- present

Traceability

  • [x] story:demostrar-pipeline label -- "Como practicante de DevOps, quiero que el codigo se construya, pruebe y despliegue automaticamente"
  • [ ] story note MISSING -- story-html-poster-espanol-demostrar-pipeline listed as "pendiente" in project page, no dedicated note exists. [SCOPE] Create story note or accept "pendiente" status as intentional.
  • [x] arch:ci-pipeline label -- CI/CD pipeline component
  • [ ] arch note MISSING -- No arch-ci-pipeline note found in pal-e-docs. [SCOPE] Create architecture note arch-ci-pipeline for the CI/CD pipeline component.
  • [x] Forgejo issue -- ldraney/html-poster-espanol#3, open

File Targets

  • [x] .woodpecker.yaml (new) -- verified: does not exist yet on remote main. Reference pattern exists at landscaping-assistant/.woodpecker.yaml.
  • [x] Dockerfile (new) -- verified: does not exist yet on remote main. Reference pattern exists at landscaping-assistant/Dockerfile.
  • [ ] bin/docker-entrypoint -- ISSUE: Not listed as a file target, but the landscaping-assistant Dockerfile (reference pattern) copies and runs /rails/bin/docker-entrypoint. This file does not exist on remote main. Must be added to file targets. [BODY]
  • [ ] Terraform target is vague -- ISSUE: Says "agregar a var.services en pal-e-services" but should specify the exact file path: pal-e-services/terraform/k3s.tfvars. [BODY]
  • [ ] pal-e-deployments overlay MISSING -- ISSUE: The landscaping-assistant service entry in k3s.tfvars uses source_repo = "ldraney/pal-e-deployments" and source_path = "overlays/landscaping-assistant/prod". An equivalent overlay directory (overlays/html-poster-espanol/prod/) with kustomization.yaml and deployment-patch.yaml is needed but not mentioned in file targets. [BODY]

Repo Placement

Issue is filed on html-poster-espanol but the work spans 3 repos:
  • ldraney/html-poster-espanol -- .woodpecker.yaml, Dockerfile, bin/docker-entrypoint
  • ldraney/pal-e-services -- terraform/k3s.tfvars (add service entry)
  • ldraney/pal-e-deployments -- overlays/html-poster-espanol/prod/ (new kustomize overlay)
The issue only acknowledges html-poster-espanol and vaguely references pal-e-services. pal-e-deployments is not mentioned at all. Multi-repo scope should be explicitly documented. Consider whether separate Forgejo issues are needed per repo or whether a single coordinating issue is acceptable.

Dependencies

  • Board item #1412 (Fase 1: Scaffold Rails) -- DONE, prerequisite satisfied
  • Board item #1414 (Fase 3: Observabilidad) -- depends on this ticket (blocked by #1413)
  • No undocumented blockers found. Harbor registry and Woodpecker are platform-level services already operational (used by landscaping-assistant).

Acceptance Criteria

7 acceptance criteria. Most are verifiable by an agent:
  • "Pipeline verde al hacer push a main" -- requires actual push + pipeline execution, verifiable post-merge
  • "Imagen en Harbor" -- verifiable via Harbor API
  • "ArgoCD sincroniza pod" -- verifiable via kubectl/ArgoCD API
  • "URL publica en vivo via Tailscale funnel" -- verifiable via curl
Missing criterion: bin/docker-entrypoint exists and is executable. Also missing: pal-e-deployments overlay exists and ArgoCD can read it.

Blast Radius

Low blast radius. This is additive infrastructure (new files, new Terraform entry). No existing services are modified. The pattern is proven via landscaping-assistant. Only risk: if the Terraform service map variable shape changes, but this follows the established pattern exactly.

Decomposition Assessment

7 acceptance criteria across 3 repos. This exceeds the 5-minute rule thresholds (>3 file targets across >2 repos, >5 AC). However, the work is highly mechanical -- adapting proven patterns from landscaping-assistant. The three repo touches are tightly coupled (Dockerfile/pipeline produce the image, Terraform onboards the service, deployments overlay configures ArgoCD). Decomposing into sub-tickets may add coordination overhead without benefit.
Recommendation: Accept as a single ticket IF file targets are corrected to enumerate all 3 repos explicitly. The agent can execute sequentially: (1) add files to html-poster-espanol, (2) add entry to pal-e-services k3s.tfvars, (3) add overlay to pal-e-deployments. No decomposition needed if scope is clarified.

Recommendations

  • [BODY] Add bin/docker-entrypoint to File Targets (new file, adapt from landscaping-assistant)
  • [BODY] Change Terraform target from vague "agregar a var.services en pal-e-services" to specific: pal-e-services/terraform/k3s.tfvars -- add html-poster-espanol entry to services map
  • [BODY] Add pal-e-deployments file target: create overlays/html-poster-espanol/prod/ with kustomization.yaml and deployment-patch.yaml (adapt from landscaping-assistant overlay)
  • [BODY] Document all 3 affected repos explicitly in the File Targets section
  • [SCOPE] Create architecture note arch-ci-pipeline for the CI/CD pipeline component
  • [SCOPE] Create story note story-html-poster-espanol-demostrar-pipeline or accept "pendiente" status