Jenkins 发布审批、部署锁与可靠回退

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。

构建一次,同一个镜像摘要依次进入预生产和生产。扫描、业务验证、审批缺一不可。数据库变更先做兼容扩展,后续版本再清理旧字段;回退镜像不能恢复数据库。

1. 选择唯一发布入口#

本文直接更新 Kubernetes Deployment(工作负载控制器)。已有 GitOps(以 Git 为期望状态的自动交付)时,应由 Jenkins 提交摘要变更、GitOps 部署,不能同时对同一对象执行 patch。

完整 Jenkinsfile 包含环境独立 Agent、环境锁、审批、摘要晋级、失败回退和审计归档。deploy.py 固定操作 orders/orders-api 的 api 容器;改目标需要代码审查。

2. 最小发布权限#

保存为 release-rbac.yaml,由管理员在两个环境分别执行。组名通过 项目中的 EKS 身份映射 接通,不能只创建 RoleBinding。

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata: {name: orders-release, namespace: orders}
rules:
  - apiGroups: [apps]
    resources: [deployments]
    resourceNames: [orders-api]
    verbs: [get, list, watch, patch]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata: {name: orders-release, namespace: orders}
subjects:
  - kind: Group
    name: orders-release
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: orders-release
  apiGroup: rbac.authorization.k8s.io
kubectl --context "$ADMIN_CONTEXT" apply -f release-rbac.yaml
# 用实际发布身份验证,不能用管理员身份代替。
kubectl --context "$RELEASE_CONTEXT" -n orders auth can-i patch deployment/orders-api
kubectl --context "$RELEASE_CONTEXT" -n orders auth can-i get secrets

预期为 yes、no。patch Deployment 仍能修改 Pod 模板,还需准入策略限制服务账号、镜像来源、特权容器及卷挂载;脚本只改 image 不等于身份只能改 image。

3. 成功与失败路径#

  1. 当前镜像与候选镜像都必须包含 @sha256:。
  2. 保存旧摘要与资源版本,只归档非敏感元数据。
  3. JSON Patch 的 test 操作检查资源版本和当前镜像,避免覆盖并发修改。
  4. 等待 rollout,执行创建订单/幂等/读回业务验证。
  5. 验证失败且当前镜像仍是本次发布时,恢复旧摘要并重新验证;流水线仍标红。
  6. 外部修改或恢复失败时停止自动覆盖,由值班人员处理。

disableConcurrentBuilds 只锁同一任务;lock(resource: 'orders-production') 保护共享环境。同环境全部 Jenkins 任务必须使用同一个锁名,外部控制器不受其约束。

审批不占 Agent。release-managers 必须是身份提供方真实组名;用非组成员验证无法审批。管理员仍有特殊权限,严格职责分离需增加外部变更系统门禁。

4. 中断后的人工恢复#

Agent 断电、全局超时或强制停止可能使自动回退来不及执行。先暂停其他发布,核对实际镜像、变更记录和数据兼容性,再用归档 oldImage:

# 下载构建归档 audit/production.json,保存到当前目录 production.json。
mkdir -p audit
python3 - <<'PY'
import json
from pathlib import Path
r=json.loads(Path('production.json').read_text())
Path('audit/restore-image.txt').write_text(r['oldImage']+'\n')
PY
# 使用生产发布 Agent 的受控身份,先核实 context。
python3 ci/deploy.py --context release-production --environment production --image-file audit/restore-image.txt

此恢复会验证业务;失败会尝试恢复到执行前镜像。若当前已是旧摘要,脚本拒绝重复部署,应执行 bash ci/verify-business.sh production 验证。归档缺失时,从集群及发布账本确定版本,不猜旧标签。

5. 蓝绿与金丝雀#

滚动升级用于兼容变更;蓝绿需要双份容量和连接排空;金丝雀必须根据指标停止/回退。Jenkins 触发与审批,流量切换交给控制器,沿用 渐进式交付 和 部署策略 实操。仅 sleep 几分钟不能称为金丝雀验证。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