# 预生产分支 → 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/<服务名>:` 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//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/:`。 基础镜像 `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)。