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.iokubectl --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. 成功与失败路径#
- 当前镜像与候选镜像都必须包含
@sha256:。 - 保存旧摘要与资源版本,只归档非敏感元数据。
- JSON Patch 的 test 操作检查资源版本和当前镜像,避免覆盖并发修改。
- 等待 rollout,执行创建订单/幂等/读回业务验证。
- 验证失败且当前镜像仍是本次发布时,恢复旧摘要并重新验证;流水线仍标红。
- 外部修改或恢复失败时停止自动覆盖,由值班人员处理。
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 几分钟不能称为金丝雀验证。