# 预生产分支 → Harbor → ACK 生产 K8S 流水线

Harbor 宿主机：**39.105.153.68**（Web：`http://39.105.153.68/harbor/`）。Jenkins 示例：**39.106.135.88:30003**。ACK：**alien-ack-cluster**（华北2 北京）。

本目录支持 **单服务发版** 与 **整体/多选发版**（Harbor + ACK）；与宿主机 `docker compose` 晋升流水线（`Jenkinsfile-prod-promote-from-uat.groovy`）并行存在，互不替代，直到 ACK 全量切流。

---

## 常见问题（Harbor / 目录结构 / 发版粒度）

### Harbor 要不要在 Web 界面手工操作？

**日常发版不需要。** 流水线在 `k8s-produ-lib.groovy` 里自动完成：

1. `docker login 39.106.135.88`（凭据 `harbor-robot-alien`）
2. `docker build` → 打 tag `39.106.135.88/alien/<服务名>:<tag>`
3. `docker push` 到 Harbor
4. `kubectl set image` 让 ACK 拉同一 tag

运维**仅需一次性**在 Harbor Web（或 API）完成：`alien` 项目、机器人账号、（可选）镜像保留策略。之后查镜像/删旧 tag/排障时仍可打开 Harbor UI，**不是发版必经步骤**。

### `_shared/k8s-produ-lib.groovy` 是什么？能单独部署吗？

| 文件 | 角色 | Jenkins Script Path 是否指向它 |
|------|------|-------------------------------|
| `produ/<服务>/Jenkinsfile` | **入口**（Jenkins 只认这个名字） | **是**，每个 Job 指向各自路径 |
| `_shared/k8s-produ-lib.groovy` | **共享函数库**（checkout、mvn、Harbor、kubectl） | **否**，由入口 `load '.../k8s-produ-lib.groovy'` 引用 |
| `_shared/service-registry.groovy` | 七个服务列表 + whole/multi 筛选 | 否，供 `whole/Jenkinsfile` 使用 |

每个微服务 Job 仍是 **单独一条流水线**（例如只构建 gateway）；共享库是为避免 7 份重复脚本，**不代替** `Jenkinsfile`。

### 既要单独发布，又要整体发布？

| Jenkins Job（建议名） | Script Path | 粒度 |
|----------------------|-------------|------|
| `gateway-k8s` … `dining-k8s` | `docs/jenkins/produ/<prodDir>/Jenkinsfile` | **仅该服务**（Maven `-pl alien-xxx`） |
| `alien-cloud-k8s-whole` | `docs/jenkins/produ/whole/Jenkinsfile` | **whole / single / multi**（参数 `DEPLOY_MODE`，语义同 prod-promote） |

整体 Job 一次 `mvn package` 打全仓库，再按选中服务依次 build/push/deploy；单服务 Job 只打对应模块，适合热修复单个服务。

---

## 一、Jenkins 任务如何组织（对应你截图中的「新建任务」）

### 1. 是否选「文件夹」？

**是，推荐选「文件夹」。**

| 类型 | 用途 |
|------|------|
| **文件夹** | 独立命名空间，其下可建多个 **流水线** 任务，例如 `gateway-k8s`、`store-k8s`，名称可与其他视图重复 |
| **流水线** | 真正执行构建的 Job，每个微服务一条 |
| **多分支流水线** | 按 Git 分支自动建子 Job；若预生产固定一条分支（如 `uat-20260202`），用普通流水线 + 参数 `GIT_BRANCH` 更简单 |

建议结构：

```text
alien-cloud-produ-K8S-from-uat/     ← 文件夹（你截图中的名称）
├── alien-cloud-k8s-whole/          ← 流水线，Script Path: docs/jenkins/produ/whole/Jenkinsfile（整体/多选）
├── gateway-k8s/                    ← 流水线，Script Path: docs/jenkins/produ/gateway/Jenkinsfile
├── store-k8s/
├── second-k8s/
├── store-platform-k8s/
├── lawyer-k8s/
├── job-k8s/
└── dining-k8s/
```

**不要**在文件夹里再选「文件夹」类型去套微服务——微服务一级用 **流水线** 即可。

### 2. 是否用 Pipeline script from SCM？

**可以，且推荐。**

每个 `*-k8s` 流水线 Job 配置：

1. **流水线** → **定义**：Pipeline script from SCM  
2. **SCM**：Git，仓库 `http://8.152.195.41:3000/alien/alien_cloud`（与现网一致）  
3. **分支**：`*/uat-20260202` 或 `*/你的预生产分支`  
4. **Script Path**（按服务不同）：
   - gateway：`docs/jenkins/produ/gateway/Jenkinsfile`
   - store：`docs/jenkins/produ/store/Jenkinsfile`
   - … 见下表  

