# Alien-Cloud-K8s-Whole Job 配置清单

目标：**一次 Job** 支持 `whole` / `single` / `multi`，把预生产 Harbor 镜像晋升到生产 tag，并可选批量更新 ACK。  
**不**拉 `alien-*` 业务源码、**不** Maven、**不** docker build。

与单服务 **Gateway-K8s** 的区别：Whole 管七个服务组合；日常只发 gateway 用 `gateway/Jenkinsfile` 即可。

---

## 常规（General）

| 项 | 建议 | 你截图 |
|----|------|--------|
| 描述 | `预生产分支 → Harbor 晋升 → ACK；whole/single/multi` | ✓ 已写，可保留 |
| **参数化构建过程** | **不必勾** | 未勾 ✓；`DEPLOY_MODE` 等在 Jenkinsfile `parameters {}` 里 |
| 丢弃旧的构建 | 建议勾，保留 **15** | 与 Jenkinsfile `buildDiscarder` 一致 |
| **不允许并发构建** | **建议勾** | 未勾 → 建议勾，避免两次 whole 同时改 ACK |
| Gogs / 触发器 | 手动发版可全不勾 | ✓ |

首次保存后请 **立即构建一次**，之后左侧会出现 **「Build with Parameters」**。

---

## 流水线（Pipeline）

| 项 | 应填 | 你截图 |
|----|------|--------|
| 定义 | Pipeline script from SCM | ✓ |
| Repository URL | `http://8.152.195.41:3000/alien/alien_cloud` | 若显示 `alien cloud`（空格）请改为 **`alien_cloud`** |
| Credentials | `dujian (git)` | ✓；**不要** Harbor 机器人 |
| 分支 | `*/uat-20260202` | ✓（与预生产分支一致） |
| Script Path | **`docs/jenkins/produ/whole/Jenkinsfile`** | ✓ |
| **轻量级检出** | **勾选** | ✓；脚本内再稀疏拉 `docs/jenkins/produ/_shared/` |

凭据（全局，非 SCM）：

| ID | 用途 |
|----|------|
| `harbor-robot-alien` | docker login 153.68 |
| `ack-kubeconfig-alien` | kubectl |

---

## Jenkinsfile 三阶段（与界面无关，自动执行）

```text
Plan            → 解析 DEPLOY_MODE，打印将晋升的服务列表
Promote images  → docker pull/tag/push（七个或子集）
Deploy to ACK   → DEPLOY_STRATEGY≠skip 且非 DRY_RUN 时 kubectl set image
```

---

## 参数用法（Build with Parameters）

### DEPLOY_MODE

| 模式 | 行为 | 还需填写 |
|------|------|----------|
| **whole** | 七个 Java 服务全部晋升 | 忽略 SINGLE / MULTI_* |
| **single** | 只晋升一个 | `SINGLE_SERVICE=gateway` 等 |
| **multi** | 勾选多个 | 至少勾一项 `MULTI_gateway` … `MULTI_dining` |

### 镜像 tag（七个服务共用同一 SOURCE_TAG）

| 参数 | 说明 |
|------|------|
| `SOURCE_TAG` | UAT 已在 Harbor 的 tag，如 `uat-build-42` |
| `TARGET_TAG` | 留空 → `produ-<构建号>`；七个服务打**同一**生产 tag |
| `DEPLOY_STRATEGY` | `skip` 只推 Harbor；`rolling` 滚更 ACK；`canary` 灰度 |
| `DRY_RUN` | 只 Plan，不 pull/push |

### 推荐试跑顺序

1. `DEPLOY_MODE=single`，`SINGLE_SERVICE=gateway`，`DRY_RUN=true` → 看 Plan  
2. 同上，`DRY_RUN=false`，`DEPLOY_STRATEGY=skip` → 只晋升 gateway 镜像  
3. `DEPLOY_MODE=whole`，`DEPLOY_STRATEGY=skip` → 七个服务只推 Harbor  
4. 确认 Harbor 后，`DEPLOY_STRATEGY=rolling` → 更新 ACK  

---

## Whole Job vs 七个单服务 Job

| 场景 | 用哪个 Job |
|------|------------|
| 只发 gateway | **Gateway-K8s**（更简单） |
| 一次发七个 / 多选两三个 | **Alien-Cloud-K8s-Whole** |
| 与 prod-promote 习惯一致 | Whole 的 `DEPLOY_MODE` 同 `Jenkinsfile-prod-promote-from-uat` |

勿再建 `promote-image` Job（与 whole 脚本重复），二选一即可。

---

## 前置条件

1. UAT 已将七个镜像推到 `39.105.153.68/alien_cloud/<服务>:<SOURCE_TAG>`（可只推部分，但 whole 会对缺失镜像 pull 失败）  
2. Jenkins 节点（88）`insecure-registries` + `harbor-robot-alien` 已配置  
3. Gitea 上 `uat-20260202` 分支已包含最新 `whole/Jenkinsfile`

## 故障：`MissingContextVariableException: FilePath is missing`

日志若在 **Start of Pipeline 后立刻出现 `[Pipeline] load` 然后失败**，说明 Gitea 上仍是**旧版** Jenkinsfile（在 `pipeline { agent any` **之外**顶层写了 `load`）。

处理：

1. 将仓库中最新 `docs/jenkins/produ/whole/Jenkinsfile` **push 到 Job 使用的分支**（如 `uat-20260202`）  
2. Jenkins Job 点 **保存** 后重新构建（不要 Replay 旧运行）  
3. 成功日志应先出现 `[Pipeline] agent`、`Checkout` / `sparse`，再在 **Plan** 阶段里 `load`
