前言
打包之后的文件是哈希命名的,常规的部署是直接覆盖文件,随着部署次数增多,文件的体积会指数增加。
于是想到了删除之前的文件,但是呢,之前的文件直接删除了会对正在使用的用户带来影响,没有访问过的模块如果不刷新就访问不了了。这个是由于懒加载的缘故,没有访问过的页面浏览器不会主动加载,用户使用过程中如果经历了一次部署就会导致没有访问过的页面访问不了
于是我们想到了删除上上个版本的文件~
这个刚开始想法是通过版本的文件信息去删,这样要额外的同时保留多个版本的 manifest.json 文件。之后想到了每个版本都会有压缩包进行备份,可以根据这个时间来删
大概思路
-
ci命令中执行一个 py 文件的命令,替换删除上个版本的包。我们要写的操作就在这个命令里面了
-
编写py脚本文件
2.1 申明执行环境 2.2 拉取备份文件的时间列表,找出要删除时间节点 2.3 删掉固定时间之前的文件。end
ci 脚本
在ci的脚本命令中添加这一行,改动不大。替换了之前的删除上个版本的包
script:
- /home/xx/xx/xx/hello.py
这样我们就能在 hello.py 中干我们想干的事了
py 脚本
ci的命令用的是 shell ,考虑到处理文件,选择了用 python 脚本的形式。核心思想是通过备份文件的修改时间和受控版本来决定文件是否该删除
👀
#!/usr/bin/python3
import os
# 嘿嘿,xx项目专用
print("Hello, World!")
# n 个版本之前的都要被我们删掉。2 表示 保留上个版本和上上个版本
deleteVersion = 2
# 备份地址,绝对路径
bfPath = '/home/web/bf/xx/'
assetsPath = '/home/web/xx/xx/xx/assets'
bfList = []
# 拉取备份地址的所有包,提取压缩包时间属性
for root, dirs, files in os.walk(bfPath):
for name in files:
filesPath = os.path.join(root, name)
filesTime = os.path.getmtime(filesPath)
bfList.append(filesTime)
# 进行排序,默认升序
bfList.sort()
# 打印一下有个数
print(bfList)
# 删除操作函数
def deleteHandle():
deleteDateTime = bfList[len(bfList) - 1 - deleteVersion]
print('删除小于时间' + str(deleteDateTime))
# 删除assets文件
for root, dirs, files in os.walk(assetsPath):
for name in files:
filesPath = os.path.join(root, name)
filesTime = os.path.getmtime(filesPath)
if (filesTime < deleteDateTime):
os.remove(filesPath)
print('assest 处理完成')
# 删除备份文件
for root, dirs, files in os.walk(bfPath):
for name in files:
filesPath = os.path.join(root, name)
filesTime = os.path.getmtime(filesPath)
if (filesTime < deleteDateTime):
os.remove(filesPath)
print('备份文件处理完成')
return
# 如果版本只有一个或两个,不操作
if len(bfList) <= (1 + deleteVersion):
print('备份版本 <= ' + (1 + deleteVersion))
else:
deleteHandle()
上面的代码换了备份文件和项目部署地址就能用在任意项目了,当然你也可以任意 DIY
总结
- 将处理删除的操作独立出来有利于保证ci脚本的稳定性
- 按照版本删除过期文件规避懒加载导致的访问不到的问题