Skip to content

1. 原理概述

每次发布都会生成一个唯一的tag,并push到远程,以及记录到研发平台记录中。为了方便,这个tag采用的就是流水线执行ID。回滚时,会从研发平台传入参数,切到这个tag,然后复制到一个干净目录,打镜像。

2. 目录说明

  • 回滚目录 xx/revert
  • 回滚工作区间(REVERT_DIRworkspace
  • 发布目录 xx/nginx-build-files

3. 回滚步骤

  1. 清空当前工作目录
  2. 新建要回滚的域名目录,从发布目录中拷贝过来要回滚的域名
  3. 去回滚仓库目录 checkout 到 要回滚的tag(流水线参数)
  4. 删除工作空间子目录,拷贝要回滚的子目录
  5. 工作目录域名打镜像
  6. 留存记录:回滚目录切head,切新分支,把回滚内容复制过去,git push

4. 注意点

为什么一定要在回滚目录切标签?

  • 不能在发布目录操作,否则影响其他项目的正常发布流程

5. 2025.01.06 优化点

  • 不再与发布目录耦合,从远程拉取

6. 怎么查看回滚有没有带出域名下其他子目录

每次回滚都会切一个 feature/${revertTag} 的分支,并推送当前打镜像的内容,revertTag 是前面提到的标签。可以去 frontend-cloud 这个仓库下,看看这个分支提交的内容。如果是下面这种一个子目录的就没问题:

如果是下面这种就有问题,带出了其他子目录的内容:

如果是先回滚到了一个历史版本,然后又回滚到了最新版本。那这个回滚分支就和master分支上的内容完全相同

7. 源码

bash
# 回滚模板
# 准备镜像资源
# https://devops.aow.com/console/pipeline/tip-h5/template/d8475892ed694dbcb055fae54e3c81aa/edit
set -ex

cd $WORKSPACE
REVERT_WORKSPACE="$WORKSPACE"
REVERT_DIR=/data/landun/revert

function initRevertGit() {
  cd $REVERT_DIR
  git reset --hard HEAD
  git clean -df
  git checkout master
  git pull origin master
  git pull
}

########    拷贝域名下所有文件   ########

rm -rf $REVERT_WORKSPACE
mkdir -p $REVERT_WORKSPACE/$DOMAIN

initRevertGit
cp -r $REVERT_DIR/$DOMAIN $REVERT_WORKSPACE


if [[ -d "$REVERT_WORKSPACE/$DOMAIN/$IMAGE_NAME" ]];then
  echo 1
else
  echo "Not Exist"
  exit 0;
fi;

########    找到要回滚的文件夹   ########

initRevertGit

git checkout $REVERT_TAG

rm -rf $REVERT_WORKSPACE/$DOMAIN/$IMAGE_NAME
cp -r $REVERT_DIR/$DOMAIN/$IMAGE_NAME $REVERT_WORKSPACE/$DOMAIN

if [[ $USE_DEFAULT_PATH == 'true' ]];then
  cp -r $REVERT_DIR/$DOMAIN/$IMAGE_NAME/* $REVERT_WORKSPACE/$DOMAIN
fi;

########    git push 用于留存记录   ########

cd $REVERT_DIR
git checkout master
git pull
git checkout -b feature/$REVERT_TAG || git checkout feature/$REVERT_TAG

rm -rf $REVERT_DIR/$DOMAIN
cp -r $REVERT_WORKSPACE/$DOMAIN $REVERT_DIR/$DOMAIN

git add .
git commit -m "feat: revert by ${creator}" || true
git push --set-upstream origin feature/$REVERT_TAG || true