公司最初静态资源使用的最原始的方案:虚拟机上开通FTP让UED直接上传,nginx作为WEB服务器发布应用,前端通过nginx反向代理访问。
面临以下几个问题,不得不整改了:
- 流量使用过度:IDC带宽有限,有些大图片被集体访问,带宽面临耗尽问题;有时候还会有流量攻击
- 发布管理问题:UED直接上传,直接修改线上,没有测试环节,经常导致故障;出了问题不好回退,没有版本概念。
研究后决定引入git做版本管理,同时将静态资源放到阿里oss,避免静态资源对IDC带宽的过度消耗。
新的拓扑:
- gitlab:静态资源版本库;
- 生产和测试oss:静态文件存放的空间,域名指向其cname;
- ossfs server:一台阿里云虚拟机,将测试和生产存储桶通过ossfs挂在到虚拟机2个目录;
- jenkins:发布终端,调用ossfs server上的脚本,执行git pull操作,包含测试和生产2个任务,发布时需要指定tag,以方便版本回退。
整个流程:
ued开发 -> git提交 -> 打tag -> 测试发布 -> 测试 -> 生产发布 -> 验收 。
脚本
==== deploy.sh ====
#!/bin/bash
if [ $# -ne 3 ]; then
echo "Usage: deploy.sh [profile] [project] [tag]"
echo "For example: deploy.sh test myproject tag20171216-01"
exit 1
fi
PROFILE=$1
PROJECT=$2
TAG=$3
PROJECTID=3
LOGFILE=/root/script/deploy.log
TMPFILE=/root/script/tmp.log
echo >> $LOGFILE
echo `date +%Y%m%d" "%H:%M:%S`" deploy.sh $PROFILE $PROJECT $TAG" >> $LOGFILE
#check tagname
curl -s --request GET --header "Private-Token: ************" "http://gitlabip/api/v4/projects/${PROJECTID}/repository/tags/${TAG}" > $TMPFILE 2>&1
if ! grep \"name\":\"${TAG}\" $TMPFILE > /dev/null 2>&1; then
echo
echo "======== ERROR: no tag <<$TAG>> ========"
echo
echo `date +%Y%m%d" "%H:%M:%S`" ERROR: no tag <<$TAG>> " >> $LOGFILE
exit 1
fi
cd /ossfs/${PROJECT}/${PROFILE}/
echo `date +%Y%m%d" "%H:%M:%S`" git pull..." >> $LOGFILE
git pull >> $LOGFILE 2>&1
echo `date +%Y%m%d" "%H:%M:%S`" git reset --hard tag..." >> $LOGFILE
git reset --hard $TAG >> $LOGFILE 2>&1
echo `date +%Y%m%d" "%H:%M:%S`" deploy.sh end" >> $LOGFILE
脚本说明:
初次发布前,先通过git clone命令手动克隆一次;
每次发布操作的主要命令是:
git pull 增量更新到最新版本
git reset --hard tag 回退到指定tag(注:git reset和分支还是保持一致,如果用git checkout tag将和分支detach,因此使用前者,增量更新,效率更高)。