前期概要
主要是前端更新迭代速度超快,可能有时分一天累积打包了 10 个包,每个包平均在 3mb左右,长时间下来,就非常大了
咱们运用 coding
的运用条件 容量只要 1G,导致过了一段时间就要独自处理这个工作,太麻烦了
首要咱们的自动化打包流程主要是基于 coding 的持续部署
之前的打包逻辑如下:
coding -> 登录跳板机 > 跳板机履行 shell 脚本打包 > 跳板机推送 dist 文件夹 至 git 目录 -> 登录线上环境 > 拉取代码
以上的问题按正常走时没有问题的,但是咱们需求进行容量处理的话,就需求 将 dist 移除,不要放置在 git 中,不然 git 文件将无限递加
由此改善后
coding -> 登录跳板机 > 跳板机履行 shell 脚本打包 > shell 脚本将 dist 压缩 build.tar.gz -> 将压缩包上传至 oss, 将长途文件名称写入 build.txt -> 推送代码 -> 登录线上环境 > 履行 shell 脚本,下载长途文件,解压装置
- 参考图:
publish.sh
#!/bin/sh
# 接受多个参数,并判别参数是否为空,空的情况下退出,并抛出错误提示
if [ $# -eq 0 ]; then
echo "sh publish.sh build master 或者 sh publish.sh build development"
exit 1
fi
# 定义输入参数作为变量
command=$1
env=$2
# 假如第三个参数有的时分就用参数,没有的时分就自定义
if [ -z "$3" ]; then
commit="build"
else
commit=$3
fi
# 依据输入command 履行不同的指令
if [ "$command" = "build" ]; then
if [ "$env" = "master" ]; then
npm run build:master
elif [ "$env" = "development" ]; then
npm run build:development
else
echo "sh publish.sh build master 或者 sh publish.sh build development"
exit 1
fi
fi
# command = build 履行结束后,履行git指令
if [ "$command" = "build" ]; then
# 以 build 为前缀创建一个依据时间戳生成的文件名:build-202303285115.tar.xz
prefix="build"
timestamp=$(date +"%Y%m%d%H%M%S")
filename="$prefix-$timestamp.tar.xz"
# 删去当前目录下 build 为前缀的文件名
rm -rf $prefix-*.tar.xz
# 打包 dist 文件夹
tar -cJvf $filename dist
# 获取履行 node upload.js 的返回值
url=$(node upload.js $filename)
# 判别是否为一个 url,失败的情况下退出,并抛出错误提示
if [[ $url != http* ]]; then
echo "上传失败"
exit 1
fi
git add -A
git commit -m "$commit"
git push origin $env
# 将文件名输出到 build.txt 文件中
echo $url > build.txt
fi
# command = install 履行结束后,履行解压并删去 以build为前缀的文件
if [ "$command" = "install" ]; then
git reset --hard origin $env
# 读取 build.txt 文件中的文件名
filename=$(cat build.txt)
# 下载 filename 到本地,并且命名为 build.tar.xz
wget $filename -O build.tar.xz
# 解压文件
tar -xJvf build.tar.xz
# 删去文件
rm -rf build.tar.xz
fi
以上则是依据不同环境,将文件进行打包压缩并且上传
upload.js
// 运用NODE JS 将本地压缩包上传至 七牛云 cdn
const qiniu = require('qiniu');
const fs = require('fs');
// 装备七牛云账号信息
const accessKey = '*-*****';
const secretKey = '****';
const bucketName = '***';
// 接受一个参数, 如 upload.js filename
const fileName = process.argv[2];
// 假如参数不存在,则退出
if (!fileName) {
console.log('请传入文件名');
process.exit(1);
}
// 初始化装备
const config = new qiniu.conf.Config();
// 运用华南机房
config.zone = qiniu.zone.Zone_z2; // 选择华南地区作为上传域名
const formUploader = new qiniu.form_up.FormUploader(config);
const putExtra = new qiniu.form_up.PutExtra();
// 读取 build.txt 获取待上传的文件名称, 去除换行符
// const buildTxt = fs.readFileSync('build.txt', 'utf-8').replace(/[\n]/g, '');
// 读取本地文件
// 运用PWD
const filePath = `${process.env.PWD}/${fileName}`;
const readStream = fs.createReadStream(filePath);
// 生成上传token
const mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
const options = {
scope: bucketName,
};
const putPolicy = new qiniu.rs.PutPolicy(options);
const uploadToken = putPolicy.uploadToken(mac);
// 上传文件到七牛云
const key = `static/build/${fileName}`; // 长途文件名,不含前缀,七牛云会自动生成前缀
formUploader.putStream(uploadToken, key, readStream, putExtra, function (respErr, respBody, respInfo) {
if (respErr) {
throw respErr;
}
if (respInfo.statusCode === 200) {
console.log(`自定义域名/${key}`);
} else {
console.log(`上传失败:${respBody.error}`);
}
});
由此,自动化打包流程,就处理了咱们的容量问题,存储代码是消耗不了多大空间的
疏忽文件
我所以咱们需求的是将 dist
目录、build-*.tar.xz
都从 git
中移除
所以咱们需求在 .gitignore
中新增: build-*.tar.xz
、dist
移除 dist
因为咱们前史文件 dist
已归入到 git
中,咱们不需求针对这个 dist
文件进行前史盯梢,咱们将其 从 git
前史中进行删去
要将 dist 目录从 Git 的前史记录中完全移除,您需求运用 Git 中的 filter-branch 指令。具体步骤如下:
首要,保证您在履行这些操作之前备份了您的代码库。
运转以下指令来保证在 Git 中正确地疏忽 dist 目录:
git rm -r --cached dist
echo "dist" >> .gitignore
git add .gitignore
git commit -m "Remove dist from git history"
这将从您的 Git
存储库中删去 dist
目录,并将其添加到 .gitignore
文件中。
接下来,运用 filter-branch
指令将 dist
目录从 Git
前史记录中完全删去:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch dist -r' --prune-empty --tag-name-filter cat -- --all
这个指令会重写 Git 前史记录并删去一切与 dist 相关的内容。
最终,运转以下指令以强制推送新的 Git 前史记录:
git push origin --force --all
git push origin --force --tags
这将覆盖长途存储库中的前史记录,保证 dist 目录已被完全删去。请注意,此操作可能会影响与您共享代码库的其他开发人员,因此请保证在履行此操作之前与他们进行交流。
脚本履行
- 打包代码
sh publish.sh build master
- 更新代码
sh publish.sh install master