深色模式
发布规范
摘要:发布规范解决的是"什么时候能发、谁批了才能发、发完要盯多久"。本文给出版本号约定、发布窗口与冻结期定义、通知模板和发布后 30 分钟观察清单。
适用环境
bash
git describe --tags --always
# 确认发布工具链可用
kubectl -n prod rollout status deploy/demo --timeout=5s 2>/dev/null || echo "服务存在"1
2
3
2
3
操作步骤
第 1 步:統一版本号与提交信息
bash
# 语义化版本:MAJOR.MINOR.PATCH
git tag -a v1.4.2 -m "fix: 修复下单超时重试"
git push origin v1.4.2
# 提交信息用约定式提交,便于生成变更日志
echo "feat/fix/chore/refactor: <简短说明>" > .gitmessage
git config commit.template .gitmessage1
2
3
4
5
6
7
2
3
4
5
6
7
第 2 步:定义发布窗口
bash
cat > release-window.md <<'EOF'
| 环境 | 允许时间 | 审批 |
| --- | --- | --- |
| 测试 | 随时 | 无 |
| 预发 | 工作日 09:00-18:00 | 无需 |
| 生产 | 周二/周四 14:00-16:00 | 负责人审批 |
| 生产热修 | 随时(需事故单号) | 双人审批 |
冻结期:大促前 7 天、重大活动期间、故障恢复后 24 小时内
EOF1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
第 3 步:发布前通知
bash
cat > notify.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
msg="【发布通知】$1 将于 $(date -d '+10 minutes' '+%H:%M') 发布到生产,影响:$2,回滚方案:rollout undo"
curl -sS -X POST "$RELEASE_WEBHOOK" -H 'Content-Type: application/json' \
-d "$(jq -n --arg m "$msg" '{msgtype:"text",text:{content:$m}}')"
EOF
chmod +x notify.sh && ./notify.sh demo "下单接口优化"1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
第 4 步:执行发布
bash
# 记录发布前状态,便于对比
kubectl -n prod get deploy demo -o jsonpath='{.spec.template.spec.containers[0].image}{"\n"}' | tee /tmp/before.txt
kubectl -n prod set image deploy/demo demo=registry.example.com/demo:v1.4.2
kubectl -n prod rollout status deploy/demo --timeout=300s1
2
3
4
5
2
3
4
5
第 5 步:发布后观察 30 分钟
bash
cat > post-release-check.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
PROM=${PROM:-http://127.0.0.1:9090}
q(){ curl -sS --data-urlencode "query=$1" "$PROM/api/v1/query" | jq -r '.data.result[0].value[1] // "0"'; }
echo "错误率: $(q 'sum(rate(http_requests_total{job="demo",code=~"5.."}[5m]))/sum(rate(http_requests_total{job="demo"}[5m]))')"
echo "P99 : $(q 'histogram_quantile(0.99, rate(http_request_duration_seconds_bucket{job="demo"}[5m]))')"
echo "重启数: $(kubectl -n prod get pod -l app=demo -o json | jq '[.items[].status.containerStatuses[].restartCount] | add')"
EOF
chmod +x post-release-check.sh && ./post-release-check.sh1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
验证
bash
# 1. 版本号符合语义化规范
git tag | tail -1 | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' && echo "版本号 OK"
# 2. 发布后副本全部就绪
kubectl -n prod get deploy demo -o jsonpath='{.status.readyReplicas}/{.spec.replicas}{"\n"}'
# 3. 观察指标在基线内
./post-release-check.sh1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
常见坑
版本号随意(v1、v2、final、final2)
无法回滚到确定版本。强制语义化版本并把镜像 tag 与 git tag 对齐。
周五晚上发布
出问题无人响应。禁止在周末前与节假日前后发布非紧急变更。
发布后无人观察即离开
很多故障在发布后 10-30 分钟才显现(连接耗尽、缓存击穿)。发布人必须观察满 30 分钟并确认指标正常。