{"id":51326821,"url":"https://github.com/odit-services/ghops","last_synced_at":"2026-07-01T19:02:28.443Z","repository":{"id":311194242,"uuid":"1042826081","full_name":"odit-services/ghops","owner":"odit-services","description":"A kubernetes operator for interacting with github - only supports deploy keys right now","archived":false,"fork":false,"pushed_at":"2025-10-02T08:24:30.000Z","size":197,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-28T02:10:27.012Z","etag":null,"topics":["deploy-keys","github","golang","kubernetes-operator"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/odit-services.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-08-22T16:31:58.000Z","updated_at":"2025-10-02T08:24:34.000Z","dependencies_parsed_at":"2025-08-22T19:13:28.335Z","dependency_job_id":"000b86eb-eaf7-478b-bdd4-f31ba09a6832","html_url":"https://github.com/odit-services/ghops","commit_stats":null,"previous_names":["odit-services/ghops"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/odit-services/ghops","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odit-services%2Fghops","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odit-services%2Fghops/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odit-services%2Fghops/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odit-services%2Fghops/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/odit-services","download_url":"https://codeload.github.com/odit-services/ghops/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/odit-services%2Fghops/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35019037,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-01T02:00:05.325Z","response_time":130,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["deploy-keys","github","golang","kubernetes-operator"],"created_at":"2026-07-01T19:02:27.902Z","updated_at":"2026-07-01T19:02:28.437Z","avatar_url":"https://github.com/odit-services.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ghops\n\n\u003e We are not related to GitHub in any way other than using their platform. All rights to the name \"GitHub\" are owned by GitHub, Inc.\n\n![GitHub Tag](https://img.shields.io/github/v/tag/odit-services/ghops?style=for-the-badge\u0026logo=git) ![GitHub Release Date](https://img.shields.io/github/release-date/odit-services/ghops?style=for-the-badge\u0026label=Latest%20release) ![GitHub go.mod Go version](https://img.shields.io/github/go-mod/go-version/odit-services/ghops?style=for-the-badge\u0026logo=go) ![GitHub License](https://img.shields.io/github/license/odit-services/ghops?style=for-the-badge) ![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/odit-services/ghops/lint.yml?style=for-the-badge\u0026label=Checks)\n\nDoes the \"GH\" in \"ghops\" stand for GitHub? Maybe, maybe not. Maybe it stands for \"ghost hops\" 👻🍺 or \"Git Happyness\".\n\nAll we know is that this is a Kubernetes operator to manage resources on GitHub.\n\n## Description\n\n### Supported resources\n\n- `DeployKey`: A GitHub deploy key for a repository.\n\n## Deploy the operator\n\n### Prerequisites\n\n- `kubectl` version v1.11.3+ (or a reasonably recent client compatible with your cluster).\n- Access to a Kubernetes v1.11.3+ cluster.\n\n### Create the GitHub credentials secret\n\nThis operator expects a Kubernetes secret that provides a GitHub access token used to call the GitHub API.\n\n1. Create a GitHub fine-grained personal access token with the following repository permissions (scope as needed for the target repositories/organization):\n   - Repository: Read metadata\n   - Repository: Read and write administration\n\n2. Create the Kubernetes secret in the namespace where the operator expects it (example: `ghops-system`):\n\n```sh\nkubectl create namespace ghops-system || true\nkubectl create secret generic -n ghops-system ghops --from-literal=GITHUB_TOKEN=\u003cyour-github-token\u003e\n```\n\nNote: If you deploy into a different namespace update the manifests or the operator configuration accordingly.\n\n### Deploy the full operator\n\nThis repository contains manifests that install CRDs, RBAC and the controller.\n\n```sh\n# Deploy the latest version from the repository\nkubectl apply -f https://raw.githubusercontent.com/odit-services/ghops/main/config/deployment/full.yaml\n\n# Or deploy a specific tag\nkubectl apply -f https://raw.githubusercontent.com/odit-services/ghops/\u003ctag\u003e/config/deployment/full.yaml\n```\n\n## Development\n\n### Local prerequisites\n\n- Go 1.25.0+\n- Docker (for building images)\n- `kubectl` and access to a Kubernetes cluster (kind / minikube / remote cluster)\n\n### Build and push images\n\nThis project includes Make targets for building and publishing images.\n\nSingle-arch (build for the host architecture):\n\n```sh\nmake docker-build docker-push IMG=ghcr.io/odit-services/ghops:tag\n```\n\nMulti-arch (build for linux/amd64 and linux/arm64):\n\n```sh\nmake docker-build-multiarch IMG=ghcr.io/odit-services/ghops:tag\n```\n\nImportant note about multi-arch builds and QEMU:\n- If you are building multi-arch images on a host that is not amd64 (for example an Apple Silicon / arm64 host) and you request linux/amd64 images, Docker will use QEMU emulation. The Go runtime (and other native toolchains) can crash under incorrect or unregistered QEMU binfmt support and you'll see runtime panics like `fatal error: taggedPointerPack` during `go mod download`.\n\nIf you see such a panic in CI (or locally when building inside an emulated image), resolve it by either:\n\n1. Registering QEMU/binfmt on the host (self-hosted runner) once with a privileged container:\n\n```powershell\n# Run on the runner host (PowerShell)\ndocker run --rm --privileged multiarch/qemu-user-static --reset -p yes\n```\n\n2. Building on a native amd64 runner instead of relying on emulation (for CI use `runs-on: ubuntu-latest` or another amd64 runner).\n\n3. Building only for the host's architecture (remove the linux/amd64 platform when on arm64 hosts).\n\nEither registering binfmt on the host or using a native builder will prevent the Go runtime emulation panic.\n\n### Buildx and caching (CI)\n\nThe included GitHub Actions workflow uses `docker/setup-qemu-action` and `docker/setup-buildx-action` then `docker/build-push-action` with `platforms:` set to `linux/amd64,linux/arm64`. If you run this on a self-hosted runner you must ensure the runner host has QEMU/binfmt registered (see above) or run the workflow on an AMD64 runner.\n\n### Run the operator locally (development mode)\n\nTo run the controller locally against a cluster (useful for debugging):\n\n```sh\n# Run the manager locally (points to local kubeconfig)\nmake run\n```\n\nThis will build the binary and run the controller using the local kubeconfig context.\n\n### Tests\n\n- Unit tests (Go): `go test ./...`\n- Integration / e2e: see `test/e2e` and the `Makefile` targets. E2E tests assume a Kubernetes test environment is available.\n\n## Troubleshooting\n\n- QEMU / `taggedPointerPack` runtime panic during `go mod download` while building an amd64 image on an arm64 host: register QEMU on the runner host or use a native amd64 runner (see the QEMU note above).\n- Image pull / RBAC issues: ensure the operator service account has the correct RBAC permissions and that the image is published in a registry accessible to your cluster.\n\n## Examples / Samples\n\nSample CRs are available under `config/samples/` — apply them to create `DeployKey` resources for testing.\n\n```sh\nkubectl apply -k config/samples/\n```\n\n## Contributing\n\nContributions are welcome. Typical workflow:\n\n1. Fork the repository\n2. Create a branch (e.g. `git checkout -b feat/some-feature`)\n3. Implement and test your changes\n4. Commit and push your branch\n5. Open a pull request\n\nPlease include tests for new features or bug fixes and make sure linters pass (`make lint` / CI).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fodit-services%2Fghops","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fodit-services%2Fghops","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fodit-services%2Fghops/lists"}