# UAT 流水线：构建镜像并推送到 Harbor（方案 A）

在现有 **UAT Maven + jar 部署** 流水线上增加可选阶段，把业务镜像推到：

```text
39.105.153.68/alien_cloud/<服务名>:uat-build-<Jenkins构建号>
```

生产侧 **Gateway-K8s / Alien-Cloud-K8s-Whole** 使用同一 tag 作为 `SOURCE_TAG` 做晋升。

脚本：`docs/jenkins/Jenkinsfile-uat-build-deploy.groovy`

---

## 一、整体流程

```text
UAT Jenkins Job（88:30003）
  1. Checkout（拉 alien_cloud 预生产分支）
  2. Maven Build（mvn clean package）
  3. Push images to Harbor（PUSH_TO_HARBOR=true 时）
       docker build → push 39.105.153.68/alien_cloud/gateway:uat-build-42
  4. Deploy Services（拷 jar 到 /app_deploy_uat + docker restart，与现网一致）

Harbor Web（153.68）出现 gateway 仓库

生产 Jenkins（同机，另一文件夹）
  Gateway-K8s / Whole：SOURCE_TAG=uat-build-42 → produ-xxx → ACK
```

---

## 二、一次性准备（运维 / Jenkins 管理员）

### 2.1 Harbor（153.68）

- [x] 项目 `alien_cloud` 已存在  
- [x] 基础镜像 `alien_cloud/base/openjdk8-ffmpeg:v1` 已 push  
- [ ] 机器人 `robot$alien_cloud+jenkins-k8s` 具备 **推送** 权限  

### 2.2 Jenkins 凭据（全局，UAT / 生产 Job 共用）

| ID | 类型 | 内容 |
|----|------|------|
| `harbor-robot-alien` | Username with password | 用户 `robot$alien_cloud+jenkins-k8s`，密码=Token |
| `zhanghaomimapingzheng` | Git | UAT Job SCM 已在使用 |

### 2.3 Jenkins 执行机 Docker（通常在 88 本机或 Jenkins 容器内）

```bash
# 探测 Registry
curl -sI http://39.105.153.68/v2/

# 登录（与凭据一致）
echo '<TOKEN>' | docker login 39.105.153.68 -u 'robot$alien_cloud+jenkins-k8s' --password-stdin
```

若 HTTP + IP 访问，需在 **运行 docker 的宿主机** `/etc/docker/daemon.json` 增加：

```json
{
  "insecure-registries": ["39.105.153.68"]
}
```

然后 `systemctl restart docker`（注意：若在 153.68 上误执行会影响 Harbor，**应在 88 Jenkins 节点** 配置）。

### 2.4 将脚本提交到 Gitea

本地修改 `docs/jenkins/Jenkinsfile-uat-build-deploy.groovy` 后，push 到 UAT Job 使用的分支（如 `uat-20260202`）。

---

## 三、配置 UAT Jenkins Job

| 项 | 值 |
|----|-----|
| 定义 | Pipeline script from SCM |
| 仓库 | `http://8.152.195.41:3000/alien/alien_cloud` |
| 分支 | `*/uat-20260202`（与你们一致） |
| Script Path | **`docs/jenkins/Jenkinsfile-uat-build-deploy.groovy`** |
| SCM 凭据 | Git（**不要**选 Harbor 机器人） |

保存后先 **立即构建一次**，加载新参数。

---

## 四、Build with Parameters（推荐首次 gateway）

| 参数 | 首次试跑建议 |
|------|----------------|
| `GIT_BRANCH` | `uat-20260202` |
| `FORCE_UPDATE` | 按需 |
| **`PUSH_TO_HARBOR`** | **`true`** |
| **`HARBOR_PUSH_SCOPE`** | **`gateway-only`** |
| `HARBOR_REGISTRY` | `39.105.153.68` |
| `HARBOR_PROJECT` | `alien_cloud` |

构建成功后日志末尾应有：

```text
>>> pushed 39.105.153.68/alien_cloud/gateway:uat-build-<N>
>>> Prod promote: SOURCE_TAG=uat-build-<N>
```

记下 **`<N>`** = Jenkins 构建号。

---

## 五、验证 Harbor

浏览器打开：`http://39.105.153.68/harbor/` → 项目 **alien_cloud** → 镜像仓库应出现 **`gateway`**，标签 **`uat-build-<N>`**。

或命令行：

```bash
curl -s -u 'robot$alien_cloud+jenkins-k8s:<TOKEN>' \
  'http://39.105.153.68/v2/alien_cloud/gateway/tags/list'
```

---

## 六、接生产晋升流水线

在 **Gateway-K8s** 或 **Alien-Cloud-K8s-Whole**：

| 参数 | 值 |
|------|-----|
| `SOURCE_TAG` | `uat-build-<N>`（与 UAT 构建号一致） |
| `DEPLOY_STRATEGY` | 先 `skip`（只晋升 Harbor），再 `rolling` |
| `DEPLOY_MODE` | 单服务用 `single` + `gateway` |

---

## 七、参数说明

| 参数 | 说明 |
|------|------|
| `PUSH_TO_HARBOR` | `false`=保持旧行为，只 jar 部署；`true`=增加 Harbor push |
| `HARBOR_PUSH_SCOPE` | `gateway-only` 只推 gateway；`all-java-services` 推七个服务（Maven 须全部打包成功） |
| `UAT_HARBOR_IMAGE_TAG` | 自动 `uat-build-${BUILD_NUMBER}`，无需手填 |

---

## 八、常见问题

| 现象 | 处理 |
|------|------|
| `not found` pull 基础镜像 | 确认 Harbor 有 `base/openjdk8-ffmpeg:v1` |
| `Login Succeeded` 后 push 失败 | 机器人是否有项目 push 权限 |
| `x509` / 证书错误 | 88 上 `insecure-registries` 或 HTTPS + ca.crt |
| Harbor 仍无 gateway | 是否勾选了 `PUSH_TO_HARBOR`；Maven 是否打出 `alien-gateway/target/*.jar` |
| 生产 Whole 仍 not found | `SOURCE_TAG` 必须与 UAT 构建日志中的 `uat-build-<N>` 完全一致 |

---

## 九、与现网 jar 部署的关系

- **Deploy Services** 阶段仍会拷 jar 并 `docker restart` UAT 容器，**不影响**现有 UAT 访问方式。  
- Harbor 镜像供 **ACK / 生产晋升** 使用，两套路径可并行。  
- 日常若只更新 UAT 机 jar、暂不发 ACK，可 `PUSH_TO_HARBOR=false`。
