1. 原理概述
每次发布都会生成一个唯一的tag
,并push
到远程,以及记录到研发平台记录中。为了方便,这个tag
采用的就是流水线执行ID。回滚时,会从研发平台传入参数,切到这个tag
,然后复制到一个干净目录,打镜像。
2. 目录说明
- 回滚目录
xx/revert
- 回滚工作区间(
REVERT_DIR
)workspace
- 发布目录
xx/nginx-build-files
3. 回滚步骤
- 清空当前工作目录
- 新建要回滚的域名目录,从发布目录中拷贝过来要回滚的域名
- 去回滚仓库目录
checkout
到 要回滚的tag
(流水线参数) - 删除工作空间子目录,拷贝要回滚的子目录
- 工作目录域名打镜像
- 留存记录:回滚目录切
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