122 Commits

Author SHA1 Message Date
benvin 1b2e62701d Merge pull request 'Drop ci/woodpecker/pr/test status check from container-base and container-gobuilder' (#104) from container-protection-test-context into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #104
2026-09-27 20:22:45 +10:00
unkin-agent 707e01efcd Drop ci/woodpecker/pr/test status check from container-base and container-gobuilder
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Neither repo has a test workflow, so the required ci/woodpecker/pr/test
context never reports and every PR stays permanently unmergeable.

- Remove ci/woodpecker/pr/test from status_check_contexts on both repos
- Keep ci/woodpecker/pr/build and ci/woodpecker/pr/pre-commit
2026-09-27 20:14:06 +10:00
benvin 9e94938031 Merge pull request 'Drop obsolete vector-test status check from argocd-apps' (#103) from benvin/argocd-apps-drop-vector-test into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #103
2026-09-27 18:27:48 +10:00
unkin-agent 922b256af7 Retrigger CI
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-09-27 18:11:18 +10:00
unkin-agent 1584c2169d Drop obsolete vector-test status check from argocd-apps
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline failed
The vector-test pipeline is being removed from argocd-apps, so the
context will never report again and would block every merge.
2026-09-27 18:08:36 +10:00
benvin f6536db7bd Merge pull request 'Add container-base and container-gobuilder image repos' (#102) from benvin/container-image-repos into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #102
2026-09-27 17:29:30 +10:00
unkin-agent 14aa732e41 Rename repos to container-base and container-gobuilder
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-09-27 17:28:03 +10:00
unkin-agent 2827e749dd Rename almalinux9-base repo to almalinux9
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-09-27 17:24:00 +10:00
unkin-agent 19bb5da00c Add almalinux9-base and gobuilder repos
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Split the first two container images out of the packer-images monorepo into
one repo per image.
2026-09-27 17:14:12 +10:00
benvin 41168df5fd Merge pull request 'Declare go-cache-plugin build repo' (#101) from benvin/go-cache-plugin-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #101
2026-09-26 21:04:25 +10:00
unkin-agent 98f80d58f8 Declare go-cache-plugin build repo
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Adds the Gitea repo that builds and releases the tailscale go-cache-plugin
GOCACHEPROG binary for the estate.
2026-09-26 19:06:06 +10:00
benvin f4e7dbd1ff Merge pull request 'Protect main on the jellyfin-plugin-sso fork' (#100) from benvin/jellyfin-plugin-sso-protection into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #100
2026-09-19 22:29:11 +10:00
unkin-agent ac5604ec92 Protect main on the jellyfin-plugin-sso fork
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Require the PR pipeline and Owners merge approval on main, keeping owner push for upstream syncs.
2026-09-19 22:28:09 +10:00
benvin c26a432769 Merge pull request 'Fork the Jellyfin SSO plugin mirror into unkin' (#99) from benvin/fork-jellyfin-plugin-sso into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #99
2026-09-19 17:17:31 +10:00
unkin-agent 289ebc84d6 Fork the Jellyfin SSO plugin mirror into unkin
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Add config/git.unkin.net/unkin/repository/jellyfin-plugin-sso.yaml forking mirrors/jellyfin-plugin-sso.
2026-09-19 17:11:06 +10:00
benvin 25ef56fc30 Merge pull request 'Use plain git migration service for the SSO plugin mirror' (#98) from benvin/mirror-sso-plain-git into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #98
2026-09-19 17:03:48 +10:00
unkin-agent 112f7c8042 Use plain git migration service for the SSO plugin mirror
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-09-19 16:47:41 +10:00
benvin b126fffe17 Merge pull request 'Mirror the upstream Jellyfin SSO plugin' (#97) from benvin/mirror-jellyfin-plugin-sso into main
ci/woodpecker/push/apply Pipeline failed
Reviewed-on: #97
2026-09-19 16:36:09 +10:00
unkin-agent 8207d8cc8a Mirror the upstream Jellyfin SSO plugin
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Add a pull mirror of github.com/9p4/jellyfin-plugin-sso into the mirrors
organisation, syncing every 8h with issues, pull requests and release
migration disabled.
2026-09-19 16:18:55 +10:00
benvin 55151a8796 Merge pull request 'Add declarative fork support to repository config' (#96) from benvin/gitea-fork-from into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #96
2026-09-19 16:13:06 +10:00
unkin-agent 8bc04e2c7d Reject fork_from alongside unsupported repository keys
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
gitea_fork can only express the source repo and owning organisation, so any
other setting in a fork's yaml is silently dropped.

- validate fork_from entries carry no other repository attributes, naming the
  offending config key and attributes
- note that gitea_fork has no archive_on_destroy
2026-09-19 16:03:44 +10:00
benvin 2cb056cbac Merge pull request 'Add Gitea pull-mirror support and a mirrors organisation' (#95) from benvin/gitea-mirror-repos into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #95
2026-09-19 15:58:01 +10:00
unkin-agent 9ab540719e Add fork_from to repository config
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Express a fork as an optional fork_from key on the repository yaml, so a
forked repo is declared the same way as any other repo.

- add fork_from "<owner>/<repo>" to the repository module and object type
- create gitea_fork instead of gitea_repository when fork_from is set
- validate the source repo name matches the config file name, since a fork
  inherits the source name
- move gitea_repository.this to index 0 for the count refactor
- index existing repository import targets to match
2026-09-19 15:55:12 +10:00
unkin-agent 66823a939a Add pull-mirror support and a mirrors organisation
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Expose the non-secret gitea_repository mirror/migration attributes through
the repository module and add the mirrors org for public upstream mirrors.
2026-09-19 15:47:32 +10:00
benvin 26e7723251 Merge pull request 'Add sshsignhost repository and scope certmanager to X.509' (#94) from benvin/puppet-vault-signers-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #94
2026-09-19 10:25:37 +10:00
unkin-agent 1a43ed6a47 repository: add sshsignhost and scope certmanager to X.509
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Puppet calls /usr/local/bin/certmanager and /usr/local/bin/sshsignhost at
hardcoded paths, so each tool needs a repo named for its binary.
2026-09-19 10:21:14 +10:00
unkin-agent de2b8acf8a Add puppet-vault-signers repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Host the Go rewrites of the certmanager and sshsignhost Vault signing
helpers.

- Add config/git.unkin.net/unkin/repository/puppet-vault-signers.yaml
- Protect main with Owners-only merge and the standard woodpecker checks
2026-09-14 23:30:11 +10:00
benvin 93b47c0941 Merge pull request 'Add puppet-catalog-tools repository' (#93) from benvin/puppet-catalog-tools-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #93
2026-09-12 15:35:20 +10:00
unkin-agent 73cc875373 Add puppet-catalog-tools repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-09-12 15:32:55 +10:00
benvin 4424abad17 Merge pull request 'Make arti-pack repo description vendor-neutral' (#92) from benvin/arti-pack-neutral-description into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #92
2026-09-09 23:12:29 +10:00
unkin-agent 96ca0630d5 Make arti-pack repo description vendor-neutral
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-09-09 22:39:34 +10:00
benvin deaa0f003d Merge pull request 'Add arti-pack repository' (#91) from benvin/arti-pack-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #91
2026-09-08 22:59:29 +10:00
unkin-agent d0c1f7f6bd Add arti-pack repository
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/plan Pipeline was successful
2026-09-07 23:49:12 +10:00
benvin 9230ece23a Merge pull request 'Add vimpack repository' (#90) from benvin/vimpack-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #90
2026-09-05 13:06:55 +10:00
unkin-agent 62b8ab4e9c Add vimpack repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-09-05 11:13:50 +10:00
benvin 7b699c36b7 Merge pull request 'Add golib repository' (#89) from benvin/golib-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #89
2026-08-31 06:58:05 +10:00
unkin-agent c731f89dd4 Add golib repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Shared Go library for estate services, starting with a postgres pool and
migrations module.
2026-08-31 04:15:59 +10:00
benvin 2e9a5fb8d4 Merge pull request 'Add repospawner machine user scoped to terraform-git' (#88) from benvin/repospawner-user into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #88
2026-08-30 09:34:47 +10:00
benvin cb61d385e2 Merge pull request 'Add repospawner repository' (#87) from benvin/repospawner-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #87
2026-08-30 09:28:12 +10:00
unkin-agent dd26c861fc repospawner: mark the account restricted
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Defense in depth for the repo-creation bot: a restricted Gitea account can
only see repositories and organisations it is explicitly added to, so a
leaked repospawner token cannot enumerate or read the rest of the estate.
The repospawner team grant on terraform-git already covers everything the
bot does, so nothing it needs is lost.
2026-08-30 00:55:01 +10:00
unkin-agent 4b30ba0cfd Add repospawner machine user scoped to terraform-git
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
repospawner opens repo-creation PRs against terraform-git and needs no other
access, so give it its own identity and a per-repo team instead of adding it to
the org-wide agents team.

- add config/git.unkin.net/user/repospawner.yaml (limited visibility, not admin,
  no org/repo creation), mirroring the unkin-agent bot posture
- add config/git.unkin.net/unkin/team/repospawner.yaml granting write on the
  terraform-git repository only (include_all_repositories false)
2026-08-30 00:48:10 +10:00
unkin-agent 0e9f2a1279 Add repospawner repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-08-30 00:40:44 +10:00
benvin a38a792f69 Merge pull request 'Add mediamark repository' (#86) from benvin/mediamark-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #86
2026-08-29 21:13:42 +10:00
unkin-agent cd006fdff6 mediamark: make repo public and require woodpecker PR checks
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-08-29 21:08:48 +10:00
unkin-agent ae41bf6cdc repository: add mediamark repo
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-08-29 20:57:05 +10:00
benvin 98169c7cf8 Merge pull request 'Archive terraform-nomad repository' (#85) from benvin/archive-nomad into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #85
2026-08-23 22:36:29 +10:00
unkin-agent 960e88cd7e Archive terraform-nomad repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
The terraform-nomad project is being decommissioned; mark it archived
in Gitea so it becomes read-only, consistent with other retired repos
in this config (e.g. rpmbuild-template).
2026-08-23 22:34:03 +10:00
benvin 9ac6edd0a1 Merge pull request 'Run plan without acquiring the Consul state lock' (#84) from benvin/lockfree-plan into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #84
2026-08-23 22:31:30 +10:00
unkin-agent f83bdff5e6 Run plan without acquiring the Consul state lock
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/plan Pipeline was successful
PR plan pipelines were failing with "Error acquiring the state lock"
when they collided with a concurrent apply (or another plan) holding
the lock on the same Consul-backed state.

- plan: pass -lock=false to terragrunt plan; apply/apply-if-changes keep locking
2026-08-23 22:21:11 +10:00
benvin e4a65e18ab Merge pull request 'Make clickhouse-tools and logviewer public and require CI status checks' (#83) from benvin/repo-defaults into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #83
2026-08-23 16:56:12 +10:00
unkin-agent 54fb6154af Require all three woodpecker PR contexts (build/test/pre-commit)
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-08-23 16:43:18 +10:00
unkin-agent 3cbfac7017 Make clickhouse-tools and logviewer public and require CI status checks
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Both repos do not need to be private, and their main branches should
only accept PRs whose Woodpecker pipeline passed.

- private: false for clickhouse-tools and logviewer
- require ci/woodpecker/pr/build status check on main for both
2026-08-23 16:33:47 +10:00
benvin 58c67e69be Merge pull request 'Add clickhouse-tools repository' (#81) from benvin/clickhouse-tools-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #81
2026-08-23 12:40:12 +10:00
benvin 43a43b5f85 Merge pull request 'Add logviewer repository' (#82) from benvin/logviewer-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #82
2026-08-23 12:39:40 +10:00
unkin-agent d4018f6b7e Add logviewer repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-08-23 12:37:18 +10:00
unkin-agent 22f11a0bda Add clickhouse-tools repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-08-23 12:36:32 +10:00
benvin 78191e8eaf Merge pull request 'Add mediamover repository' (#80) from benvin/mediamover-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #80
2026-08-22 22:53:07 +10:00
unkin-agent 9f85070281 repository: add mediamover repo
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-08-22 22:37:46 +10:00
benvin fe7dec14e8 Merge pull request 'waitfordb: add branch protection on main' (#79) from benvin/waitfordb-branch-protection into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #79
2026-08-22 17:03:15 +10:00
unkin-agent dd02e3dc75 Require all three PR status checks for waitfordb
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
The waitfordb CI is being split into three Woodpecker PR workflows
(pre-commit, test, build), each exposing its own status context. Require
all three on the main branch protection so a PR cannot merge until
pre-commit, test, and build all pass. Mirrors node-lookup.
2026-08-22 15:16:48 +10:00
unkin-agent c44f90e1ff waitfordb: add branch protection on main
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Owners-only merge, benvin approval, and the required Woodpecker PR check.
Requires the repo to be activated in Woodpecker so ci/woodpecker/pr/build
reports before a PR can merge.
2026-08-22 15:05:31 +10:00
benvin 6e6dcc1f25 Merge pull request 'Add waitfordb repo' (#78) from benvin/waitfordb-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #78
2026-08-22 13:29:00 +10:00
unkin-agent 7fa013160a repository: add waitfordb repo
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
waitfordb is a small Go tool shipped as a container image, used as a Kubernetes
initContainer to block an app from starting until its database is ready. It
replaces the hand-written psql-in-a-shell init steps on the arrstack.

Creates the unkin/waitfordb Gitea repo (Go tool settings mirroring node-lookup:
public, squash merges, delete branch after merge). branch_protection is omitted
on creation to avoid requiring Woodpecker status checks that do not exist until
the first pipeline runs; it will be added in a follow-up PR once CI is green.
2026-08-22 12:52:25 +10:00
benvin 62a9f092d1 Merge pull request 'Add terraform-provider-vault-secrets-arrstack repo' (#77) from benvin/add-terraform-provider-arrstackvaultsecret into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #77
2026-08-19 21:50:14 +10:00
unkin-agent b178a5cb37 Rename repo to terraform-provider-vault-secrets-arrstack
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Align the repo name with the vault-secrets-<engine> provider naming used by
the ghp/netbox provider repos (the canonical form for this engine).
2026-08-19 21:40:00 +10:00
unkin-agent 16e8d4cb18 Add terraform-provider-arrstackvaultsecret repo
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
terraform-provider-arrstackvaultsecret is a bespoke Terraform provider that
configures the new arrstack Vault/OpenBao secrets engine (engine config +
roles) from terraform-vault, following the per-engine-provider convention
used by the gpg/litellm/rancher vault-secret providers. It needs a Gitea
repo to host its source before CI and releases can be wired up.

- add config/git.unkin.net/unkin/repository/terraform-provider-arrstackvaultsecret.yaml
- public repo, default branch main, delete-branch-after-merge, squash-only
- Owners-only merge with required pre-commit/build/test Woodpecker checks
2026-08-19 21:35:36 +10:00
benvin abc4f0c3f2 Merge pull request 'Add vault-plugin-secrets-arrstack repo' (#76) from benvin/add-vault-plugin-secrets-arrstack into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #76
2026-08-18 21:21:24 +10:00
unkin-agent 2365b182f4 Add vault-plugin-secrets-arrstack repo
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
vault-plugin-secrets-arrstack is a new Vault/OpenBao secrets engine that
dynamically mints arrproxy machine (per-user) API tokens, enabling
terraform-driven onboarding of *arr services. It needs a Gitea repo to
host its source before CI and releases can be wired up.

- add config/git.unkin.net/unkin/repository/vault-plugin-secrets-arrstack.yaml
- public repo, default branch main, delete-branch-after-merge, squash-only
- Owners-only merge with required pre-commit/build/test Woodpecker checks
2026-08-18 20:47:41 +10:00
benvin 6ecf771f8e Merge pull request 'Protect main on the arr forks + require Woodpecker build' (#75) from benvin/arr-forks-protection into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #75
2026-08-16 21:43:51 +10:00
unkin-agent 247bc5cba5 Protect main on the arr forks + require the Woodpecker build
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Now that each fork's Woodpecker image build is green, lock down main:
Owners-only merge, PRs must pass the build check, and the owner may push
main directly for upstream-fix maintenance merges.

- add branch_protection(main) to sonarr/radarr/prowlarr.yaml
- required check: ci/woodpecker/pr/docker; merge whitelist: Owners; push whitelist: unkinben
2026-08-16 21:29:40 +10:00
benvin a2f1a23d4d Merge pull request 'Add sonarr/radarr/prowlarr fork repositories' (#74) from benvin/arr-forks-repos into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #74
2026-08-16 18:25:03 +10:00
unkin-agent a0933a10b9 Add sonarr/radarr/prowlarr fork repositories
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Create the three arrstack source-fork repos (Postgres + stateless
multi-replica work). No branch protection yet so the initial upstream
mirror can be force-pushed; a follow-up PR adds protection + required
Woodpecker checks once CI exists.
2026-08-16 17:48:52 +10:00
benvin 4837985a31 Merge pull request 'add arrproxy repository' (#73) from benvin/arrproxy-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #73
2026-08-16 15:37:38 +10:00
unkin-agent 9f04426601 arrproxy: tighten repo description
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-08-16 15:34:21 +10:00
unkin-agent 20f22deb51 arrproxy: apply standard branch protection + squash merge
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Match the sibling Go service repo convention (node-lookup/encapi):
require the woodpecker pre-commit/test/build PR status checks,
squash merge style, and restrict merge/approval to Owners/benvin.
2026-08-16 15:27:07 +10:00
unkin-agent 7df105be9c add arrproxy repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-08-16 14:57:28 +10:00
benvin fe66aa2840 Merge pull request 'rename ghp tf provider repo -> terraform-provider-vault-secrets-ghp' (#72) from benvin/ghp-provider-rename into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #72
2026-08-15 20:20:59 +10:00
unkin-agent f66d824f12 rename ghp tf provider repo to terraform-provider-vault-secrets-ghp
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Match the vault-secrets-netbox naming convention: repo
terraform-provider-vault-secrets-ghp, provider source address
git.unkin.net/unkin/vault-secrets-ghp, resources ghp_secret_backend /
ghp_secret_role. Renames the repo (the only content was an unmerged scaffold PR,
which is re-pushed to the new repo).
2026-08-15 20:13:41 +10:00
benvin 5916d4316f Merge pull request 'add ghp Vault engine repos (plugin + terraform provider)' (#71) from benvin/ghp-vault-repos into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #71
2026-08-15 18:58:15 +10:00
unkin-agent fafba02948 add ghp Vault engine repos (plugin + terraform provider)
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
P4 steps 5-6: a Vault/OpenBao secrets engine that mints scoped ghp access tokens
via ghp's admin API (authenticating with the static admin service token now
deployed), plus its Terraform provider. Mirrors the vault-plugin-secrets-gitea /
terraform-provider-giteavaultsecret pair.
2026-08-15 18:24:40 +10:00
benvin 8531d3e263 Merge pull request 'git: add plugin-docker-buildx repository' (#70) from benvin/plugin-docker-buildx-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #70
2026-08-15 15:16:39 +10:00
unkin-agent cfc4f6a92f git: add plugin-docker-buildx repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-08-15 15:01:21 +10:00
benvin b2168a999b Merge pull request 'git: add autobackup-operator repository' (#69) from benvin/autobackup-operator-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #69
2026-08-13 23:36:30 +10:00
unkin-agent c0d8d3d112 git: add autobackup-operator repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Provision the Gitea repo for the autobackup-operator, a Kubernetes
operator that creates S3 buckets and backup schedules from
backups.unkin.net/* annotations on PVCs and CNPG clusters. Matches the
convention of sibling operator repos (private=false, squash merges,
main branch protection with pre-commit/test/build checks).
2026-08-13 23:31:39 +10:00
benvin e50d01402e Merge pull request 'git: add ghp fork repository' (#68) from benvin/ghp-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #68
2026-08-13 22:59:09 +10:00
unkin-agent 07b236fb98 git: add ghp fork repository
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Fork goodtune/ghp into git.unkin.net/unkin/ghp to carry an
admin-service-token auth patch for the Vault ghp token engine.
2026-08-13 22:49:58 +10:00
benvin 63be799b84 Merge pull request 'Add agent-tools repository' (#67) from benvin/agent-tools-repo into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #67
2026-08-12 21:32:46 +10:00
unkin-agent e69288f348 agent-tools: shorten description
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-08-12 21:31:56 +10:00
unkin-agent 3844cf9406 agent-tools: require CI status checks + squash merge (mirror node-lookup)
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-08-12 21:26:35 +10:00
unkin-agent 62e6aa1a85 repository: add agent-tools repo for agentpr/watchpr CLI tools
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
2026-08-12 21:22:21 +10:00
benvin 8ed3dc8348 Merge pull request 'repository: require CI status check on jellyfin-ha-src main' (#66) from benvin/jellyfin-required-ci into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #66
2026-08-11 21:31:29 +10:00
benvin dcf30f3036 Merge pull request 'repository: stop migration_mirror_interval planning an update every run' (#65) from benvin/branch-protection-whitelist-drift into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #65
2026-08-11 21:25:28 +10:00
unkinben 7e25e5c3fa repository: require CI status check on jellyfin-ha-src main
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Why: the jellyfin-ha-src main branch is protected but merges are not gated
on CI, so a pull request can be merged while its Woodpecker build is red.

How: add the ci/woodpecker/pr/ci context to the main branch protection
rule. The gitea provider computes enable_status_check from a non-empty
context list, so this turns required status checks on and blocks merge
until that exact check passes.
2026-08-11 21:23:21 +10:00
unkinben cad35f8d9b repository: stop migration_mirror_interval planning an update every run
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Why:
- The go-gitea/gitea provider schema defaults migration_mirror_interval to
  "8h0m0s", but on read it writes repo.MirrorInterval straight back into state,
  and Gitea returns an empty MirrorInterval for non-mirror repositories.
- So the stored value ("") never matches the schema default ("8h0m0s"), and tofu
  plans an in-place update of every gitea_repository on every run even with no
  config change, keeping terraform-git plans perpetually dirty.
- migration_mirror_interval is the only migration_* field read back from the API;
  the rest are write-only migration options, so no sibling field churns.

Change:
- Add a targeted ignore_changes on migration_mirror_interval at the repository
  module so the provider default no longer fights Gitea's empty value, making
  every repository idempotent. It is a migration-only knob with no drift to track
  for these non-mirror repos.
2026-08-11 21:14:24 +10:00
benvin 6d937ae6cd Merge pull request 'repository: protect jellyfin-ha-src main branch' (#64) from benvin/jellyfin-ha-src-protection into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #64
2026-08-11 20:45:40 +10:00
unkinben db62cd1b26 repository: protect jellyfin-ha-src main branch
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Now that the source fork is seeded on main with the pinned upstream tree and a
pristine upstream ref, enable branch protection on main: block direct pushes
and require an Owners approval so future changes land through reviewed pull
requests.
2026-08-10 23:55:07 +10:00
benvin 5bf5f9d85e Merge pull request 'repository: add jellyfin-ha-src source fork' (#63) from benvin/jellyfin-ha-src into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #63
2026-08-10 23:43:04 +10:00
unkinben 4ca5145d50 repository: add jellyfin-ha-src source fork
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Add the jellyfin-ha-src Gitea repository that carries the HA source fork of
ZoltyMat/jellyfin-ha with local patches, replacing the direct upstream clone
in the build pipeline.

Declare the repository as public with a main default branch and
delete-branch-after-merge enabled. Leave branch protection unset so the
initial fork seed can push the pinned upstream tree and a pristine upstream
ref directly to main; protection is added in a follow-up change once the fork
is seeded.
2026-08-10 23:35:19 +10:00
benvin 62596a8086 Merge pull request 'team: stop spurious edits that fail Gitea 1.26 permission validation' (#62) from benvin/gitea-provider-1.26 into main
ci/woodpecker/push/apply Pipeline was successful
Reviewed-on: #62
2026-08-10 23:05:51 +10:00
unkinben df118383da team: stop spurious edits that fail Gitea 1.26 permission validation
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Why:
- The go-gitea/gitea provider's SDK (v0.25.1, already shipped in provider
  0.8.1 on main) rejects a team permission of `none` on every EditTeam with
  "permission mode invalid"; it only accepts read/write/admin/owner
  client-side. The same check exists in the older 0.21.0 SDK, so the provider
  version is not the lever here.
- The team module's `units` (server returns an unordered space-separated
  string that never matches the provider's comma-ordered default) and
  `repositories` (provider sorts state; `include_all_repositories` populates
  every repo) drift on representation alone, so every apply plans an in-place
  update for every team.
- Each update calls EditTeam, which replays the stored `permission=none` kept
  by `ignore_changes` and fails, blocking apply for every non-owner team
  (docker/terraform/rpmbuild/puppet/pybuild/forgebot/agents) and the whole
  terraform-git apply, including the unkin-agent rollout.

Change:
- Add `units` and `repositories` to the team `ignore_changes` so provider
  representation churn no longer triggers an EditTeam call.
- Preserve each team's current on-server permission and repository membership
  (no access change).
2026-08-09 12:31:19 +10:00
benvin 15978c486f Merge pull request 'Import pre-existing Gitea branch protections' (#61) from benvin/imports-branch-protection into main
ci/woodpecker/push/apply Pipeline failed
Reviewed-on: #61
2026-08-09 12:01:51 +10:00
unkinben a43267532a Import pre-existing Gitea branch protections
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Why:
- tofu apply fails with "Branch protection already exist" because the nine
  repos protected in #60 already have live branch protection in Gitea that is
  absent from Terraform state, so Terraform tries to create rules that already
  exist and Gitea rejects them.
- The pinned go-gitea/gitea provider 0.7.0 defines no importer for
  gitea_repository_branch_protection, so the existing rules cannot be adopted
  on that version.

How:
- Bump the gitea provider from 0.7.0 to 0.8.1, which adds an importer for
  gitea_repository_branch_protection (id format <org>/<repo>/<rule_name>).
- Add import blocks adopting the nine existing branch protections into state
  instead of recreating them.
2026-08-09 11:45:26 +10:00
benvin d7d6794a51 Merge pull request 'Add unkin-agent Gitea identity with write but no merge' (#59) from benvin/unkin-agent-identity into main
ci/woodpecker/push/apply Pipeline failed
Reviewed-on: #59
2026-08-08 23:34:24 +10:00
benvin 7c4defde29 Merge pull request 'Protect default branches of unprotected active repos' (#60) from benvin/protect-unprotected-repos into main
ci/woodpecker/push/apply Pipeline failed
Reviewed-on: #60
2026-08-08 23:17:44 +10:00
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
unkinben 4953142200 Add unkin-agent Gitea identity with write but no merge
ci/woodpecker/pr/plan Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Why: AI coding agents currently push and open PRs as Ben's own account
using Ben's token, so their work is unattributable and carries Ben's full
owner privileges. A dedicated least-privilege identity separates agent work
from Ben's and keeps merge a human decision.

How:
- add the unkin-agent bot user (non-admin, no org/repo creation, limited
  visibility); it authenticates via ephemeral vault-plugin-secrets-gitea
  tokens, not a stored password
- add the agents team granting Write on all unkin repositories, the minimum
  needed to push branches and open PRs; unkin-agent is its only member
- add merge_whitelist_teams Owners to every default-branch protection rule
  that lacked a merge whitelist, so Write no longer implies merge and only
  Owners (Ben) can merge across the estate
2026-08-08 22:37:52 +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
103 changed files with 987 additions and 45 deletions
+1 -1
View File
@@ -23,7 +23,7 @@ init:
plan: init
@$(call vault_env) && \
terragrunt run --all --parallelism 4 --non-interactive plan
terragrunt run --all --parallelism 4 --non-interactive plan -- -lock=false
apply-if-changes: init
@$(call vault_env) && \
+3
View File
@@ -0,0 +1,3 @@
description: "Pull mirrors of upstream repositories"
visibility: public
repo_admin_change_team_access: true
@@ -0,0 +1,11 @@
description: "Pull mirror of github.com/9p4/jellyfin-plugin-sso, the Jellyfin SSO/OIDC authentication plugin"
private: false
has_issues: false
has_pull_requests: false
mirror: true
migration_clone_address: "https://github.com/9p4/jellyfin-plugin-sso"
migration_service: "git"
migration_mirror_interval: "8h0m0s"
migration_issue_labels: false
migration_milestones: false
migration_releases: false
@@ -0,0 +1,16 @@
description: "CLI tools for orchestrator PR automation as unkin-agent"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
- "ci/woodpecker/pr/pre-commit"
approval_whitelist_users:
- "benvin"
@@ -2,3 +2,8 @@ description: "Sudaporn's Research Data visualisation, normalised "
private: false
default_branch: "master"
default_delete_branch_after_merge: true
branch_protection:
- rule_name: "master"
enable_push: false
approval_whitelist_teams:
- "Owners"
@@ -2,3 +2,8 @@ description: "Sudaporn's Research Data visualisation, normalised"
private: false
default_branch: "master"
default_delete_branch_after_merge: true
branch_protection:
- rule_name: "master"
enable_push: false
approval_whitelist_teams:
- "Owners"
@@ -4,6 +4,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -0,0 +1,16 @@
description: "arrstack reverse proxy: oauth2-gated UI + per-user API-key broker"
private: true
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
- "ci/woodpecker/pr/test"
- "ci/woodpecker/pr/build"
approval_whitelist_users:
- "benvin"
@@ -0,0 +1,14 @@
description: "Neovim plugin manager that installs plugins from tagged archives in an HTTP artifact repository into nvim's native package path"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/test"
- "ci/woodpecker/pr/lint"
- "ci/woodpecker/pr/pre-commit"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "master"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -0,0 +1,16 @@
description: "Kubernetes operator that provisions S3 buckets and backup schedules from backups.unkin.net/* annotations on PVCs and CNPG clusters"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
- "ci/woodpecker/pr/test"
- "ci/woodpecker/pr/build"
approval_whitelist_users:
- "benvin"
@@ -2,3 +2,8 @@ description: "Monorepo of small single-purpose CLI tools sharing a common librar
private: false
default_branch: "main"
default_delete_branch_after_merge: true
branch_protection:
- rule_name: "main"
enable_push: false
approval_whitelist_teams:
- "Owners"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -0,0 +1,15 @@
description: "Builds AlmaLinux node rootfs tarballs for bootapi image-based provisioning; on v* tag publishes almalinux9-node-<ver>.tar.zst to the artifactapi rootfs-images repo."
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
- "ci/woodpecker/pr/lint"
approval_whitelist_users:
- "benvin"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -1,4 +1,4 @@
description: "Vault PKI certificate issuance and SSH host key signing tool for Puppet-managed infrastructure"
description: "Vault-backed X.509 certificate signing helper for Puppet"
private: false
default_branch: "master"
default_delete_branch_after_merge: true
@@ -0,0 +1,14 @@
description: "CLI tools (chcat, chtail, chgrep) for searching, filtering and tailing logs in the ClickHouse log store"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
- "ci/woodpecker/pr/pre-commit"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
@@ -0,0 +1,15 @@
description: "Base container images for the estate, carrying internal CA trust and dnf/repo configuration, built as a matrix across the supported distros."
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/pre-commit"
approval_whitelist_users:
- "benvin"
@@ -1,3 +1,8 @@
description: "Docker image to be used in Kubernetes as a developers container"
private: false
default_delete_branch_after_merge: true
branch_protection:
- rule_name: "main"
enable_push: false
approval_whitelist_teams:
- "Owners"
@@ -0,0 +1,15 @@
description: "Go toolchain builder container image, built on each supported container-base distro image, used by Woodpecker pipelines to compile Go projects."
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/pre-commit"
approval_whitelist_users:
- "benvin"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
@@ -3,3 +3,8 @@ private: false
default_branch: "master"
default_delete_branch_after_merge: true
repo_template: true
branch_protection:
- rule_name: "master"
enable_push: false
approval_whitelist_teams:
- "Owners"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
@@ -0,0 +1,17 @@
description: "Fork of goodtune/ghp (GitHub proxy) with unkin patches"
private: true
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
# Whitelist-push: the owner can push main directly (needed for the initial
# push and the fork's maintenance workflow); everyone else must open a PR.
enable_push: true
push_whitelist_users:
- "unkinben"
# PRs to main must pass the fork build/vet pipeline before merge.
status_check_contexts:
- "ci/woodpecker/pr/build"
@@ -0,0 +1,16 @@
description: "Build repo that compiles the tailscale/go-cache-plugin GOCACHEPROG S3 Go build cache from a pinned upstream module version and publishes static binaries as Gitea releases."
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
- "ci/woodpecker/pr/pre-commit"
approval_whitelist_users:
- "benvin"
@@ -0,0 +1,14 @@
description: "Shared Go library for estate services: postgres, http service kit, vault and gitea clients"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
- "ci/woodpecker/pr/pre-commit"
@@ -1,3 +1,8 @@
description: "A repository for building initrd.img in docker "
private: false
default_delete_branch_after_merge: true
branch_protection:
- rule_name: "main"
enable_push: false
approval_whitelist_teams:
- "Owners"
@@ -0,0 +1,11 @@
description: "Source fork of ZoltyMat/jellyfin-ha carrying HA patches"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
branch_protection:
- rule_name: "main"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/ci"
approval_whitelist_teams:
- "Owners"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
@@ -0,0 +1,15 @@
fork_from: "mirrors/jellyfin-plugin-sso"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
# Whitelist-push: the owner pushes main directly when syncing upstream;
# everyone else must open a PR.
enable_push: true
push_whitelist_users:
- "unkinben"
# PRs to main must pass the plugin build pipeline before merge.
status_check_contexts:
- "ci/woodpecker/pr/ci"
approval_whitelist_teams:
- "Owners"
@@ -0,0 +1,16 @@
description: "Kubernetes operator for managing Kea DHCP clusters, subnets, and PXE client classes"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
- "ci/woodpecker/pr/test"
- "ci/woodpecker/pr/build"
approval_whitelist_teams:
- "Owners"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -0,0 +1,14 @@
description: "Web UI for the ClickHouse log store: fuzzy find, tail and SQL-filter logs (logviewer.unkin.net)"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
- "ci/woodpecker/pr/pre-commit"
@@ -0,0 +1,14 @@
description: "Keyboard-centric web UI to mark media as cheeztv (kids) content via hardlinks; oauth2-proxy fronted, talks to sonarr/radarr APIs"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
- "ci/woodpecker/pr/pre-commit"
@@ -0,0 +1,10 @@
description: "Media copy/move tool: Go API + UI spawning per-file k8s Jobs from mediafs CephFS to media PVCs; doubles as a Ceph aggregate-bandwidth test"
private: true
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
# Whitelist-push: the owner can push main directly (needed for the initial
# push and the fork's maintenance workflow); everyone else must open a PR.
enable_push: true
@@ -10,6 +10,8 @@ allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
@@ -0,0 +1,14 @@
description: "Woodpecker plugin-docker-buildx image with the internal Vault-PKI CA baked in (trusts artifactapi)"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
approval_whitelist_teams:
- "docker"
@@ -0,0 +1,16 @@
description: "Private fork of Prowlarr: Postgres backend + stateless multi-replica for the arrstack"
private: true
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
# Owner can push main directly for fork maintenance (upstream-fix merges);
# everyone else opens a PR that must pass the Woodpecker image build.
enable_push: true
push_whitelist_users:
- "unkinben"
status_check_contexts:
- "ci/woodpecker/pr/docker"
@@ -0,0 +1,14 @@
description: "Go CLIs to diff Puppet catalogs between branches and map puppet-prod changes to affected hosts"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
- "ci/woodpecker/pr/pre-commit"
@@ -2,3 +2,8 @@ description: "A fastapi service to present puppet services via an api"
private: false
default_branch: "master"
default_delete_branch_after_merge: true
branch_protection:
- rule_name: "master"
enable_push: false
approval_whitelist_teams:
- "Owners"
@@ -0,0 +1,16 @@
description: "Private fork of Radarr: Postgres backend + stateless multi-replica for the arrstack"
private: true
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
# Owner can push main directly for fork maintenance (upstream-fix merges);
# everyone else opens a PR that must pass the Woodpecker image build.
enable_push: true
push_whitelist_users:
- "unkinben"
status_check_contexts:
- "ci/woodpecker/pr/docker"
@@ -0,0 +1,14 @@
description: "API service that opens terraform-git PRs for new repo requests via kube Jobs; oauth2-proxy'd status UI"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
- "ci/woodpecker/pr/pre-commit"
@@ -2,3 +2,8 @@ description: "Package the internal ca-certificates"
private: false
default_branch: "master"
default_delete_branch_after_merge: true
branch_protection:
- rule_name: "master"
enable_push: false
approval_whitelist_teams:
- "Owners"
@@ -0,0 +1,16 @@
description: "Private fork of Sonarr: Postgres backend + stateless multi-replica for the arrstack"
private: true
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
# Owner can push main directly for fork maintenance (upstream-fix merges);
# everyone else opens a PR that must pass the Woodpecker image build.
enable_push: true
push_whitelist_users:
- "unkinben"
status_check_contexts:
- "ci/woodpecker/pr/docker"
@@ -0,0 +1,14 @@
description: "Vault-backed SSH host certificate signing helper for Puppet"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
- "ci/woodpecker/pr/pre-commit"
@@ -1,3 +1,8 @@
description: "A stack of microservices that aim to offer a distributed streaming service."
private: false
default_delete_branch_after_merge: true
branch_protection:
- rule_name: "main"
enable_push: false
approval_whitelist_teams:
- "Owners"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
@@ -4,6 +4,8 @@ default_branch: "main"
default_delete_branch_after_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -0,0 +1,16 @@
description: "YAML-driven Terraform for NetBox IPAM, networks, and devices + Kea DHCP"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
- "ci/woodpecker/pr/plan"
approval_whitelist_users:
- "benvin"
approval_whitelist_teams:
- "Owners"
@@ -2,6 +2,7 @@ description: "Manage nomad with Terraform"
private: false
default_branch: "master"
default_delete_branch_after_merge: true
archived: true
branch_protection:
- rule_name: "master"
enable_push: false
@@ -3,6 +3,8 @@ private: false
default_delete_branch_after_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -10,6 +10,8 @@ allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -10,6 +10,8 @@ allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -0,0 +1,16 @@
description: "Terraform provider for the kea-operator KeaAPI: manage Kea DHCP subnets and PXE client classes."
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
approval_whitelist_users:
- "benvin"
@@ -10,6 +10,8 @@ allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -10,6 +10,8 @@ allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -0,0 +1,21 @@
description: "Terraform provider to manage the arrstack Vault secrets engine (config + roles)"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
# Squash-only: the gitea provider has no "default merge style", so we restrict
# the allowed styles to squash to force it.
allow_merge_commits: false
allow_rebase: false
allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
approval_whitelist_teams:
- "Owners"
@@ -0,0 +1,21 @@
description: "Terraform provider for the Vault/OpenBao ghp token secrets engine (vault-secrets-ghp)"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
# Squash-only: the gitea provider has no "default merge style", so we restrict
# the allowed styles to squash to force it.
allow_merge_commits: false
allow_rebase: false
allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
approval_whitelist_teams:
- "Owners"
@@ -0,0 +1,21 @@
description: "Terraform provider for the Vault/OpenBao NetBox token secrets engine (pairs with vault-plugin-secrets-netbox)"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
# Squash-only: the gitea provider has no "default merge style", so we restrict
# the allowed styles to squash to force it.
allow_merge_commits: false
allow_rebase: false
allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
approval_whitelist_teams:
- "Owners"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -5,4 +5,6 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -0,0 +1,21 @@
description: "HashiCorp Vault / OpenBao secrets engine issuing short-lived signed JWT app tokens (per-app roles, offline JWKS validation) for self-made services"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
# Squash-only: the gitea provider has no "default merge style", so we restrict
# the allowed styles to squash to force it.
allow_merge_commits: false
allow_rebase: false
allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
approval_whitelist_teams:
- "Owners"
@@ -0,0 +1,21 @@
description: "Vault/OpenBao secrets engine minting dynamic arrproxy per-user API tokens"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
# Squash-only: the gitea provider has no "default merge style", so we restrict
# the allowed styles to squash to force it.
allow_merge_commits: false
allow_rebase: false
allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
approval_whitelist_teams:
- "Owners"
@@ -10,6 +10,8 @@ allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -0,0 +1,21 @@
description: "HashiCorp Vault / OpenBao secrets engine for ghp: mints ephemeral, scoped access tokens via the ghp admin API, authenticating as a static admin service token"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
# Squash-only: the gitea provider has no "default merge style", so we restrict
# the allowed styles to squash to force it.
allow_merge_commits: false
allow_rebase: false
allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
approval_whitelist_teams:
- "Owners"
@@ -10,6 +10,8 @@ allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -10,6 +10,8 @@ allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -10,6 +10,8 @@ allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -0,0 +1,21 @@
description: "HashiCorp Vault / OpenBao secrets engine for NetBox API tokens (seeded admin + dynamic per-user tokens with expiry-aligned leases)"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
# Squash-only: the gitea provider has no "default merge style", so we restrict
# the allowed styles to squash to force it.
allow_merge_commits: false
allow_rebase: false
allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
approval_whitelist_teams:
- "Owners"
@@ -10,6 +10,8 @@ allow_rebase_explicit: false
allow_squash_merge: true
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/pre-commit"
@@ -5,6 +5,8 @@ default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
@@ -0,0 +1,14 @@
description: "Neovim plugin manager installing plugins from tagged archives on artifactapi/Artifactory instead of git clones"
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/test"
- "ci/woodpecker/pr/lint"
- "ci/woodpecker/pr/pre-commit"
@@ -0,0 +1,16 @@
description: "A small Go tool, shipped as a container image, used as a Kubernetes initContainer to block an app from starting until its database is ready."
private: false
default_branch: "main"
default_delete_branch_after_merge: true
default_merge_style: "squash"
branch_protection:
- rule_name: "main"
merge_whitelist_teams:
- "Owners"
enable_push: false
status_check_contexts:
- "ci/woodpecker/pr/build"
- "ci/woodpecker/pr/test"
- "ci/woodpecker/pr/pre-commit"
approval_whitelist_users:
- "benvin"
@@ -0,0 +1,14 @@
# Grants the unkin-agent bot Write across every unkin repository so Ben's AI
# coding agents can push benvin/* branches and open pull requests. Write is the
# minimum Gitea permission that allows pushing branches + creating PRs.
#
# Merge stays reserved for Ben: branch protection on every default branch sets a
# merge whitelist of the Owners team only, so members of this team can push and
# open PRs but cannot merge or approve. Keep this team out of every merge and
# approval whitelist.
description: "AI coding agents -- push branches + open PRs, never merge"
permission: write
include_all_repositories: true
can_create_repos: false
members:
- unkin-agent
@@ -0,0 +1,16 @@
# Least-privilege access for the repospawner bot: Write on terraform-git only,
# which is the minimum Gitea permission that allows pushing a branch and opening
# a pull request. repospawner does its whole job here (repo-creation PRs), so it
# is kept out of the org-wide "agents" team (include_all_repositories: true).
#
# Merge stays reserved for Ben: branch protection on terraform-git's main sets a
# merge whitelist of the Owners team only. Keep this team out of every merge and
# approval whitelist.
description: "repospawner bot -- push branches + open PRs on terraform-git only"
permission: write
include_all_repositories: false
can_create_repos: false
repositories:
- terraform-git
members:
- repospawner
@@ -0,0 +1,22 @@
# Service identity for repospawner, which opens pull requests against this
# repository (terraform-git) to add new Gitea repositories on request. It is
# deliberately separate from unkin-agent so its access can stay scoped to the
# single repository it needs: the "repospawner" team (unkin/team/repospawner.yaml)
# grants Write on terraform-git and nothing else.
#
# Auth is via ephemeral API tokens minted by the vault-plugin-secrets-gitea
# engine -- no usable credential lives in this repo's state beyond the generated
# placeholder. Merge stays blocked by branch protection (merge whitelist =
# Owners only), so it can push branches and open PRs but never merge.
email: repospawner@unkin.net
full_name: "Repo Spawner"
description: "repospawner service identity -- opens repo-creation PRs against terraform-git"
# Conservative bot posture: not a site admin, cannot create orgs or repos,
# profile visible only to signed-in users.
visibility: limited
admin: false
# Restricted: account can only see repos/orgs it is explicitly added to -- the
# repospawner team grant on terraform-git is all it needs.
restricted: true
allow_create_organization: false
max_repo_creation: 0
@@ -0,0 +1,18 @@
# Shared identity used by Ben's AI coding agents to submit work (branches, pull
# requests, issues, comments) as a distinct, attributable, least-privilege
# account instead of Ben's own login. Auth is via ephemeral API tokens minted by
# the vault-plugin-secrets-gitea engine (gitea/creds/unkin-agent) -- no token or
# usable password lives in this repo's state beyond the generated placeholder.
#
# Write access comes from the "agents" team (team/agents.yaml); merge is blocked
# by branch protection (merge whitelist = Owners only), so the agent can open and
# comment on PRs/issues but never merge or approve.
email: unkin-agent@unkin.net
full_name: "Unkin Agent"
description: "shared identity for automated AI coding agents -- write, never merge"
# Conservative bot posture: not a site admin, cannot create orgs or repos,
# profile visible only to signed-in users.
visibility: limited
admin: false
allow_create_organization: false
max_repo_creation: 0
+81 -34
View File
@@ -4,167 +4,167 @@ import {
}
import {
to = module.repository["git.unkin.net/unkin/puppet-prod"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/puppet-prod"].gitea_repository.this[0]
id = "2"
}
import {
to = module.repository["git.unkin.net/unkin/puppet-r10k"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/puppet-r10k"].gitea_repository.this[0]
id = "3"
}
import {
to = module.repository["git.unkin.net/unkin/rpmbuild-gonic"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/rpmbuild-gonic"].gitea_repository.this[0]
id = "23"
}
import {
to = module.repository["git.unkin.net/unkin/docker-almalinux-base"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/docker-almalinux-base"].gitea_repository.this[0]
id = "24"
}
import {
to = module.repository["git.unkin.net/unkin/rpmbuild-internal-ca-certificates"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/rpmbuild-internal-ca-certificates"].gitea_repository.this[0]
id = "27"
}
import {
to = module.repository["git.unkin.net/unkin/rpmbuild-template"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/rpmbuild-template"].gitea_repository.this[0]
id = "29"
}
import {
to = module.repository["git.unkin.net/unkin/rpmbuild-jellyfin-web"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/rpmbuild-jellyfin-web"].gitea_repository.this[0]
id = "31"
}
import {
to = module.repository["git.unkin.net/unkin/rpmbuild-proxlb"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/rpmbuild-proxlb"].gitea_repository.this[0]
id = "33"
}
import {
to = module.repository["git.unkin.net/unkin/docker-almalinux-buildrunner"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/docker-almalinux-buildrunner"].gitea_repository.this[0]
id = "36"
}
import {
to = module.repository["git.unkin.net/unkin/docker-template"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/docker-template"].gitea_repository.this[0]
id = "38"
}
import {
to = module.repository["git.unkin.net/unkin/terraform-vault"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/terraform-vault"].gitea_repository.this[0]
id = "39"
}
import {
to = module.repository["git.unkin.net/unkin/docker-almalinux-jupyterinstance"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/docker-almalinux-jupyterinstance"].gitea_repository.this[0]
id = "40"
}
import {
to = module.repository["git.unkin.net/unkin/rpmbuilder"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/rpmbuilder"].gitea_repository.this[0]
id = "41"
}
import {
to = module.repository["git.unkin.net/unkin/docker-almalinux-runnerdnd"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/docker-almalinux-runnerdnd"].gitea_repository.this[0]
id = "43"
}
import {
to = module.repository["git.unkin.net/unkin/initbuilder"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/initbuilder"].gitea_repository.this[0]
id = "47"
}
import {
to = module.repository["git.unkin.net/unkin/puppetapi"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/puppetapi"].gitea_repository.this[0]
id = "50"
}
import {
to = module.repository["git.unkin.net/unkin/terraform-nomad"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/terraform-nomad"].gitea_repository.this[0]
id = "53"
}
import {
to = module.repository["git.unkin.net/unkin/packer-images"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/packer-images"].gitea_repository.this[0]
id = "59"
}
import {
to = module.repository["git.unkin.net/unkin/app-sudaporn-research-normalised"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/app-sudaporn-research-normalised"].gitea_repository.this[0]
id = "60"
}
import {
to = module.repository["git.unkin.net/unkin/app-sudaporn-research-individual"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/app-sudaporn-research-individual"].gitea_repository.this[0]
id = "63"
}
import {
to = module.repository["git.unkin.net/unkin/terraform-incus"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/terraform-incus"].gitea_repository.this[0]
id = "66"
}
import {
to = module.repository["git.unkin.net/unkin/artifactapi"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/artifactapi"].gitea_repository.this[0]
id = "67"
}
import {
to = module.repository["git.unkin.net/unkin/argocd-apps"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/argocd-apps"].gitea_repository.this[0]
id = "100"
}
import {
to = module.repository["git.unkin.net/unkin/certmanager"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/certmanager"].gitea_repository.this[0]
id = "101"
}
import {
to = module.repository["git.unkin.net/unkin/node-lookup"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/node-lookup"].gitea_repository.this[0]
id = "102"
}
import {
to = module.repository["git.unkin.net/unkin/container-devcompute"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/container-devcompute"].gitea_repository.this[0]
id = "135"
}
import {
to = module.repository["git.unkin.net/unkin/streamstack"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/streamstack"].gitea_repository.this[0]
id = "136"
}
import {
to = module.repository["git.unkin.net/unkin/terraform-provider-artifactapi"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/terraform-provider-artifactapi"].gitea_repository.this[0]
id = "137"
}
import {
to = module.repository["git.unkin.net/unkin/forgebot"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/forgebot"].gitea_repository.this[0]
id = "139"
}
import {
to = module.repository["git.unkin.net/unkin/forgebot-skills"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/forgebot-skills"].gitea_repository.this[0]
id = "140"
}
import {
to = module.repository["git.unkin.net/unkin/container-agent-base"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/container-agent-base"].gitea_repository.this[0]
id = "141"
}
import {
to = module.repository["git.unkin.net/unkin/container-agent-dev"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/container-agent-dev"].gitea_repository.this[0]
id = "142"
}
import {
to = module.repository["git.unkin.net/unkin/container-agent-infra"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/container-agent-infra"].gitea_repository.this[0]
id = "143"
}
@@ -199,7 +199,54 @@ import {
}
import {
to = module.repository["git.unkin.net/unkin/terraform-git"].gitea_repository.this
to = module.repository["git.unkin.net/unkin/terraform-git"].gitea_repository.this[0]
id = "144"
}
# Branch protections that already exist in Gitea but are not yet in state.
# Import id format is <organisation>/<repository>/<rule_name>.
import {
to = module.branch_protection["git.unkin.net/unkin/app-sudaporn-research-individual/master"].gitea_repository_branch_protection.this
id = "unkin/app-sudaporn-research-individual/master"
}
import {
to = module.branch_protection["git.unkin.net/unkin/app-sudaporn-research-normalised/master"].gitea_repository_branch_protection.this
id = "unkin/app-sudaporn-research-normalised/master"
}
import {
to = module.branch_protection["git.unkin.net/unkin/benvin-utils/main"].gitea_repository_branch_protection.this
id = "unkin/benvin-utils/main"
}
import {
to = module.branch_protection["git.unkin.net/unkin/container-devcompute/main"].gitea_repository_branch_protection.this
id = "unkin/container-devcompute/main"
}
import {
to = module.branch_protection["git.unkin.net/unkin/docker-template/master"].gitea_repository_branch_protection.this
id = "unkin/docker-template/master"
}
import {
to = module.branch_protection["git.unkin.net/unkin/initbuilder/main"].gitea_repository_branch_protection.this
id = "unkin/initbuilder/main"
}
import {
to = module.branch_protection["git.unkin.net/unkin/puppetapi/master"].gitea_repository_branch_protection.this
id = "unkin/puppetapi/master"
}
import {
to = module.branch_protection["git.unkin.net/unkin/rpmbuild-internal-ca-certificates/master"].gitea_repository_branch_protection.this
id = "unkin/rpmbuild-internal-ca-certificates/master"
}
import {
to = module.branch_protection["git.unkin.net/unkin/streamstack/main"].gitea_repository_branch_protection.this
id = "unkin/streamstack/main"
}
+11
View File
@@ -19,6 +19,7 @@ module "repository" {
name = each.value.name
organisation = each.value.organisation
fork_from = each.value.fork_from
description = each.value.description
private = each.value.private
default_branch = each.value.default_branch
@@ -35,6 +36,16 @@ module "repository" {
website = each.value.website
autodetect_manual_merge = each.value.autodetect_manual_merge
mirror = each.value.mirror
migration_clone_address = each.value.migration_clone_address
migration_service = each.value.migration_service
migration_mirror_interval = each.value.migration_mirror_interval
migration_lfs = each.value.migration_lfs
migration_lfs_endpoint = each.value.migration_lfs_endpoint
migration_issue_labels = each.value.migration_issue_labels
migration_milestones = each.value.migration_milestones
migration_releases = each.value.migration_releases
depends_on = [module.organisation]
}
@@ -3,7 +3,7 @@ terraform {
required_providers {
gitea = {
source = "go-gitea/gitea"
version = "0.7.0"
version = "0.8.1"
}
}
}
@@ -3,7 +3,7 @@ terraform {
required_providers {
gitea = {
source = "go-gitea/gitea"
version = "0.7.0"
version = "0.8.1"
}
}
}
@@ -3,7 +3,7 @@ terraform {
required_providers {
gitea = {
source = "go-gitea/gitea"
version = "0.7.0"
version = "0.8.1"
}
}
}
@@ -1,4 +1,10 @@
locals {
fork_source = var.fork_from == null ? null : split("/", var.fork_from)
}
resource "gitea_repository" "this" {
count = var.fork_from == null ? 1 : 0
username = var.organisation
name = var.name
description = var.description
@@ -17,4 +23,33 @@ resource "gitea_repository" "this" {
website = var.website
autodetect_manual_merge = var.autodetect_manual_merge
archive_on_destroy = true
mirror = var.mirror
migration_clone_address = var.migration_clone_address
migration_service = var.migration_service
migration_mirror_interval = var.migration_mirror_interval
migration_lfs = var.migration_lfs
migration_lfs_endpoint = var.migration_lfs_endpoint
migration_issue_labels = var.migration_issue_labels
migration_milestones = var.migration_milestones
migration_releases = var.migration_releases
lifecycle {
# migration_mirror_interval defaults to "8h0m0s" but Gitea returns an empty MirrorInterval for non-mirror repos, so the read-back never matches and plans a spurious update every run; it is a migration-only knob with no drift to track here.
ignore_changes = [migration_mirror_interval]
}
}
moved {
from = gitea_repository.this
to = gitea_repository.this[0]
}
# gitea_fork has no archive_on_destroy, so removing a fork from the config deletes the repository instead of archiving it.
resource "gitea_fork" "this" {
count = var.fork_from == null ? 0 : 1
owner = local.fork_source[0]
repo = local.fork_source[1]
organization = var.organisation
}
@@ -1,3 +1,3 @@
output "id" {
value = gitea_repository.this.id
value = one(concat(gitea_repository.this[*].id, gitea_fork.this[*].id))
}
@@ -3,7 +3,7 @@ terraform {
required_providers {
gitea = {
source = "go-gitea/gitea"
version = "0.7.0"
version = "0.8.1"
}
}
}
@@ -6,6 +6,22 @@ variable "organisation" {
type = string
}
variable "fork_from" {
description = "Source repository to fork, as \"<owner>/<repo>\". When set, a fork is created instead of a new repository."
type = string
default = null
validation {
condition = var.fork_from == null || can(regex("^[^/]+/[^/]+$", var.fork_from))
error_message = "fork_from must be \"<owner>/<repo>\"."
}
validation {
condition = var.fork_from == null || try(split("/", var.fork_from)[1], null) == var.name
error_message = "fork_from source repository must be named \"${var.name}\": a fork inherits the source name, so it cannot differ from the config file name."
}
}
variable "description" {
type = string
default = null
@@ -80,3 +96,48 @@ variable "autodetect_manual_merge" {
type = bool
default = null
}
variable "mirror" {
type = bool
default = null
}
variable "migration_clone_address" {
type = string
default = null
}
variable "migration_service" {
type = string
default = null
}
variable "migration_mirror_interval" {
type = string
default = null
}
variable "migration_lfs" {
type = bool
default = null
}
variable "migration_lfs_endpoint" {
type = string
default = null
}
variable "migration_issue_labels" {
type = bool
default = null
}
variable "migration_milestones" {
type = bool
default = null
}
variable "migration_releases" {
type = bool
default = null
}
+2 -1
View File
@@ -8,7 +8,8 @@ resource "gitea_team" "this" {
repositories = var.repositories
lifecycle {
ignore_changes = [permission]
# Gitea's SDK rejects the stored permission=none on any EditTeam call; units/repositories only churn on provider representation (unordered units string, sorted/include-all repos), so ignore them to avoid spurious edits that would fail.
ignore_changes = [permission, units, repositories]
}
}
@@ -3,7 +3,7 @@ terraform {
required_providers {
gitea = {
source = "go-gitea/gitea"
version = "0.7.0"
version = "0.8.1"
}
}
}

Some files were not shown because too many files have changed in this diff Show More