1
0
Fork 0
mirror of https://github.com/imjasonh/git-k8s synced 2026-07-13 08:57:00 +00:00
Commit graph

21 commits

Author SHA1 Message Date
27d1bfe910
Merge pull request #5 from imjasonh/claude/git-k8s-control-plane-ksW2i
Rewrite e2e tests in Go, replace bash-in-YAML test steps
2026-02-27 23:17:28 -05:00
Claude
765007bb87
Fix stale resourceVersion bug in push controller
The push controller updates status to InProgress then later to
Succeeded/Failed. The first UpdateStatus call returns a new object with
an updated resourceVersion, but the code was discarding it. Subsequent
status updates used the stale resourceVersion, causing 409 Conflict
errors and an infinite retry loop where transactions never reached a
terminal phase.

Fix: capture the returned object from the InProgress UpdateStatus so
subsequent calls use the correct resourceVersion.

Also adds better timeout diagnostics in e2e test helpers.

https://claude.ai/code/session_01QfFzqKQUsxxBsiZUhuJ3pG
2026-02-28 04:09:56 +00:00
Claude
32137c3bc4
Rewrite e2e tests in Go, replace bash-in-YAML test steps
Move all e2e test logic from bash steps in ci.yaml into Go test files
under test/e2e/. CI now sets up infrastructure (KinD, Knative, CRDs,
controllers, Gitea) then runs `go test -tags=e2e ./test/e2e/`.

Benefits:
- Tests run concurrently via t.Parallel()
- No more bash-in-YAML maintenance burden
- Each test creates its own isolated resources with cleanup
- Proper Go test output with -v
- Build-tagged so `go test ./...` skips them

Tests:
- TestPushTransaction: push main to a new branch, verify on git server
- TestPushTransactionMultipleRefSpecs: push to two branches at once
- TestRepoSync: create two repos, set up GitRepoSync, verify controller

https://claude.ai/code/session_01QfFzqKQUsxxBsiZUhuJ3pG
2026-02-28 02:04:29 +00:00
163e810858
Merge pull request #4 from imjasonh/claude/git-k8s-control-plane-ksW2i
Add unit tests and GitRepoSync e2e test
2026-02-27 20:59:29 -05:00
Claude
4e4f5f923f
Add unit tests and GitRepoSync e2e test
Add unit tests for all packages that previously had zero test coverage:
- pkg/apis/git/v1alpha1: defaults, deepcopy, scheme registration, constants
- pkg/client: toUnstructured/fromUnstructured round-trips, context injection
- pkg/reconciler/push: splitKey, nestedFieldNoCopy, unstructuredNestedStringMap, base64 decoding
- pkg/reconciler/sync: splitKey
- pkg/reconciler/resolver: splitKey, changeName

Add e2e test exercising the sync controller:
- Creates second Gitea repo and GitRepository CR
- Creates GitBranch CRs with headCommit set via status subresource patch
- Creates GitRepoSync CR and verifies the sync controller processes it

https://claude.ai/code/session_01QfFzqKQUsxxBsiZUhuJ3pG
2026-02-28 01:52:05 +00:00
3bbfe8b4d4
Merge pull request #3 from imjasonh/claude/git-k8s-control-plane-ksW2i
Improve e2e smoke test with real git server and push controller exercise
2026-02-27 20:43:04 -05:00
Claude
890c2b7ec9
Use gitea rootless image in e2e test
Gitea 1.21 refuses to run as root. The non-rootless image's
entrypoint switches to the git user, but kubectl exec still runs
as root, causing `gitea admin user create` to fail with:
  "Gitea is not supposed to be run as root"

Switch to gitea/gitea:1.21-rootless which runs as UID 1000,
and mount emptyDir volumes at /var/lib/gitea and /etc/gitea.

https://claude.ai/code/session_01QfFzqKQUsxxBsiZUhuJ3pG
2026-02-28 01:36:42 +00:00
Claude
de30422c67
Improve e2e Gitea initialization robustness
- Add explicit API readiness check inside the pod before running
  admin commands (readiness probe alone may pass before DB is ready)
- Split "Initialize Gitea" into separate steps for better failure
  diagnostics: "Create Gitea admin user" and "Create test repository"

https://claude.ai/code/session_01QfFzqKQUsxxBsiZUhuJ3pG
2026-02-28 01:27:31 +00:00
Claude
6db30c9fe3
Run build and e2e jobs concurrently
Remove `needs: build` from the e2e job so both jobs start
immediately instead of running in sequence.

https://claude.ai/code/session_01QfFzqKQUsxxBsiZUhuJ3pG
2026-02-28 01:23:05 +00:00
Claude
5eb8ab49bd
Fix YAML document separator in e2e heredoc
The `---` between the Deployment and Service was indented inside
the heredoc, so kubectl didn't recognize it as a document separator.
Split into two separate kubectl apply calls.

