部署上线
...
01Agile Deployment
Overview
敏捷部署与传统部署的根本差异
Traditional Deployment
1
单次大爆炸式部署
季度/年度发布
↓
2
计划停机窗口
数小时停机
↓
3
手工执行脚本
人工操作风险高
↓
4
回滚复杂耗时
数十分钟恢复
↓
5
数月反馈周期
问题发现滞后
↓
季度 / 年
部署频率
Agile Deployment
1
持续小批量部署
每日多次发布
↓
2
零停机部署
蓝绿切换
↓
3
CI/CD 自动化
流水线自动执行
↓
4
秒级自动回滚
快速恢复服务
↓
5
分钟级反馈
即时问题发现
↓
每日
部署频率
0s
停机时间
秒级
回滚时间
100%
自动化
分钟级
反馈周期
Section 01
关键指标对比
部署频率
Traditional
季度/年
Agile
每日
停机时间
Traditional
数小时
Agile
0 秒
回滚时间
Traditional
数十分钟
Agile
秒级
成功率
Traditional
风险高
Agile
高保障
Section 02
CI/CD 流水线
部署交付在 CI/CD 流水线中的位置
1
代码提交
Push
2
lint-test
检查
3
build-push
构建
4
deploy
部署
部署阶段
5
健康检查
验证
部署阶段
✓
验证通过
流量切换
✗
验证失败
自动回滚
Environment A
Blue
当前运行中
Environment B
Green
待部署环境
02/Blue-Green Deployment
Blue 环境
Green 环境
切换
Section 01
部署架构
Layer 01
🌐 用户请求
Layer 02
Nginx 反向代理
upstream 动态切换
Blue 环境
frontend-blue
backend-blue
当前活跃
Green 环境
frontend-green
backend-green
待切换
Layer 03
共享数据层
PostgreSQL
Redis
← 不参与蓝绿切换 →
Section 02
部署流程
6 步完成零停机部署
01
拉取最新镜像
从 ACR 拉取最新的 frontend 和 backend 镜像
docker pull ACR/ningshen-backend:latest
02
启动 Green 环境
启动新版本容器,Blue 继续处理流量
docker compose up -d backend-green frontend-green
03
健康检查
30 次重试,间隔 2 秒
curl -sf http://backend-green:8000/health
✓
继续✗
回滚到 Blue04
切换 Nginx upstream
更新配置并重载 Nginx
nginx -s reload
05
保存部署状态
记录当前活跃环境
echo "green" > .deployment-state
06
停止旧环境
Blue 作为备份暂不删除,支持快速回滚
docker compose stop backend-blue frontend-blue
部署时间
1-2 分钟
用户感知
零停机
03GitHub Actions
CI/CD
自动化部署流水线
触发条件
main 分支推送+build 成功
.github/workflows/ci-cd-improved.yml
YAML
1deploy:
2 needs: build-and-push
3 runs-on: ubuntu-latest
4 if: github.ref == 'refs/heads/main'
5
6 steps:
7 # Step 1: 准备部署文件
8 - name: 准备部署文件
9 run: |
10 rsync -a --delete --exclude='.git' ./ /tmp/deploy/
11
12 # Step 2: 上传到服务器
13 - name: 上传代码到服务器
14 uses: appleboy/scp-action@v0.1.7
15
16 # Step 3: SSH 执行部署
17 - name: 部署到服务器
18 uses: appleboy/ssh-action@v1.0.3
19
20 # Step 4: 部署后验证
21 - name: 部署后验证
部署方式
Blue-Green
部署时间
1-2 分钟
回滚机制
自动回滚
健康检查
自动化
Section 01
部署步骤
01
准备部署文件
同步代码并打包
rsync -a --delete
tar -czf
02
上传到服务器
SCP 传输文件
scp deployment.tar.gz
→ /tmp/
03
SSH 执行部署
远程执行脚本
docker login
deploy-blue-green.sh
04
部署后验证
健康检查验证
post-deploy-verify.sh
健康检查通过
Section 02
配置详解
deploy Job 核心配置片段
1
rsync 同步配置
排除不必要的文件
rsync -a --delete \
--exclude='.git' \
--exclude='node_modules' \
./ /tmp/deploy/
2
SCP 上传配置
使用 GitHub Secrets
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.SERVER_HOST }}
key: ${{ secrets.SERVER_KEY }}
3
SSH 部署脚本
带回滚机制
./scripts/deploy/pre-deploy-check.sh
./scripts/deploy/deploy-blue-green.sh
./scripts/deploy/post-deploy-verify.sh
04 / Deployment Scripts
Scripts
脚本驱动的自动化部署体系
859
Lines of Code
01
pre-deploy
系统检查
02
deploy
蓝绿部署
03
post-verify
部署验证
04
rollback
快速回滚
05
query
统计查询
Check
Deploy
Verify
Rollback
Query
Main Scriptdeploy-
deploy-
blue-green.sh
859 行核心部署逻辑
函数数量6
部署时间1-2 min
回滚时间< 10s
Core Functions
get_active_env()8L
获取当前活跃环境
get_new_env()6L
计算新环境名称
start_environment()15L
启动新环境容器
health_check()20L
健康检查(30次重试)
create_nginx_upstream()12L
切换 Nginx 配置
rollback()18L
回滚到备份环境
health_check()
1health_check() {
2 local port=$1
3 local max_attempts=30
4
5 while [ $attempt -lt $max_attempts ]; do
6 if curl -sf "http://localhost:$port/health";
7 then return 0
8 fi
9 sleep 2
10 done
11
12 return 1
13}
Script 01
pre-deploy-check.sh
System Check
✓
Docker
docker info
✓
Compose
docker compose version
!
Port 80
netstat -tuln
!
Disk
df /
!
Memory
free -m
Script 03rollback
rollback
blue-green.sh
<10s
一键回滚
01
启动备份环境
docker compose start backend-${ROLLBACK_ENV}
↓
02
切换 Nginx 流量
nginx -s reload
↓
03
更新部署状态
echo "$ROLLBACK_ENV" > .deployment-state
05 / Containerization
Docker
容器化部署与资源编排
2GB
Total Memory
2GB Server
postgres
400MBbackendBlue/Green
300MBfrontendBlue/Green
250MBredis
150MBnginx
100MB~800MB Reserved
Resource Allocation
PostgreSQL
400MB
Memory
0.5
CPU
BackendBlue/Green
300MB
Memory
0.5
CPU
FrontendBlue/Green
250MB
Memory
0.3
CPU
Redis
150MB
Memory
0.2
CPU
Nginx
100MB
Memory
0.2
CPU
Total Used~1.2GB
Reserved~800MB
Configurationdocker-
docker-
compose.yml
容器编排核心配置
backend
frontend
postgres
redis
nginx
docker-compose.blue-green.yml
1services:
2
3 backend:
4 image: ${REGISTRY}/backend:${VERSION}
5 container_name: backend-${DEPLOY_ENV}
6 expose: ["8000"]
7 deploy:
8 resources:
9 limits:
10 memory: 300M
11 cpus: "0.5"
12 healthcheck:
13 test: ["curl", "-sf", "http://localhost:8000/health"]
14
15 frontend:
16 image: ${REGISTRY}/frontend:${VERSION}
17 container_name: frontend-${DEPLOY_ENV}
18 expose: ["3000"]
19 deploy:
20 resources:
21 limits:
22 memory: 250M
Services
服务架构
Database
PostgreSQL
Memory400MB
CPU0.5
Port5432
共享服务
Application
Backend
Memory300MB
CPU0.5
Port8000
Blue/Green
Application
Frontend
Memory250MB
CPU0.3
Port3000
Blue/Green
Cache
Redis
Memory150MB
CPU0.2
Port6379
共享服务
Proxy
Nginx
Memory100MB
CPU0.2
Port80/443
共享服务
06 / Image Pipeline
Pipeline
3
Tags
ACR
Registry
01
Build
BuildKit 缓存
docker build -t ...
02
Push
推送至 ACR
docker push ...
03
Tag
版本标签
3 tags applied
04
Deploy
部署上线
kubectl apply ...
Active Flow
registry.cn-hangzhou.aliyuncs.com/ningshen
Version Management
版本保留
3
v3
CURRENT
Tag20260214-153000
SHAabc1234
Time2h ago
245MB
v2
Tag20260213-091500
SHAdef5678
Time1d ago
242MB
v1
DELETED
Tag20260212-184500
SHAghi9012
Time2d ago
238MB
Tag Strategy标签
标签
策略
三种标签确保版本可追溯
Type
Tag
Purpose
Example
Timestamp
timestamp
精确版本追踪
20260214-153000
Git SHA
short_sha
Git 提交关联
abc1234
Latest
latest
最新版本标识
latest
Combined Tag Example
ACR/ningshen-backend:20260214-153000·abc1234·latest
Cleanup Policy
自动清理
Before Cleanup
v6.0.0KEEP
v5.0.0KEEP
v4.0.0KEEP
v3.0.0DELETE
v2.0.0DELETE
v1.0.0DELETE
MAX=3
After Cleanup
v3.0.0KEEP
v2.0.0KEEP
v1.0.0KEEP
Script
MAX_IMAGES=3
docker images | \
tail -n +4 | \
xargs docker rmi
Traditional
瀑布部署
单次大爆炸
数小时停机
手工执行
高风险压力
Agile
敏捷部署
持续小批量
零停机切换
全自动流水线
低风险日常
Traditional
Agile
Delivery Model
交付模式
Traditional
→
Agile
交付频率
单次,项目结束时
持续,每日可部署
+∞
部署规模
大爆炸式,全量上线
小批量,增量变更
-90%
停机时间
数小时停机窗口
零停机(蓝绿切换)
-100%
用户反馈
数月后获得
分钟级获得
-99%
回滚机制
复杂,数十分钟
秒级自动回滚
-95%
环境一致性
手工搭建,差异大
Docker 容器化,完全一致
+100%
Automation Level自动化
自动化
程度
从手工操作到全自动流水线
Traditional20%
Agile95%
Traditional
✗
手工执行脚本✗
手工配置环境✗
人工验收测试✗
手工修改负载均衡✗
手工执行回滚Agile
✓
CI/CD 全自动流水线✓
Docker Compose 声明式✓
自动化健康检查✓
Nginx upstream 自动切换✓
一键脚本/自动回滚Risk Management
风险管控
风险暴露
Traditional
90%
集中一次部署
Agile
20%
分散每次小变更
问题定位
Traditional
80%
困难(变更多)
Agile
15%
容易(变更少)
回滚影响
Traditional
85%
大(全量回滚)
Agile
10%
小(增量回滚)
心理压力
Traditional
95%
高(部署是大事件)
Agile
15%
低(部署是日常)
Key Insight
部署从"大事件"变为"日常操作"
-80%
心理压力降低
ningshen@deploy:~$ ./scripts/deploy/post-deploy-verify.sh
[14:32:01]→Starting post-deployment verification...
[14:32:01]#─────────────────────────────────────────────────
[14:32:02]#$ docker ps --filter "name=backend-green"
[14:32:02]✓CONTAINER STATUS: Up 2 hours (healthy)
[14:32:02]✓✓ Container verification passed
[14:32:02]#─────────────────────────────────────────────────
[14:32:03]#$ curl -sf http://backend-green:8000/health
[14:32:03]✓{"status": "healthy", "version": "v3.0.0"}
[14:32:03]✓✓ Backend health check passed
[14:32:03]#$ curl -sf http://frontend-green:3000
[14:32:04]✓HTTP 200 OK
[14:32:04]✓✓ Frontend health check passed
[14:32:04]#─────────────────────────────────────────────────
[14:32:04]#$ curl -sf http://localhost/api/v1/health
[14:32:04]✓API proxy: OK
[14:32:04]✓✓ Nginx proxy verification passed
[14:32:04]#─────────────────────────────────────────────────
[14:32:05]#$ curl -sf https://www.ningshen.top/health
[14:32:05]✓HTTPS 200 OK (SSL: valid)
[14:32:05]✓✓ HTTPS access verification passed
[14:32:05]#─────────────────────────────────────────────────
[14:32:06]→═════════════════════════════════════════════════
[14:32:06]✓All verification checks passed! (4/4)
[14:32:06]→Deployment completed successfully.
ningshen@deploy:~$▊
08 / Deployment Verification|4/4 PASSED
Execution time: 4.2s
ningshen@deploy:~$cat verification-flow.log
验证流程
#1
$ docker ps --filter "name=backend-$ACTIVE_ENV"
检查容器运行状态
✓ CONTAINER ID STATUS PORTS NAMES
PASSED
#2
$ curl -sf http://localhost:8000/health
容器内部健康检查
✓ {"status": "healthy", "version": "v3.0.0"}
PASSED
#3
$ curl -sf http://localhost/api/v1/health
Nginx 代理验证
✓ HTTP 200 OK via Nginx
PASSED
#4
$ curl -sf https://www.ningshen.top/health
HTTPS 访问验证
✓ HTTPS 200 OK (SSL valid)
PASSED
ningshen@deploy:~$cat /etc/hosts
访问地址
METHOD
STATUS
ENDPOINT
DESCRIPTION
GET
200 OK
https://www.ningshen.top
生产环境
GET
200 OK
/api/v1/health
健康检查
GET
200 OK
/docs
Swagger UI
GET
200 OK
/redoc
ReDoc
$curl -I https://www.ningshen.top
HTTP/2 200
server: nginx
strict-transport-security: max-age=31536000
x-frame-options: DENY
09 / Deliverables
Artifacts
核心产出物清单:配置文件、部署脚本、CI/CD 工作流
15
Total Items
Category A7
Config Files
docker-compose.blue-green.ymlyml/conf
docker-compose.ymlyml/conf
docker-compose.monitoring.ymlyml/conf
nginx.confyml/conf
default.confyml/conf
upstream.confyml/conf
.deployment-stateyml/conf
Category B5
Scripts
deploy-blue-green.sh.sh
rollback-blue-green.sh.sh
pre-deploy-check.sh.sh
post-deploy-verify.sh.sh
server-init.sh.sh
Category C3
CI/CD
ci-cd-improved.ymlconfig
.envconfig
GitHub Secretsconfig
Deployment Artifacts
ningshen-fullstack完整清单
01
CONFIG
docker-compose.blue-green.yml
./docker-compose.blue-green.yml
蓝绿编排
02
CONFIG
docker-compose.yml
./docker-compose.yml
开发环境
03
CONFIG
docker-compose.monitoring.yml
./docker-compose.monitoring.yml
监控服务
04
CONFIG
nginx.conf
./nginx/nginx.conf
Nginx 主配置
05
CONFIG
default.conf
./nginx/conf.d/default.conf
站点路由
06
CONFIG
upstream.conf
./nginx/conf.d/upstream.conf
流量切换
07
CONFIG
.deployment-state
./.deployment-state
环境状态
08
SCRIPT
deploy-blue-green.sh
scripts/deploy/
主部署脚本
09
SCRIPT
rollback-blue-green.sh
scripts/deploy/
快速回滚
10
SCRIPT
pre-deploy-check.sh
scripts/deploy/
部署前检查
11
SCRIPT
post-deploy-verify.sh
scripts/deploy/
部署后验证
12
SCRIPT
server-init.sh
scripts/setup/
服务器初始化
13
CICD
ci-cd-improved.yml
.github/workflows/
CI/CD 工作流
14
CICD
.env
./
环境变量
15
CICD
GitHub Secrets
Repository Settings
部署密钥
10 / Summary
Conclusion
0s
Downtime
<10s
Rollback
100%
Automated
15
Artifacts
∞
Deploy Freq
敏捷部署体系的核心价值与理念
Core Values5
1
零停机部署
蓝绿架构实现流量无缝切换,用户完全无感知
0s Downtime
2
全自动化
代码提交 → 构建 → 测试 → 部署 → 验证,全程自动化
100% Auto
3
秒级回滚
保留备份环境,一键切换 Nginx upstream
<10s Rollback
4
环境一致性
Docker 容器化保障开发、测试、生产环境完全一致
Zero Drift
5
持续交付
部署从"高风险事件"变为"低风险日常操作"
Daily Deploy
部署不是终点,而是持续价值交付的能力
Core Philosophy
部署频率
季度
每日
停机时间
数小时
零
回滚时间
数十分钟
<10s
风险模式
集中爆发
持续可控
Chapter 10 / End
—
通过 CI/CD 自动化和蓝绿部署,将部署从"高风险事件"变为"低风险日常操作"
01
架构
02
CI/CD
03
蓝绿
04
脚本
05
Docker
06
镜像
07
对比
08
验证
09
产物
10
总结