18.5.4 自动化发布流程设计:审批、变更与回滚
自动化发布流程设计应覆盖审批、变更与回滚三条主线,确保发布可控、可追溯、可恢复。流程从变更提出开始,绑定需求/缺陷编号、影响范围、风险等级与回滚方案;审批节点按环境分层,生产环境强制双人审批或变更委员会,并在流水线中通过“审批门禁”记录审批人、时间与意见。
原理草图:审批-变更-回滚主链路#
流水线示例:审批、变更记录与回滚#
目录:
/var/lib/jenkins/workspace/release-pipeline/Jenkinsfile
pipeline {
agent any
parameters {
string(name: 'CHANGE_ID', defaultValue: 'CHG-20240101', description: '变更单号')
string(name: 'APP_VERSION', defaultValue: '1.2.3', description: '制品版本')
choice(name: 'ENV', choices: ['test','pre','prod'], description: '发布环境')
}
stages {
stage('变更登记') {
steps {
sh '''
echo "CHANGE_ID=${CHANGE_ID}" > change.meta
echo "APP_VERSION=${APP_VERSION}" >> change.meta
echo "ENV=${ENV}" >> change.meta
'''
archiveArtifacts 'change.meta'
}
}
stage('审批门禁') {
when { expression { params.ENV == 'prod' } }
steps {
input message: "生产发布审批:${params.CHANGE_ID}", ok: "批准"
}
}
stage('制品与配置校验') {
steps {
sh '''
test -f /repo/app-${APP_VERSION}.tar.gz
git clone https://git.example.com/gitops/config.git
cd config && git checkout release/${APP_VERSION}
'''
}
}
stage('发布执行') {
steps {
sh '''
tar -xf /repo/app-${APP_VERSION}.tar.gz -C /srv/app/
/srv/app/bin/restart.sh
'''
}
}
stage('健康检查') {
steps {
sh '''
curl -fsS http://127.0.0.1:8080/health
'''
}
}
stage('监控验证') {
steps {
sh '''
# 模拟错误率检查
ERROR_RATE=$(curl -fsS http://prom.example.com/api/error_rate)
echo "ERROR_RATE=$ERROR_RATE"
'''
}
}
}
post {
failure {
sh '/srv/app/bin/rollback.sh'
}
}
}
关键命令解释#
input: Jenkins 手工审批门禁(Manual Gate)。archiveArtifacts: 固化变更登记产物,便于审计追踪。curl -fsS: 健康检查,-f遇到 4xx/5xx 失败并返回非 0。
变更与回滚的标准化产物#
- 变更单:
change.meta - 制品版本:
/repo/app-${APP_VERSION}.tar.gz - 配置版本:GitOps 分支
release/${APP_VERSION} - 回滚脚本:
/srv/app/bin/rollback.sh
数据库变更示例:Flyway 安装与回滚#
安装(以 Linux 为例)#
# 下载并安装
wget -O /opt/flyway.tgz https://repo1.maven.org/maven2/org/flywaydb/flyway-commandline/9.22.0/flyway-commandline-9.22.0-linux-x64.tar.gz
tar -xf /opt/flyway.tgz -C /opt/
ln -s /opt/flyway-9.22.0 /opt/flyway
export PATH=$PATH:/opt/flyway
# 验证安装
flyway -v
迁移与回滚脚本#
目录:/srv/db/migrations
V1__create_table.sql
V1__create_table_rollback.sql
-- V1__create_table.sql
CREATE TABLE app_user (id BIGINT PRIMARY KEY, name VARCHAR(64));
-- V1__create_table_rollback.sql
DROP TABLE app_user;
执行:
flyway -url=jdbc:mysql://127.0.0.1:3306/app \
-user=app -password=secret migrate
回滚(示例为手工执行回滚脚本):
mysql -h127.0.0.1 -uapp -psecret app < /srv/db/migrations/V1__create_table_rollback.sql
回滚路径示例:蓝绿/滚动发布#
# 蓝绿切换(示例:Nginx 上游切换)
cp /etc/nginx/conf.d/upstream.blue.conf /etc/nginx/conf.d/upstream.conf
nginx -s reload
# 回滚到上一个制品版本
/srv/app/bin/deploy.sh 1.2.2
/srv/app/bin/restart.sh
排错清单(常见问题与定位)#
- 审批门禁不出现
- 检查when { expression { params.ENV == 'prod' } }条件是否生效
- 任务是否运行在prod参数下 - 发布后健康检查失败
-curl -fsS http://127.0.0.1:8080/health返回非 200
- 检查应用日志:tail -f /srv/app/logs/app.log - 回滚脚本执行失败
-rollback.sh是否有执行权限:chmod +x /srv/app/bin/rollback.sh
- 回滚版本是否存在:ls /repo/app-*.tar.gz
练习#
- 将审批门禁扩展为双人审批:第一个
input后再追加第二个input。 - 在“监控验证”阶段增加错误率阈值判断:大于 1% 触发回滚。
- 增加“变更影响分析”步骤:对比配置差异并输出
diff报告。