https://claude.ai/code/session_01QfFzqKQUsxxBsiZUhuJ3pG
2026-02-28 01:18:30 +00:00
Claude
aebe5c6c67
Improve e2e smoke test with real git server and push controller exercise
Replace the stub smoke test (which only verified CRD creation) with a
full end-to-end test that:

- Deploys Gitea as an in-cluster git server (emptyDir, auto-install)
- Initializes a test repository with an admin user and initial commit
- Creates GitRepository, GitBranch, and GitPushTransaction CRDs
- Verifies the push controller clones, pushes main to a new branch,
  and transitions the transaction to Succeeded
- Verifies the controller updates the GitBranch CR's headCommit
- Verifies the new branch actually exists on the git server

Also fixes a bug in the push controller's resolveAuth: Secret data
values are base64-encoded when accessed via the dynamic client, but
were being used directly without decoding, causing authentication
failures.

https://claude.ai/code/session_01QfFzqKQUsxxBsiZUhuJ3pG
2026-02-28 01:07:51 +00:00
fe3fe95983
Merge pull request #2 from imjasonh/claude/git-k8s-control-plane-ksW2i
Initial plan
2026-02-27 19:44:45 -05:00
Claude
cc391645e1
Change API group from git.k8s.io to git-k8s.imjasonh.com
The *.k8s.io group is protected in Kubernetes and requires an
api-approved.kubernetes.io annotation. Switch to a custom domain
to avoid the restriction entirely.

https://claude.ai/code/session_01QfFzqKQUsxxBsiZUhuJ3pG
2026-02-28 00:34:34 +00:00
Claude
2f694f6f1f
Add api-approved.kubernetes.io annotation to CRDs
The *.k8s.io API group is protected in Kubernetes and requires
the api-approved.kubernetes.io annotation on CRDs.

https://claude.ai/code/session_01QfFzqKQUsxxBsiZUhuJ3pG
2026-02-28 00:30:22 +00:00
Claude
ffc7c82ae4
Fix LeaderAware interface: use correct Promote signature
The Knative reconciler.LeaderAware interface requires:
  Promote(Bucket, func(Bucket, types.NamespacedName)) error
Our code had the wrong enqueue function signature using
(Bucket, string) error instead.

https://claude.ai/code/session_01QfFzqKQUsxxBsiZUhuJ3pG
2026-02-28 00:21:24 +00:00
6ddba9902d
Merge pull request #1 from imjasonh/copilot/add-gha-workflow-for-prs
Add GHA CI workflow: build, test, and e2e on KinD with Knative
2026-02-27 19:16:26 -05:00
Claude
9c51925fc7
Add .gitignore for Go binaries and IDE files
https://claude.ai/code/session_01QfFzqKQUsxxBsiZUhuJ3pG
2026-02-28 00:14:29 +00:00
copilot-swe-agent[bot]
75552e7c2c Add go test step to CI build job
Co-authored-by: imjasonh <210737+imjasonh@users.noreply.github.com>
2026-02-28 00:14:00 +00:00
copilot-swe-agent[bot]
75abbbbfcd Initial plan 2026-02-28 00:11:28 +00:00
Claude
314915b5dd
Add GitHub Actions CI with KinD e2e using chainguard-dev/actions
Two jobs:
- build: compiles all controller binaries and runs go vet
- e2e: spins up KinD cluster with Knative via chainguard-dev/actions,
  deploys CRDs and controllers with ko, verifies rollout, runs
  smoke test creating a GitRepository CR. On failure, collects
  kind-diag diagnostics as artifacts.

https://claude.ai/code/session_01QfFzqKQUsxxBsiZUhuJ3pG
2026-02-28 00:10:31 +00:00
Claude
8e65104201
Implement Git-as-K8s control plane with Knative controllers
Build a complete Kubernetes control plane for Git operations using Knative's
pkg framework, go-git for in-memory Git operations, and ko for builds.

Architecture:
- 4 CRDs: GitRepository, GitBranch, GitPushTransaction, GitRepoSync
- Push controller: atomic Git push via go-git with CAS (compare-and-swap)
- Sync controller: two-way sync with in-memory merge base calculation
- Resolver controller: automated 3-way merge for conflicted syncs
- In-cluster Gitea server for backing storage
- Full RBAC, ko-based deployments, and code-gen scaffolding

Note: go.sum needs generation via `go mod tidy` in an environment with
full internet access (knative.dev/pkg v0.0.0-20250520014526-44579e9ce5ed).

https://claude.ai/code/session_01QfFzqKQUsxxBsiZUhuJ3pG
2026-02-27 23:58:44 +00:00