5. **凭据**：`zhanghaomimapingzheng`（与 UAT 流水线一致）  
6. **构建触发**：可选手动；稳定后加「上游 UAT 构建成功」触发  

与 `Jenkinsfile-prod-promote-from-uat.groovy` 的关系：

| 维度 | prod-promote-from-uat | produ K8S 流水线 |
|------|----------------------|------------------|
| 制品 | UAT 目录 jar → 生产机 compose | Maven jar → 镜像 → Harbor → ACK |
| 发版粒度 | 单 Job 内 whole/single/multi | **whole Job** + **每服务一个 Job** |
| 灰度 | 无 | 支持 Ingress 权重灰度（见 README-ACK-GRAY-RELEASE.md） |

---

## 二、微服务与 Script Path 对照

| prodDir | 模块 | Jenkins Script Path | ACK Deployment（默认） |
|---------|------|---------------------|-------------------------|
| gateway | alien-gateway | `docs/jenkins/produ/gateway/Jenkinsfile` | `gateway` |
| store | alien-store | `docs/jenkins/produ/store/Jenkinsfile` | `store` |
| second | alien-second | `docs/jenkins/produ/second/Jenkinsfile` | `second` |
| store-platform | alien-store-platform | `docs/jenkins/produ/store-platform/Jenkinsfile` | `store-platform` |
| lawyer | alien-lawyer | `docs/jenkins/produ/lawyer/Jenkinsfile` | `lawyer` |
| job | alien-job | `docs/jenkins/produ/job/Jenkinsfile` | `job` |
| dining | alien-dining | `docs/jenkins/produ/dining/Jenkinsfile` | `dining` |
| **（整体）** | 全部七个 | `docs/jenkins/produ/whole/Jenkinsfile` | 按 `DEPLOY_MODE` |

**未纳入本目录**（属其他仓库或镜像名不同，需另建 Job）：

- Python：`py_gateway_produ`、`py_contract_produ`、`py_esign_produ`（镜像 `alien_gateway:local` 等）  
- `xxl-job-admin-produ`、Harbor 自身组件  

---

## 三、Jenkins 侧必配项（首次）

在 Jenkins **全局**或文件夹 **凭据** 中准备：

| 凭据 ID（示例，按实际改 Jenkinsfile 内常量） | 类型 | 用途 |
|---------------------------------------------|------|------|
| `zhanghaomimapingzheng` | Username/password | Git 拉取 |
| `harbor-robot-alien` | Username/password | `docker login 39.106.135.88` |
| `ack-kubeconfig-alien` | Secret file | `KUBECONFIG`，内容来自 ACK「连接信息」下载 |

Jenkins 节点需具备：

- `mvn`、`docker`（能访问 Harbor 443/80）、`kubectl`  
- 若 Jenkins 在容器内：挂载 `docker.sock`，并将 `kubectl` 与 kubeconfig 挂入或装在镜像内  

Harbor 上建议建项目 **`alien`**，镜像名：`39.106.135.88/alien/<prodDir>:<tag>`。

基础镜像 `my-openjdk8-ffmpeg:v1` 需 **先 push 到 Harbor**（如 `39.106.135.88/alien/base/openjdk8-ffmpeg:v1`），并在 Job 参数 `BASE_IMAGE` 中填写，否则 ACK 节点拉不到。

---

## 四、ACK 与灰度

详述见同目录 **[README-ACK-GRAY-RELEASE.md](./README-ACK-GRAY-RELEASE.md)**（集群接入、命名空间、Ingress 灰度、节点 Unknown 排查）。

K8S 清单示例：`k8s/examples/`。

---

## 五、流水线参数速览

各服务 Jenkinsfile 共用库 `docs/jenkins/produ/_shared/k8s-produ-lib.groovy`，主要参数：

- `GIT_BRANCH`：预生产分支  
- `IMAGE_TAG`：默认 `build-${BUILD_NUMBER}`，可填 `uat-20260202-123`  
- `DEPLOY_STRATEGY`：`rolling`（直接替换）或 `canary`（Ingress 权重）  
- `CANARY_WEIGHT`：灰度流量百分比（仅 canary）  
- `K8S_NAMESPACE`：默认 `alien-produ`  

首次部署前在 ACK 应用 `k8s/examples/namespace.yaml` 与各服务 `deployment-*.yaml`（或让流水线 `kubectl apply` 首次全量 apply）。
