nubenetes/jenkins-2026-gitops-config
GitHub: nubenetes/jenkins-2026-gitops-config
面向 GKE 平台的 GitOps 配置仓库,通过 ArgoCD 管理 JHipster 微服务部署、CNPG 高可用 Postgres、零信任网络策略和 OTel 可观测性的声明式目标状态。
Stars: 0 | Forks: 0
# jenkins-2026-gitops-config
## 目录
- [Golden Path IDP 基础设施](#golden-path-idp-infrastructure)
- [与 `jenkins-2026` 的关系](#relationship-to-jenkins-2026)
- [仓库布局](#repository-layout)
- [镜像标签如何更新](#how-image-tags-are-updated)
- [ArgoCD Applications](#argocd-applications)
- [`microservices` ApplicationSet](#microservices-applicationset)
- [独立 Applications](#standalone-applications)
- [Helm Chart: `helm/microservices`](#helm-chart-helmmicroservices)
- [关键 values schema](#key-values-schema)
- [环境](#environments)
- [Postgres (CNPG)](#postgres-cnpg)
- [NetworkPolicies (零信任)](#networkpolicies-zero-trust)
- [分支策略](#branch-strategy)
- [为什么只有 `main` 分支?](#why-only-the-main-branch)
- [`develop` 分支有意义吗?](#would-a-develop-branch-make-sense)
- [OTel 自动插桩](#otel-auto-instrumentation)
- [相关仓库](#related-repositories)
- [设置与 Fork 指南](#setup--forking-guide)
- [发布与版本策略](#release--versioning-strategy)
- [Git 历史与隐私](#git-history-and-privacy)
- [禁止手动编辑](#do-not-edit-manually)
## Golden Path IDP 基础设施
此仓库定义了 GKE 上现代化**内部开发者平台 (IDP)** 架构的 GitOps 状态。
### 解耦的核心组件
为顺应 2026 年云原生最佳实践,所有平台基础设施 manifest 都与 CI 构建执行解耦,并通过 GitOps 进行管理:
* **弹性节点自动配置 (NAP)**:GKE 原生 (GA) 节点自动配置,由主仓库 `infrastructure/compute-classes/` 下的自定义 `ComputeClass` 驱动,为临时构建 agent 自动创建 **Spot、缩放至零** 的节点池(这是 Google 支持的 Karpenter 等效方案——目前没有适用于 GCP 的生产级 Karpenter provider)。
* **GKE Gateway API 路由**:Jenkins 和 Headlamp 的安全 HTTPS 流量路由映射在 `infrastructure/gateway/` 下,使用原生 `Gateway`、`HTTPRoute` 和 `BackendTLSPolicy`(到 pod 的零信任 TLS)。
* **工作负载感知调度与安全**:为 Headlamp UI 用户映射 K8s v1.36 `PodGroup` (Gang scheduling) 和 `ConstrainedImpersonation` 策略。
## 与 `jenkins-2026` 的关系
```
+--------------------------------------------------------------------+
| nubenetes/jenkins-2026 (infra repo) |
| |
| scripts/ --- bootstrap cluster, install Jenkins/ArgoCD |
| jenkins/ --- JCasC, Job DSL, shared pipeline library |
| helm/ --- Helm charts for supporting services |
| argocd/ --- ApplicationSet/Application manifests |
| observability/ --- OTel collector, Grafana dashboards |
+------------------------+-------------------------------------------+
| scripts/08.5-argocd.sh registers
| THIS repo as ArgoCD source
v
+--------------------------------------------------------------------+
| nubenetes/jenkins-2026-gitops-config (this repo) |
| |
| argocd/ --- Application / AppSet manifests (deployed |
| FROM infra repo, stored here for clarity) |
| helm/microservices/--- Helm chart + env values files |
| values-stable.yaml<- active CI engine writes tags |
+--------------------------------------------------------------------+
```
| 操作 | 执行者 | 位置 |
|--------|------------|-------|
| 引导集群并安装 ArgoCD | `scripts/08.5-argocd.sh` | `jenkins-2026` |
| 在 ArgoCD 中注册此仓库 | `scripts/08.5-argocd.sh` | `jenkins-2026` |
| 构建并推送容器镜像 | 活跃的 CI 引擎 —— Jenkins (`MicroservicesPipeline`) **或** Tekton (`ci.engine=tekton`) | `jenkins-2026/vars/` 或 `jenkins-2026/tekton/` |
| **将镜像标签写入 values 文件** | 活跃的 CI 引擎 —— Jenkins (`vars/microservicesDeploy.groovy`) **或** Tekton (`gitops-update` task) | **此仓库** |
| 检测标签变更并部署到集群 | ArgoCD (自动 sync) | cluster |
| Grafana dashboard 推送 | `scripts/07-grafana-dashboards.sh` | `jenkins-2026` |
## 仓库布局
```
jenkins-2026-gitops-config/
├── argocd/
│ ├── microservices-appset.yaml # ApplicationSet: generates microservices-stable Application
│ ├── microservices-project.yaml # AppProject: scope for the microservices Application
│ ├── headlamp-app.yaml # Application: Headlamp Kubernetes UI
│ ├── pgadmin-app.yaml # Application: pgAdmin 4 Postgres UI
│ └── cnpg-app.yaml # Application: CloudNative-PG Operator (CNPG)
└── helm/
└── microservices/
├── Chart.yaml # Helm chart metadata
├── values.yaml # Base defaults / schema documentation
├── values-stable.yaml # Stable env (namespace: microservices, branch: main)
├── values-develop.yaml # Dormant develop-tier values (only used if a develop track is re-enabled)
└── templates/
├── deployment.yaml # Deployment per service in .Values.services
├── service.yaml # ClusterIP Service
├── ingress.yaml # Ingress (enabled per platform)
├── route.yaml # Gateway API HTTPRoute / OpenShift Route (per platform)
├── instrumentation.yaml # OTel Instrumentation CR (auto-instruments JVM services)
├── postgres.yaml # CNPG Cluster & Pooler CR per service
├── networkpolicies.yaml # Zero-trust: default-deny + gateway / microservice / postgres policies
├── logback-configmap.yaml # ECS-JSON structured-logging config
├── gateway-cache-patch.yaml # gateway Hazelcast cache config
├── limitrange.yaml # Default container resource limits
├── resourcequota.yaml # Namespace resource cap
└── _helpers.tpl # Shared template helpers
```
## 镜像标签如何更新
**活跃的 CI 引擎**——默认为 Jenkins,或当 infra 仓库中设置 `ci.engine=tekton` 时的 **Tekton**——在每次成功构建后更新此处的镜像标签。使用 Jenkins 时,它是 `microservicesDeploy.groovy` 共享库步骤;使用 Tekton 时,它是等效的 `gitops-update` task。两者都会 clone 此仓库,在 values 文件中提升标签,并推送到 `main`:
```
sequenceDiagram
autonumber
actor Jenkins as Active CI Pipeline (Jenkins or Tekton)
participant GitOps as jenkins-2026-gitops-config (Git)
participant ArgoCD as ArgoCD Server
participant Cluster as Kubernetes Cluster
Jenkins->>GitOps: 1. Clone GitOps repo
Jenkins->>GitOps: 2. Update tag in values-stable.yaml
Jenkins->>GitOps: 3. git commit & push tag
Jenkins->>ArgoCD: 4. Sync microservices-stable application
ArgoCD->>Cluster: Reconcile manifests to new image tag
Cluster-->>ArgoCD: Pods running & Healthy
ArgoCD-->>Jenkins: Sync finished & Healthy
```
更新后的 [`values-stable.yaml`](helm/microservices/values-stable.yaml)(或 [`values-develop.yaml`](helm/microservices/values-develop.yaml))是 **CI 引擎在此仓库中唯一修改的文件**——无论引擎是 Jenkins 还是 Tekton 都一样。其他所有内容由人工或 infra 仓库中的 `scripts/08.5-argocd.sh` 管理。(Tekton 本身由 ArgoCD 从 **infra** 仓库的 `tekton/` + `argocd/tekton/` 进行 GitOps 管理,而不是这里——此仓库仅存放部署目标,这与 CI 引擎无关。参见 [`docs/403-TEKTON.md`](https://github.com/nubenetes/jenkins-2026/blob/main/docs/403-TEKTON.md).)
## ArgoCD Applications
所有四个 Applications 均由 infra 仓库中的 **`scripts/08.5-argocd.sh` 安装**。manifest 存放在这里,以便 ArgoCD 可以通过 `microservices` AppProject 对它们进行自我修复。
### `microservices` ApplicationSet
生成 stable application:
| 生成的 App | Namespace | Values 文件 | 分支 |
|---------------|-----------|-------------|--------|
| `microservices-stable` | `microservices` | [`values-stable.yaml`](helm/microservices/values-stable.yaml) | `main` |
它使用 `prune: true` + `selfHeal: true`。仅生成 **stable** application;develop 层级**默认禁用**(仅当在 infra 仓库中设置了 `microservices.developTrackEnabled` 时,AppSet 才会生成 `develop` 元素)。休眠的 [`values-develop.yaml`](helm/microservices/values-develop.yaml) 保留在 chart 中,以便在该 track 重新启用时使用——参见[分支策略](#branch-strategy)。
### 独立 Applications
| Application | 源 | 目标 Namespace | 备注 |
|-------------|--------|-----------------|-------|
| `headlamp` | `helm/headlamp/values.yaml` (infra 仓库) | `headlamp` | Kubernetes UI, Google OIDC |
| `pgadmin` | `helm/pgadmin/` (infra 仓库) | `pgadmin` | Postgres 管理 UI |
| `cnpg-operator` | `cloudnative-pg/cloudnative-pg` | `cnpg-system` | CNPG, ServerSideApply |
## Helm Chart: `helm/microservices`
单个 chart 渲染了 `values.services.*` 中定义的所有服务。每个服务条目指定其镜像标签和特定于服务的配置;chart 为每个服务生成一个 `Deployment`、`Service`、`Instrumentation` CR 和 `PostgresCluster` CR。
### 关键 values schema
```
global:
platform: gke # gke | eks | aks | openshift
namespace: microservices # overridden per-env by values-stable.yaml
env: stable # "stable" → deployment.environment OTel attribute
registry: ghcr.io/nubenetes/jenkins-2026-microservices
imagePullSecret: ghcr-credentials
otel:
collectorEndpoint: http://otel-collector-gateway.observability.svc.cluster.local:4317
services:
gateway:
type: java
image:
repository: gateway
tag: main # ← Jenkins writes a new SHA here on every build
port: 8080
healthPath: /management/health
resources:
requests: { cpu: 100m, memory: 256Mi }
limits: { cpu: 500m, memory: 512Mi }
env:
- name: SPRING_PROFILES_ACTIVE
value: prod,api-docs
```
### 环境
| 文件 | `env` | `namespace` | ArgoCD App |
|------|-------|-------------|-----------|
| [`values-stable.yaml`](helm/microservices/values-stable.yaml) | `stable` | `microservices` | `microservices-stable` |
`env` 值将成为已部署服务发出的每条 trace/metric/log 的 `deployment.environment` OTel 资源属性,从而支持在 Grafana dashboards 中进行环境过滤。
## Postgres (CNPG)
`.Values.services` 中的每个服务都会获得由 [`templates/postgres.yaml`](helm/microservices/templates/postgres.yaml) 模板化的 CNPG `Cluster` 和 `Pooler` CR(模板无条件遍历**每个**服务;特定于服务的 `postgres.storageSize` / `walStorageSize` 是仅有的可选配置项)。CloudNative-PG Operator(通过 `cnpg-operator` Application 安装)将这些 CR 协调为:
- 高可用的 **PostgreSQL 18.3** 数据库层——**3 个实例**,可用区反亲和性,动态主节点提升。镜像被明确**锁定** (`spec.imageName`,默认为 `ghcr.io/cloudnative-pg/postgresql:18.3-system-trixie`,可通过 `global.postgresImage` 覆盖),因此数据库版本是可重现的;请谨慎提升版本
- 通过原生 PgBouncer pooler 部署管理的连接池
- 针对 Google Cloud Storage (GCS) 的自动化 Barman Object Store 备份
- 一个通过 `SPRING_DATASOURCE_URL` 或 `SPRING_R2DBC_URL` 注入到服务 pod 中的 secret `postgres--app`
总共配置了两个集群——stable 环境中的每个服务一个:
| Cluster | Namespace |
|---------|-----------|
| `postgres-gateway` | `microservices` |
| `postgres-jhipstersamplemicroservice` | `microservices` |
## NetworkPolicies (零信任)
[`templates/networkpolicies.yaml`](helm/microservices/templates/networkpolicies.yaml) 为 `microservices`
namespace 提供了默认拒绝姿态(由 infra 仓库中的 GKE **Dataplane V2 / Cilium-eBPF** 强制执行)。四个
策略:
| 策略 | 应用于 | 关键 ingress | 关键 egress |
|---|---|---|---|
| `default-deny` | 所有 pod | 无 | 仅 CoreDNS (`kube-system:53`) |
| `gateway-policy` | `gateway` pod | 来自 Gateway/LB 的 **8080** | jhipster **8081**,其 Postgres **5432**,OTLP `observability` **4317/4318** |
| `microservice-policy` | `jhipstersamplemicroservice` pod | 来自 `gateway` pod **以及** **`tekton-ci` + `jenkins`** namespaces 的 **8081**(以便 CI 冒烟测试可以访问 `/management/health`) | 其 Postgres **5432**,OTLP **4317/4318** |
| `postgres-policy` | `cnpg.io/cluster` pods | 来自 app pods、`pgadmin` ns、集群内部的 **5432** | CNPG replication + **443** |
8081 端口上的 CI-namespace ingress 让 Jenkins/Tekton 冒烟阶段能够在强制执行策略下访问
微服务(参见 [`jenkins-2026` docs/501](https://github.com/nubenetes/jenkins-2026/blob/main/docs/501-PLATFORM_OPERATIONS.md#networkpolicy-matrix)).
## 分支策略
GitOps 仓库使用 `main` 分支来设定 `microservices-stable` 部署的目标。活跃的 CI 引擎(Jenkins 或 Tekton)更新 `main` 上的 [`helm/microservices/values-stable.yaml`](helm/microservices/values-stable.yaml) 以提升新的镜像版本。`develop` 层级**默认禁用**(仅生成 `microservices-stable`);其 [`values-develop.yaml`](helm/microservices/values-develop.yaml) 在 chart 中保持休眠状态,仅在 infra 仓库中设置 `microservices.developTrackEnabled` 时才会激活。
### 为什么只有 `main` 分支?
1. **单一环境目标**:在这个统一模型中,develop 层级默认禁用,仅保留一个活跃的目标 namespace (`microservices`);可以重新启用 develop track(见下文)。
2. **简化提升**:Jenkins CI pipeline 直接将镜像标签写入 GitOps 仓库 `main` 分支的 [values-stable.yaml](helm/microservices/values-stable.yaml) 中。
### `develop` 分支有意义吗?
是的,但**前提是您要恢复多环境部署模型**(例如,dev/staging 与 stable namespaces):
* **测试基础设施变更**:如果开发者需要在将 Helm chart 更新(例如,资源限制、新的环境变量或 sidecar 添加)提升到 stable (`main`) 之前,在沙箱 (`develop`) namespace 中进行测试,他们会先将更改推送到 GitOps 仓库的 `develop` 分支进行验证。
* **追踪并行代码轨**:如果上游仓库同时从 `develop` 分支(开发构建)和 `main` 分支(stable 发布)进行构建,Jenkins 会将开发标签提交到 GitOps `develop` 分支上的 [`values-develop.yaml`](helm/microservices/values-develop.yaml)(sync 到 dev namespace),并将 stable 标签提交到 GitOps `main` 分支上的 [values-stable.yaml](helm/microservices/values-stable.yaml)(sync 到 stable namespace)。
### `main` 分支保护 —— CI 可写(不要要求 pull request)
`main` 是**直接推送**的,因此 CI 的 *GitOps 更新*步骤可以无人值守地推送镜像标签提升。实际的 `main` 保护(GitHub -> Settings -> Branches):
| 设置 | 值 | 原因 |
|---|---|---|
| 合并前要求 pull request | **off** | CI 直接将标签推送到 `main` (`git push origin main`)。Require-PR 会拒绝 PAT 推送(管理员 PAT **不会**绕过保护),并且**会卡住每一次部署**。 |
| 要求的 status checks | **无** | 镜像标签提升是机器生成的——没有任何东西可以作为限制条件。 |
| 包含管理员 | **off** | — |
| 允许强制推送 | **off** | `main` 上的历史记录受。 |
| 允许删除 | **off** | `main` 不能被删除。 |
- **允许 -> `main`:**直接推送(CI 的 PAT,或人工推送 chart/values 编辑)。
- **禁止 -> `main`:**强制推送,分支删除。
## OTel 自动插桩
[`templates/instrumentation.yaml`](helm/microservices/templates/instrumentation.yaml) 模板创建了一个 `Instrumentation` CR(由 OTel Operator 管理,通过 `scripts/03-observability.sh` 安装)。这会通过 mutating webhook 自动将 OTel Java agent 附加到每个 Spring Boot 服务 pod——无需更改应用程序代码或 Docker 镜像。
agent 配置如下:
- `OTEL_EXPORTER_OTLP_ENDPOINT` → 集群内的 OTel Collector gateway
- `OTEL_RESOURCE_ATTRIBUTES` → `service.name`, `service.namespace`, `deployment.environment`
- `OTEL_INSTRUMENTATION_LOGBACK_APPENDER_ENABLED=true` → 将 `trace_id` 注入到日志行中以进行 Loki 关联
## 相关仓库
| 仓库 | 角色 |
|-----------|------|
| [`nubenetes/jenkins-2026`](https://github.com/nubenetes/jenkins-2026) | **Infra 仓库** —— 集群引导,Jenkins,ArgoCD,Observability,共享 pipeline 库 |
| [`nubenetes/jenkins-2026-gitops-config`](https://github.com/nubenetes/jenkins-2026-gitops-config) | **此仓库** —— GitOps 状态:Helm chart,env values,ArgoCD manifests |
| [`nubenetes/jhipster-sample-app-gateway`](https://github.com/nubenetes/jhipster-sample-app-gateway) | **App 源码** —— JHipster **gateway** (Java / Spring Boot;它*提供* Angular SPA 服务,它本身不是 Angular 应用),构建为 `gateway` 服务。上游 [`jhipster/jhipster-sample-app-gateway`](https://github.com/jhipster/jhipster-sample-app-gateway) 的 fork(该 fork 包含一个真实的 `develop` 分支,用于基于分支的晋升)。 |
| [`nubenetes/jhipster-sample-app-microservice`](https://github.com/nubenetes/jhipster-sample-app-microservice) | **App 源码** —— JHipster 后端**微服务**,构建为 `jhipstersamplemicroservice`。上游 [`jhipster/jhipster-sample-app-microservice`](https://github.com/jhipster/jhipster-sample-app-microservice) 的 fork。 |
## 设置与 Fork 指南
如果您正在为自己或您的组织设置此 PoC,您必须将此配置仓库与主要的[基础设施仓库](https://github.com/nubenetes/jenkins-2026)一起 fork。
1. **Fork 仓库**:将此仓库 (`jenkins-2026-gitops-config`) fork 到您的 GitHub 账户/组织。
2. **更新主 Infra 配置**:在您的 infra 仓库 fork (`jenkins-2026`) 中,更新 `config/config.yaml`,将 `jenkins.selfRepoUrl` 和 `microservices.git.org` 指向您自己的 fork。
3. **配置 Git 凭据**:确保您在 infra 仓库的 Actions 设置中设置了 `GIT_USERNAME` 和 `GIT_TOKEN` secrets,因为 Jenkins pipeline 会动态 clone 并将更新的镜像标签提交到此 GitOps 仓库。
## 发布与版本策略
此 GitOps 配置仓库的发布和标签与主要的[基础设施仓库](https://github.com/nubenetes/jenkins-2026)保持同步:
* **Git 标签**:基础设施栈的每次 stable 发布(例如 `v0.9.0`)都会在两个仓库中应用匹配的标签 `v0.9.0`。
* **发布流程**:
1. 在 `develop` 上测试基础设施修改和 Helm chart 配置。
2. 打开 Pull Request 将 `develop` 合并到 `main`。
3. 合并后,起草 GitHub Release 说明更改,并将标签推送到远程。
## Git 历史与隐私
## 禁止手动编辑
对于所有其他基础设施更改——Jenkins 配置、observability stack、ArgoCD 设置、Headlamp/pgAdmin 的 Helm charts——请在 [`nubenetes/jenkins-2026`](https://github.com/nubenetes/jenkins-2026) 中进行更改,并重新运行相关的脚本或 GitHub Actions workflow。
标签:ArgoCD, CNPG, GitOps, GKE, Helm, 内部开发者平台, 子域名突变, 测试用例, 用户代理