# Harbor：alien_cloud 项目与 Jenkins 对接

> **重要：** Harbor Web 与 Registry 在 **39.105.153.68**（浏览器如 `http://39.105.153.68/harbor/...`）。  
> **不是** 39.106.135.88。`docker login` / `HARBOR_REGISTRY` 须用 **153.68**。

Jenkins（示例）：`http://39.106.135.88:30003` — 可与 Harbor 分机部署，网络互通即可。

---

## 当前进度（对照打勾）

- [x] Harbor 项目 `alien_cloud`（私有）
- [x] 机器人 `robot$alien_cloud+jenkins-k8s`（拉取/推送等权限）
- [ ] Token 写入 Jenkins 凭据 `harbor-robot-alien`
- [ ] 在 **有 Docker 的机器** 上 `docker login` **39.105.153.68** 成功
- [ ] 推送基础镜像 `39.105.153.68/alien_cloud/base/openjdk8-ffmpeg:v1`
- [ ] UAT Job 推业务镜像（见 [README-UAT-HARBOR-PUSH.md](../README-UAT-HARBOR-PUSH.md)）
- [ ] Jenkins 凭据 `ack-kubeconfig-alien` + Job 试跑
- [ ] ACK 命名空间 / Deployment / imagePullSecret

---

## 一、保存机器人 Token → Jenkins

Harbor 2.x 里 **机器人名称不能点击**，这是正常现象；Token **不会**在详情页里长期展示。

### 获取 Token 的两种方式

**方式 A：重新生成密钥（推荐，保留原机器人）**

1. 在 **机器人账户** 列表中，**勾选**左侧复选框（选中 `robot$alien_cloud+jenkins-k8s` 那一行）。  
2. 点表格上方的 **「其他操作」** 下拉菜单。  
3. 选择 **「重新生成密钥」** / **「Regenerate secret」** / **「刷新令牌」**（中文版措辞可能略有不同）。  
4. 弹出框里会显示 **新 Token**，**立即复制**（关闭后无法再查看）。

**方式 B：新建一个机器人**

1. **+ 添加机器人账户**，名称如 `jenkins-k8s-2`，权限与现网相同。  
2. 点 **完成** 后弹窗里的 Token **只出现一次**，务必当场复制。  
3. Jenkins 凭据里改用新用户名；旧的 `jenkins-k8s` 可之后在 Harbor 里禁用或删除。

若勾选后 **「其他操作」** 里没有「重新生成」：试该行最右侧 **⋮** 菜单，或换用 **admin** 账号登录。

### 写入 Jenkins

1. Jenkins 文件夹 **凭据** → **添加**：
   - 类型：Username with password  
   - **ID**：`harbor-robot-alien`  
   - **用户名**：`robot$alien_cloud+jenkins-k8s`  
   - **密码**：Token  

---

## 二、探测 Registry（在 Jenkins 所在机或 153.68 上）

```bash
curl -sI http://39.105.153.68/v2/
curl -skI https://39.105.153.68/v2/
```

| 结果 | 做法 |
|------|------|
| **401** | 正常，继续 `docker login 39.105.153.68` |
| **301** 到 https | 用 **https** 登录，勿对 153.68 配 `insecure-registries` 走 HTTP |
| **404** | 把完整 `curl` 输出给运维；或试浏览器同协议的主机名 |

登录（推荐）：

```bash
echo '<TOKEN>' | docker login 39.105.153.68 -u 'robot$alien_cloud+jenkins-k8s' --password-stdin
```

若 HTTPS 证书报错：在 `/etc/docker/certs.d/39.105.153.68/ca.crt` 放 Harbor CA，或请运维提供证书；**优先不要用错 88 的 insecure-registries**。

---

## 三、推送基础镜像（153.68 上常有 `my-openjdk8-ffmpeg:v1`）

```bash
docker images | grep openjdk8-ffmpeg

docker tag my-openjdk8-ffmpeg:v1 39.105.153.68/alien_cloud/base/openjdk8-ffmpeg:v1
docker push 39.105.153.68/alien_cloud/base/openjdk8-ffmpeg:v1
```

Harbor Web → **alien_cloud** → 应看到 `base/openjdk8-ffmpeg`。

---

## 三.1、UAT 首次推送 gateway 镜像（方案 A）

见 **[README-UAT-HARBOR-PUSH.md](../README-UAT-HARBOR-PUSH.md)**：在 UAT Job 勾选 `PUSH_GATEWAY_TO_HARBOR`，产出 `gateway:uat-build-<构建号>` 后，再跑生产晋升 Job。

---

## 四、Jenkins 参数（Build with Parameters）

| 参数 | 值 |
|------|-----|
| `HARBOR_REGISTRY` | **`39.105.153.68`** |
| `HARBOR_PROJECT` | `alien_cloud` |
| `BASE_IMAGE` | `39.105.153.68/alien_cloud/base/openjdk8-ffmpeg:v1` |

Git 凭据：`zhanghaomimapingzheng`（或你 Job SCM 里已选中的）。

---

## 五、下一步总序

1. **本步**：Jenkins 凭据 `harbor-robot-alien` + 上节 `docker login` / `push` 基础镜像  
2. 凭据 **`ack-kubeconfig-alien`**（ACK 下载的 kubeconfig）  
3. Job **`gateway-k8s`** 或 **`alien-cloud-k8s-whole`**：先 `DRY_RUN`，再真实构建  
4. ACK：`kubectl apply` namespace、harbor pull secret、deployment（见 README-ACK-GRAY-RELEASE.md）

---

## 六、两台机器分工

| IP | 角色 |
|----|------|
| **39.105.153.68** | Harbor、现网 *-produ compose、Registry **login/push 目标** |
| **39.106.135.88** | Jenkins :30003、UAT 等（构建机可 SSH 到 153.68 做 login 测试） |

在 **88** 上构建时：Jenkins 容器/宿主机的 Docker 必须能访问 **153.68** 的 Registry（安全组放行）。
