Pod - Woodpecker CI #37
No reviewers
Labels
No labels
blocked
bug
duplicate
effort
high
effort
low
effort
medium
effort
minimal
enhancement
help wanted
invalid
pr
feedback
pr
reviewing
question
status
backlog
status
document
status
done
status
implement
status
pending
status
planning
status
reviewing
waiting
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
tepichord/milner!37
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/19-pod-woodpecker-ci"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #19
Automated PR created by forgejo-done adapter.
Worker-attached storage tier for dynamic PVCs, serving Woodpecker today and future workloads (Forgejo, RabbitMQ...). - worker/main.tf: attach milner-worker-1-data.qcow2 (vdc, 100 GiB) and add UserVolumeConfig 'data' -> /var/mnt/data. Vault selector narrowed from '!system_disk' to a CEL size band ('< 40u * GiB') so the two dedicated disks stay mutually exclusive regardless of attach order; data uses the complementary '>= 40u * GiB' band. - storage/ (new root): local-path-provisioner v0.0.37 (official OCI chart) in a privileged local-path-storage namespace, serving two contract-named StorageClasses rooted on the data disk: 'persistent' (default, durable, backed up) and 'ephemeral' (scratch, never backed up). Values + README document the contracts. - worker tests: +data volume/vdc/UserVolumeConfig runs (19 total, cdrom and eject-index updates). storage tests: namespace PSA, pinned OCI chart, and per-class contract assertions (4 runs). - harness/docs: storage/ in fmt + terraform test runners; OPERATIONS.md §8 (contracts, first-time reboot, deploy, smoke test, capacity/backup); AGENTS/ARCHITECTURE/worker-README updated. Ephemerality is a retention contract, not a second disk: both classes share the data volume, differentiated by backing dir and backup coverage.The Vault (20 GiB) and shared-data (100 GiB) qcow2s hold the only data in the cluster that cannot be rebuilt from code, yet they lived in the worker root — whose cleanup.sh destroys them. Move them to a new data/ root that no teardown script runs: - prevent_destroy plus a preservation-marker precondition, because the libvirt provider reads a directory-pool volume by its host-path key and silently drops it from state when the file has moved, which would let a later apply create an empty disk where the data used to be; - cleanup.sh preserves by moving (never copying or deleting) to a sibling preserved/ directory with a sha256 manifest; restore.sh verifies the digests, moves them back, re-imports if state lost track, and refuses to finish unless terraform plan reports no changes; - worker/main.tf keeps permanent removed { lifecycle { destroy = false } } blocks recording the handover and reads the volume names from data/ via terraform_remote_state, so the attached files cannot drift from the files that root protects; - control-plane/ and worker/ cleanup.sh sweep orphaned libvirt domains left by a failed create (drill 4: "Failed to Wait for IP Address" defined a domain in libvirt but never persisted it to state, so no destroy could reach it), scoped to their own VM names. The persistent StorageClass switches to reclaimPolicy Retain and pathPattern {{ .PVC.Namespace }}/{{ .PVC.Name }}/ so a reinstall adopts the existing directory instead of orphaning a UID-named one; ephemeral keeps Delete and UID-derived names deliberately. Verified by the drill-4 teardown and reinstall (OPERATIONS.md §9).