Add gitops-argo-cd agent skill

Consolidates the five cogarchhubgitops-* source skills into one skill with
scope routing: ArgoCD Applications, Copier templates, Helm values, environment
answer files, and the end-to-end resource-addition walkthrough.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-29 23:48:32 +03:00
co-authored by Claude Opus 5
parent 89a9cf9320
commit 50d746d03f
11 changed files with 1615 additions and 1 deletions
+161
View File
@@ -0,0 +1,161 @@
# CogArchHubGitOps — Reference Implementation
The concrete instance of every pattern in this skill. Read when working in
`CogArchHubGitOps/` specifically, or as a worked example when standing up a new GitOps
repository from the generic rules.
The generic rules live in `SKILL.md` and the other reference files; this file records only
what is specific to this repository.
---
## 1. Repositories
```text
CogArchHubGitOps/ ← target repository (the Copier template + answer files)
CogArchHubGitOps-code-agent/ ← code-agent repository (skills and agent tooling)
```
Work described by this skill lands in the **target** repository. Deployed environments are
rendered copies of it.
---
## 2. Layout
```text
CogArchHubGitOps/
├── copier.yaml
├── cluster/
│ ├── argocd/
│ │ ├── application.yaml.jinja # 000-root app-of-apps
│ │ ├── {{ '200-operators' if … }}/
│ │ ├── {{ '300-configuration' if … }}/
│ │ ├── {{ '400-databases' if … }}/
│ │ ├── {{ '700-advantage-mcp' if … }}/
│ │ └── {{ '800-applications' if … }}/
│ └── resources/
│ └── <mirrored conditional directories>/
└── <env>/
└── copier-answers.yaml
```
`cluster/argocd/application.yaml.jinja` is the root app named `000-root`. It watches
`cluster/argocd/` recursively and creates every child Application it finds.
---
## 3. Bands in use
| Band | Domain | Concrete contents |
|---|---|---|
| 000 | Root | `000-root` app-of-apps |
| 200–299 | Operators | External Secrets Operator (ESO), CloudNativePG (CNPG), Redis |
| 300–399 | Cluster configuration | ClusterSecretStore and related config |
| 400–499 | Databases | PostgreSQL clusters, Redis clusters |
| 700–799 | Advantage / MCP | MCP servers, AI agent workloads |
| 800–899 | Platform applications | notification, integration, agent-service |
ESO occupies a contiguous sub-group inside the 2xx band — operator group, subscription, and
configuration each take their own number (`210`, `213`, `215`), so a related set stays
readable in a sorted directory listing. Follow the same grouping habit for new operators.
---
## 4. Feature flags
| Variable | Gates |
|---|---|
| `operators.is_enabled` | The whole `200-operators` band |
| `operators.eso_is_enabled` | ESO operator group, subscription, configuration |
| `operators.cnpg_is_enabled` | CNPG operator group and subscription |
| `operators.redis_is_enabled` | Redis operator group and subscription |
| `configuration.is_enabled` | The whole `300-configuration` band |
| `configuration.cluster_secret_store_is_enabled` | ClusterSecretStore |
| `databases.is_enabled` | The whole `400-databases` band |
| `advantage_mcp.is_enabled` | The whole `700-advantage-mcp` band |
| `applications.is_enabled` | The whole `800-applications` band |
Sub-flags are named `<sub>_is_enabled` and live flat under the domain object — `operators.eso_is_enabled`,
not `operators.eso.is_enabled`. Keep new flags consistent with that shape.
---
## 5. ArgoCD conventions
- ArgoCD runs in the `openshift-gitops` namespace (OpenShift GitOps operator), so every
`Application` sets `metadata.namespace: openshift-gitops`.
- `spec.project` is `default`.
- `spec.destination.server` is `https://kubernetes.default.svc` (in-cluster).
- `prune: true` and `selfHeal: true` are on for all apps.
---
## 6. Application global settings
`applications.global` in each answer file provides the settings shared by all 8xx services:
```yaml
applications:
global:
is_internal: "false"
enable_instana: "false"
ca_secret_name: ca-secret
ca_env: <env-name>
maintenance: "false"
host: <public-hostname>
ca_host: <internal-hostname>
suffix_url: <path-suffix>
node_selector_app: <node-label>
mongo:
host: <mongodb-host>
port: "27017"
user: <mongodb-user>
redis:
host: <redis-host>
port: "6379"
max_retries: "3"
neo4j:
url: <neo4j-bolt-url>
user: <neo4j-user>
```
The datastore blocks (`mongo`, `redis`, `neo4j`) carry connection coordinates only. Credentials
come from ESO-managed secrets at runtime, which is why `ca_secret_name` and the
ClusterSecretStore in the 3xx band are prerequisites for the 8xx band to work at all.
`is_internal`, `enable_instana`, and `maintenance` are **quoted strings**, not YAML booleans —
they reach the Helm chart as strings. Feature flags in the same file are real booleans. See
`environments.md` §4.
---
## 7. Private registry
Workload images pull from a private registry using the pre-existing secret `storage-images`:
```yaml
imagePullSecrets:
- name: "storage-images"
```
The secret is expected to exist in the target namespace already; it is not created by these
templates. A new namespace therefore needs the secret provisioned before its first sync, or
pods stall on `ImagePullBackOff`.
---
## 8. Ordering dependencies
The bands are numbered so a full bootstrap converges in ascending order:
1. **2xx operators** install the CRDs everything else depends on (ESO, CNPG, Redis).
2. **3xx configuration** creates the ClusterSecretStore that supplies secrets.
3. **4xx databases** create instances using the operators' CRDs.
4. **7xx / 8xx workloads** consume the databases and secrets.
ArgoCD does not enforce this ordering — the app-of-apps creates all children at once and each
syncs independently. The numbering is a convention that makes the intended order legible, and
failing apps in a fresh cluster usually resolve themselves once the band they depend on has
finished syncing. Do not add sync-waves to force ordering without discussing it first; retry
plus eventual consistency is the assumed model here.