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

排错清单(常见问题与定位)#

  1. 审批门禁不出现
    - 检查 when { expression { params.ENV == 'prod' } } 条件是否生效
    - 任务是否运行在 prod 参数下
  2. 发布后健康检查失败
    - curl -fsS http://127.0.0.1:8080/health 返回非 200
    - 检查应用日志:tail -f /srv/app/logs/app.log
  3. 回滚脚本执行失败
    - rollback.sh 是否有执行权限:chmod +x /srv/app/bin/rollback.sh
    - 回滚版本是否存在:ls /repo/app-*.tar.gz

练习#

  1. 将审批门禁扩展为双人审批:第一个 input 后再追加第二个 input
  2. 在“监控验证”阶段增加错误率阈值判断:大于 1% 触发回滚。
  3. 增加“变更影响分析”步骤:对比配置差异并输出 diff 报告。