Commit Graph

121 Commits

Author SHA1 Message Date
unkinben f720133314 Protect default branches of unprotected active repos
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Why:
- An audit for the new unkin-agent bot (org-wide write) found repos with
  no branch_protection at all, so the agent (or anyone with write) could
  push straight to their default branch.
- The rest of the estate protects default branches; these repos were the gap.

How:
- Add enable_push: false + approval_whitelist_teams: Owners on each active
  repo's default branch, matching the estate's most common convention
  (PR-only; Owners can still open and approve).
- Omit status checks on these repos as none run CI, so a required context
  would permanently block merges.
- Leave the 8 archived repos untouched: they are read-only, nothing can push
  to them, and branch-protection creation on archived repos is rejected.
2026-08-08 22:58:54 +10:00
benvin 4be9899e8e Merge pull request 'Add NetBox Vault secrets engine + provider repositories' (#57) from benvin/netbox-vault-repos into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #57
2026-08-06 22:13:36 +10:00
benvin 04b5f5c3bd Merge pull request 'Rename terraform-ipam -> terraform-infra' (#58) from benvin/rename-terraform-infra into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #58
2026-08-05 19:40:17 +10:00
unkinben f54e63caee Rename terraform-ipam -> terraform-infra
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Scope grew beyond IPAM (devices, provisioning). Renaming the config file renames
the managed repo; the gitea provider archives the old terraform-ipam repo
(archive_on_destroy=true) and creates terraform-infra. terraform-ipam only holds an
auto-init README, so nothing is lost.

Claude-Session: https://claude.ai/code/session_01JUoARVdmhxKQHyyyp1pxeT
2026-08-05 00:51:36 +10:00
unkinben 674e659080 Add vault-plugin-secrets-netbox + terraform-provider-vault-secrets-netbox repositories
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Provisions the two Gitea repos for the NetBox Vault secrets engine and its
paired Terraform provider.

Claude-Session: https://claude.ai/code/session_01JUoARVdmhxKQHyyyp1pxeT
2026-08-05 00:44:33 +10:00
benvin 9e16d7c5de Merge pull request 'Add terraform-ipam repository' (#56) from benvin/ipam-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #56
2026-08-03 00:15:37 +10:00
unkinben 41ac196b89 Add terraform-ipam repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
New repo for YAML-driven NetBox IPAM + Kea DHCP management.

Claude-Session: https://claude.ai/code/session_01JUoARVdmhxKQHyyyp1pxeT
2026-08-03 00:09:05 +10:00
benvin fb6f45faf0 Merge pull request 'Add vault-plugin-secrets-apptoken repository' (#55) from benvin/add-apptoken-plugin-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #55
2026-08-02 21:50:29 +10:00
unkinben 1dfbddab92 Add vault-plugin-secrets-apptoken repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Provision the Gitea repo for a generic app-token Vault/OpenBao secrets
engine that issues short-lived signed JWTs for self-made services,
replacing per-app static bearer Secrets. Mirrors the existing plugin repo
entries (squash-only, main branch protection, PR CI checks).

Claude-Session: https://claude.ai/code/session_01JUoARVdmhxKQHyyyp1pxeT
2026-08-02 21:36:48 +10:00
benvin 52b39bf668 Merge pull request 'Add terraform-provider-kea repository' (#54) from benvin/terraform-provider-kea-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #54
2026-08-02 19:37:00 +10:00
unkinben 5a2529f0c4 Add terraform-provider-kea repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Provisions the Gitea repo for the Terraform provider wrapping the
kea-operator KeaAPI (subnets + client classes).

Claude-Session: https://claude.ai/code/session_01JUoARVdmhxKQHyyyp1pxeT
2026-08-02 19:33:07 +10:00
benvin 3b229deb1b Merge pull request 'Add kea-operator Gitea repository' (#53) from benvin/kea-operator-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #53
2026-08-02 17:22:40 +10:00
unkinben 8fc5105d10 Add kea-operator Gitea repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Provision the repo for the new Kea DHCP Kubernetes operator that replaces
the ISC dhcpd PXE-boot VM.

- add config/git.unkin.net/unkin/repository/kea-operator.yaml
Claude-Session: https://claude.ai/code/session_01JUoARVdmhxKQHyyyp1pxeT
2026-08-02 16:56:38 +10:00
benvin c920451844 Merge pull request 'argocd-apps: require the vector-test PR check' (#52) from benvin/argocd-vector-test-required into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #52
2026-07-30 21:10:33 +10:00
unkinben 493c33483b argocd-apps: require the vector-test PR check
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Claude-Session: https://claude.ai/code/session_015ur3i7D2azsMAWTSVABApv
2026-07-30 21:09:39 +10:00
benvin 58dafb7ac2 Merge pull request 'Add bootapi-images repository' (#51) from benvin/bootapi-images-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #51
2026-07-30 21:03:18 +10:00
unkinben 68584acffb Add bootapi-images repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
bootapi-images builds the AlmaLinux node rootfs tarballs that bootapi's
image-based provisioning (liveimg) unpacks, and on a v* tag publishes
almalinux9-node-<ver>.tar.zst to the artifactapi rootfs-images local repo. Split
out of bootapi-templates so that repo stays templates-only.

Modeled on the bootapi-templates entry: public, squash, delete-branch-after-merge,
main protection requiring the pre-commit + lint Woodpecker checks and benvin
approval.

Claude-Session: https://claude.ai/code/session_015ur3i7D2azsMAWTSVABApv
2026-07-30 20:55:45 +10:00
benvin bd66d55c99 Merge pull request 'Add bootapi-templates repository' (#50) from benvin/bootapi-templates-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #50
2026-07-28 23:08:51 +10:00
unkinben fe662001c5 Add bootapi-templates repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
bootapi-templates holds the live kickstart/iPXE templates and the distro catalog
that bootapi pulls via git-sync (every ~3m, like argocd), so template/OS changes
ship without rebuilding bootapi. Its CI validates that every template parses and
renders for every catalog distro (via 'bootapi validate') plus shellcheck on the
%post snippets.

Modeled on the bootapi repo entry: public, squash, delete-branch-after-merge,
main protection requiring the pre-commit + validate Woodpecker checks and benvin
approval.

Claude-Session: https://claude.ai/code/session_015ur3i7D2azsMAWTSVABApv
2026-07-28 22:35:46 +10:00
benvin c0fc234a1c Merge pull request 'Add bootapi repository' (#49) from benvin/bootapi-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #49
2026-07-28 18:41:49 +10:00
unkinben d53b6841e1 Add bootapi repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
bootapi is a Go service replacing Cobbler's PXE/kickstart side: it renders
kickstart files and iPXE boot scripts from NetBox data and serves them to
PXE-booting hosts. The ENC half already moved to encapi; bootapi covers the
provisioning/boot half.

Adds config/git.unkin.net/unkin/repository/bootapi.yaml modeled on encapi:
public repo, squash merges, delete-branch-after-merge, main branch protection
requiring the pre-commit/test/build Woodpecker checks and benvin approval.

Claude-Session: https://claude.ai/code/session_015ur3i7D2azsMAWTSVABApv
2026-07-28 16:58:21 +10:00
benvin 38849ba79f Merge pull request 'vault provider: skip child token creation in CI' (#48) from benvin/vault-skip-child-token into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #48
2026-07-27 22:03:28 +10:00
unkinben 0385d2a1ef vault provider: skip child token creation in CI
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Claude-Session: https://claude.ai/code/session_015ur3i7D2azsMAWTSVABApv
2026-07-27 21:52:24 +10:00
benvin c068f56eca Merge pull request 'Add logarchiver repository' (#47) from benvin/logarchiver-repo into main
ci/woodpecker/push/apply Pipeline failed
Reviewed-on: #47
2026-07-27 21:48:24 +10:00
benvin 99b13d81bc Merge pull request 'user: add gitea-vault-admin site-admin bot with one-time Vault KV seeding' (#46) from benvin/gitea-vault-admin into main
ci/woodpecker/push/apply Pipeline failed
Reviewed-on: #46
2026-07-27 21:47:31 +10:00
benvin 9cee6024d3 Add logarchiver repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Registers the logarchiver Gitea repo: a k8s Go service that archives
raw logs from NATS JetStream to S3 as zstd-compressed, GPG-encrypted,
indexed objects, plus a CLI to search and retrieve them. It replaces the
Vector archiver leg of the centralized logging stack (argocd-apps #296)
with zstd compression, OpenPGP encryption keyed from the Vault GPG
secrets engine, and a ClickHouse-backed searchable index.

- Add config/git.unkin.net/unkin/repository/logarchiver.yaml modeled on
  the existing Go-service repos (encapi, cephrgw-operator): public repo,
  main default branch, squash merges, branch protection requiring the
  woodpecker pre-commit/test/build PR checks with benvin approval.

Claude-Session: https://claude.ai/code/session_015ur3i7D2azsMAWTSVABApv
2026-07-27 21:36:15 +10:00
unkinben bd7bef9f99 user: add gitea-vault-admin site-admin bot and one-time Vault KV seeding
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Why: the vault-plugin-secrets-gitea engine needs a purpose-built Gitea
site-admin credential to mint and delete per-user tokens. Provision that
account and its Vault seed here so the credential is generated once and never
exposed. Ben asked that the password be written to Vault exactly once and
never updated afterwards.

Change:
- Add config/git.unkin.net/user/gitea-vault-admin.yaml: a local site-admin bot
  (admin: true, limited visibility, no org/repo creation).
- Extend the user module with an optional vault_seed_path/vault_seed_mount: when
  set, write the account's generated password to Vault KV as admin_username and
  admin_password via vault_kv_secret_v2, with lifecycle ignore_changes on
  data_json so the write is create-only and never churns (random_password
  already never regenerates). This keeps the seed stable and prevents a re-apply
  from overwriting a password later rotated out-of-band by rotate-root.
- Add the hashicorp/vault provider (module plus root generate block); it reads
  VAULT_ADDR and VAULT_TOKEN already exported by the Makefile k8s login.

Claude-Session: https://claude.ai/code/session_015ur3i7D2azsMAWTSVABApv
2026-07-27 19:26:24 +10:00
benvin 96092cf7a1 Merge pull request 'Manage Gitea users; add teabot personality bot accounts' (#45) from benvin/teabot-users into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #45
2026-07-27 17:33:25 +10:00
unkinben fd82876f5f Manage Gitea users; add teabot personality bot accounts
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Add a data-driven 'user' config kind so Gitea accounts are declared as
config/git.unkin.net/user/<name>.yaml, mirroring the existing repository
and team kinds. Wire the yaml into a new modules/user submodule that
creates a gitea_user (provider go-gitea/gitea 0.7.0, already pinned).

The provider's user resource requires a password; generate a per-user
random_password so nothing sensitive is hardcoded and only a placeholder
lives in state (tokens come later from vault-plugin-secrets-gitea).

Provision teabot's implementer and reviewer personality accounts with a
conservative posture: not site admins, no org creation, no repo creation,
limited profile visibility.

Claude-Session: https://claude.ai/code/session_015ur3i7D2azsMAWTSVABApv
2026-07-27 17:22:19 +10:00
benvin ee08fd5585 Merge pull request 'Add gitea vault engine + provider repositories' (#44) from benvin/gitea-vault-repos into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #44
2026-07-27 00:40:20 +10:00
unkinben 4c5fe742f0 Add gitea vault engine + provider repositories
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Create the Gitea repositories for the new vault-plugin-secrets-gitea
secrets engine and its companion terraform-provider-giteavaultsecret,
mirroring the rancher pair's settings.

- add config/git.unkin.net/unkin/repository/vault-plugin-secrets-gitea.yaml
- add config/git.unkin.net/unkin/repository/terraform-provider-giteavaultsecret.yaml

Claude-Session: https://claude.ai/code/session_015ur3i7D2azsMAWTSVABApv
2026-07-27 00:34:28 +10:00
benvin aa9b2eac80 Merge pull request 'Add teabot repository (file)' (#43) from benvin/teabot-repo-add into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #43
2026-07-26 23:22:20 +10:00
unkinben 9dfddcf4d3 Add teabot repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
teabot is a Go daemon that watches Gitea repos and dispatches one-shot
Claude Code sessions in Docker to work issues and review PRs.

Claude-Session: https://claude.ai/code/session_015ur3i7D2azsMAWTSVABApv
2026-07-26 23:19:44 +10:00
benvin 3f39229c29 Merge pull request 'Add vault-tools repository' (#41) from benvin/vault-tools-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #41
2026-07-26 23:19:36 +10:00
unkinben 42187f86d5 Add vault-tools repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Claude-Session: https://claude.ai/code/session_015ur3i7D2azsMAWTSVABApv
2026-07-26 23:18:08 +10:00
benvin 570b7a6cf9 Merge pull request 'ci: fetch vault from artifactapi instead of dnf install' (#39) from benvin/ci-vault-install-speedup into main
ci/woodpecker/push/apply Pipeline was successful
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Reviewed-on: #39
2026-07-25 09:48:12 +10:00
benvin 16eb029c2e Merge pull request 'Add encapic repository' (#40) from benvin/encapic-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #40
2026-07-25 09:47:03 +10:00
unkinben 3c53cf2722 Add encapic repository
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/plan Pipeline was successful
2026-07-25 09:45:26 +10:00
unkinben c2805d9196 Escape VAULT_VERSION for woodpecker YAML substitution ($$ -> shell)
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-07-25 00:32:19 +10:00
benvin db4c5ad4fc ci: fetch vault from artifactapi instead of dnf install
ci/woodpecker/pr/plan Pipeline failed
ci/woodpecker/pr/pre-commit Pipeline was successful
CI installed vault by shelling out to `dnf install vault -y`, which reads
metadata for every enabled repo (appstream/baseos/crb/epel/ha) and downloads
the 169MB vendored vault RPM from the unkin repo on every pipeline run
(~39s per plan/apply job).

- Replace the dnf install with a pinned curl of the upstream vault zip from
  the artifactapi hashicorp-releases remote proxy, extracted with python3 to
  /usr/local/bin/vault.
- Pin the version via a VAULT_VERSION env var (1.20.0).
2026-07-25 00:27:20 +10:00
benvin 36451b08ad Merge pull request 'Add pdbmux repository' (#38) from benvin/pdbmux-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #38
2026-07-24 23:22:34 +10:00
benvin c2f505ae84 Add pdbmux repository
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/plan Pipeline was successful
2026-07-24 23:20:49 +10:00
benvin 645f693b48 Merge pull request 'Add terragrunt-enc repository' (#37) from benvin/terragrunt-enc-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #37
2026-07-24 23:07:31 +10:00
unkinben 4c9f3146ff Add terragrunt-enc repository
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/plan Pipeline was successful
terragrunt-enc will be the single source of truth for encapi ENC data
(statuses, roles, node classifications), managed via Terraform/Terragrunt,
superseding Cobbler classification for Puppet.

- Add config/git.unkin.net/unkin/repository/terragrunt-enc.yaml (public,
  default_branch main, delete-branch-after-merge, squash merges).
- Protect main: block direct pushes, require the two Woodpecker PR status
  checks (pre-commit, plan), and whitelist benvin for approvals.
2026-07-24 23:04:03 +10:00
benvin 25d5f1a49f Merge pull request 'Add terraform-provider-tomswallapi repository' (#36) from benvin/add-tf-provider-tomswallapi into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #36
2026-07-19 23:53:08 +10:00
benvin b3b9caf457 Add terraform-provider-tomswallapi repository
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/plan Pipeline was successful
2026-07-19 22:18:44 +10:00
benvin 1198063e0b Merge pull request 'Add tomswallapi repository' (#35) from benvin/add-tomswallapi-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #35
2026-07-19 21:14:35 +10:00
benvin fc77e2b150 Add tomswallapi repository
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/plan Pipeline was successful
2026-07-19 18:35:04 +10:00
benvin d9a4396674 Merge pull request 'Add cephrgw-operator repository' (#34) from benvin/add-cephrgw-operator-repo into main
ci/woodpecker/push/apply Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/plan Pipeline was successful
Reviewed-on: #34
2026-07-18 08:27:40 +10:00
benvin bb7c55af9b Add cephrgw-operator repository
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/plan Pipeline was successful
The cephrgw-operator provisions Ceph RGW (S3) buckets and access keys from
Kubernetes CRDs via the Ceph manager dashboard API, and needs a Gitea repo
to host its code and run Woodpecker CI.

- Add config/git.unkin.net/unkin/repository/cephrgw-operator.yaml with the
  standard public-repo settings (squash merge, delete branch on merge) and
  main branch protection requiring the pre-commit/test/build PR checks.
2026-07-18 00:08:06 +10:00