打包(summer-hill为例)
-
打包过程简介
(a) :脚本构成:测试环境打包由bda、builder、build三个脚本构成。其中bda和builder程序再部署服务器的/usr/local/bin目录下。build程序在各个部署模块中。
(b):脚本调用关系如下: bda--->builder--->build
-
bda脚本详解
bda脚本主要初始化参数,然后调用builder脚本。
(a): 代码
#!/bin/bash # $1 eg: fantasy/summer-hill-14.0.2 # $VER summer-hill-14.0.2 # $REPO fantasy/summer-hill # $PRJ summer-hill VER=`basename $1` REPO=`echo $1 | sed -e 's/-[^\-]*$//'` PRJ=`basename $REPO` if [ -z $CDN ]; then export CDN=cdn.alpha.neoteched.com fi if [ -z $BUILDENV ]; then export BUILDENV=test fi #最后生成可发布的压缩包后的前缀:如,alpha-summer-hill-14.0.2.tar.xz PACKAGE_PREFIX="alpha-" # MASTERREQUIRED 不清楚作用 MASTERREQUIRED=false source builder
(b) : 调用方式
bd程序也是打包程序的入口
bda fantasy/summer-hill-14.0.2
-
builder脚本详解 builder脚本主要负责代码的克隆、子模块的初始化更新操作。最后通过下一步的build后的代码进行打包生成可发布程序。
(a): 代码
#!/bin/bash #创建临时目录并进入 OLDWD=`pwd` WD=`mktemp -d` cd $WD #克隆项目 git clone https://git.neoteched.com/$REPO.git $PRJ if [ $? -ne 0 ]; then echo "Clone failed" exit 1 fi #进入项目并切换分支 cd $PRJ git checkout $VER if [ $? -ne 0 ]; then echo "Checkout failed, may be tag not pushed." exit 1 fi #不清楚这段代码的意思 if $MASTERREQUIRED; then branch=`git branch --contains $VER | grep master` if [ -z $branch ]; then echo "Specified tag $VER is not in master branch" exit 2 fi fi #初始化子模块并更新 git submodule init if [ $? -ne 0 ]; then echo "Submodule error" exit 1 fi git submodule update if [ $? -ne 0 ]; then echo "Submodule update failed" exit 1 fi # $VERSION 14.0.2 # $PROJECT summer-hill export VERSION=`echo $VER | sed -e 's/^.*-\([^\-]*\)$/\1/'` export PROJECT=$PRJ #执行项目中的build,summer-hill项目为例(各项目之间有区别) ./build if [ $? -ne 0 ]; then echo "Error in build script" exit 2 fi #记录发布版本号 echo $VER > VERSION #删除无用文件 rm -rf .git .gitignore .gitmodules #打包压缩 cd .. mv $PRJ $VER tar cpJf $PACKAGE_PREFIX$VER.tar.xz $VER rm -rf $VER mv $PACKAGE_PREFIX$VER.tar.xz $OLDWD cd $OLDWD rmdir $WD
(b): 调用方式: 由bd程序内部调用
-
build脚本详解 此脚本存在于各发布程序的源码的根目录中,通过git clone后可查看。该脚本的主要功能是对模块的源代码进行构建操作。最后生成可打包上线的代码。
(a): 代码
#! /usr/bin/env bash if [ -z $CDN ]; then CDN=cdn.shenlancity.com fi if [ -z $PROJECT ]; then CWD=`pwd` PROJECT=`basename $CWD` fi #安装php依赖包,目录下composer.json为配置文件 echo "Installing composer dependency..." composer install --no-dev --optimize-autoloader --no-suggest --ignore-platform-reqs echo "Replacing static resource url..." #替换静态文件中的静态信息的获取位置 files=`grep -lR 'static/' protected/view webroot/html static/react` for f in $files; do echo -n "Processing $f..." sed "s/\"\/static\//\"\/\/$CDN\/$PROJECT\/$VERSION\/static\//g" < $f > $f.cdn && mv $f.cdn $f sed "s/\"static\//\"\/\/$CDN\/$PROJECT\/$VERSION\/static\//g" < $f > $f.cdn && mv $f.cdn $f echo "done" done #安装node.js模块(package.json文件) echo "Installing dependency libs..." npm install #压缩CSS文件 #命令个形式:cleancss -o style.min.css style.css echo "Minifying static files..." echo "Minifying stylesheet with cleancss..." find static -name '*.css' -print -exec node_modules/clean-css/bin/cleancss -o {} {} \; #压缩合并js文件 #--避免与选项冲突,eg:uglifyjs --compress --mangle -- input.js echo "Minifying JavaScript with uglifyjs..." find static -name '*.js' -print -exec node_modules/uglify-js/bin/uglifyjs -c -m -o {} -- {} \; #压缩html文件 #--html5: html5格式 #--collapse-whitespace: 去掉空格 #--remove-comments: 去掉注释 echo "Minifying html with html-minifier..." find webroot -name '*.html' -print \ -exec node_modules/html-minifier/cli.js \ --html5 --collapse-whitespace --remove-comments -o {}.min {} \; \ -exec mv {}.min {} \; #压缩图片jpeg,png if [ -x `which jpegoptim` ]; then echo "Optimizing JPEG images..." find static -name *.jpg -print -exec jpegoptim -q --strip-all {} \; fi if [ -x `which optipng` ]; then echo "Optimizing PNG images..." find static -name *.png -print -exec optipng -quiet -strip all -o7 {} \; fi #打包JSX文件 echo "Compiling JSX files..." NODE_ENV=production node_modules/webpack/bin/webpack.js -p #判断打包JSX文件是否成功 echo -n "Checking compiled js..." if [ ! -f static/compiled-js/lib.js ]; then echo "fail" exit 4 else echo "done" fi #清理react文件 echo "Remove JSX source code..." rm -rf static/react/ echo "Moving static to version dir..." mkdir $VERSION mv static $VERSION/ #修改webroot/xts.php文件配置 echo "Turning off DEBUG mode..." patch -p1 < build.tools/turn-off-debug.diff if [ -n $BUILDENV ]; then patch -p1 < build.tools/env_$BUILDENV.diff fi #执行生成二维码脚本程序 echo "Generating captchas..."; php -f protected/lib/securimage/create.php #清理无用的目录及其文件 echo -n "Cleaning..." rm -rf build.tools/ doc/ test/ webroot/info.php .babelrc package.json \ node_modules/ webpack.config.js echo "done" echo "Seems everything goes well. I'm going away..." rm -f build
(b): 调用方式:通过builder内部调用,执行后将返回build。
结果 生成该模块的压缩包,提交给测试部门进行部署和测试。打包后的压缩包如:alpha-summer-hill-14.0.2.tar.xz
发布线上包 发布线上包,只需将入口程序bda更改成bd即可打包线上包。
发布(summer-hill为例)
-
脚本构成:
发布程序主要由deploy脚本构成,路径为:/usr/local/bin。
-
执行入口:
deploy dir/alpha-summer-hill-14.0.2.tar.xz
-
代码
#!/bin/bash if [ -z $1 ] || [ $1 = "-h" ] || [ $1 = "--help" ]; then echo "Usage: deploy <package> [site]" echo "" echo " package Required. Format: path/to/PROJECT-VERSION.tar.xz" echo " site Optional. Default: neo" echo "" echo "" exit 0 fi # $1: dir/alpha-summer-hill-14.0.2.tar.xz # $2: 可省略 PACKAGE=$1 SITE=$2 #判断压缩包是是否存在并且可读 if [ ! -r $PACKAGE ];then echo "$PACKAGE not exists or not readable." exit 1 fi if [ -z $SITE ]; then SITE="neo" fi # $TAG: summer-hill-14.0.2 # $PROJECT: summer-hill # $VERSION: 14.0.2 TAG=`basename $PACKAGE` TAG=${TAG%.tar.xz} TAG=`echo $TAG | sed -e 's/^\(alpha-\)//'` PROJECT=`echo $TAG | sed -e 's/-\([^\-]*\)$//'` VERSION=`echo $TAG | sed -e 's/^.*-\([^\-]*\)$/\1/'` echo "Tag: $TAG" echo "Project: $PROJECT" echo "Version: $VERSION" echo "Site: $SITE" #解压并判断是否成功 echo "Extracting..." tar -xpf $PACKAGE -C /web/$SITE/ cd /web/$SITE/ if [ ! -d $TAG ]; then echo "Error package" exit 2 fi #更改summer-hill-14.0.2属性为www-data echo "Change owner of files..." chown -R www-data:www-data $TAG/ #把压缩包中的静态文件移到静态目录中。 echo "Moving static content to CDN..." if [ -d $TAG/$VERSION ]; then if [ ! -d cdn/webroot/$PROJECT ]; then echo "cdn/$PROJECT not found, create it..." sudo -u www-data mkdir -p cdn/webroot/$PROJECT fi mv $TAG/$VERSION cdn/webroot/$PROJECT/ fi # 设置项目目录环境变量 $PROJECT_DIR: /web/neo/summer-hill if [ -x $TAG/script/before-install ]; then echo "Running before install script..." cd /web/$SITE/$TAG/ ./script/before-install fi #进入/web/neo目录,记录上一个版本,并删除当前版本软连接 cd /web/$SITE/ if [ -h $PROJECT ]; then echo -n "Save old project version..." old=`readlink $PROJECT` echo "[$old]" if [ -h prev_$PROJECT ]; then unlink prev_$PROJECT fi ln -s $old prev_$PROJECT echo "Unlink old project symbol..." unlink $PROJECT fi #创建软连接 echo "Creating project symbol to $TAG..." ln -s $TAG $PROJECT #安全重启php-fpm进程 echo -n "Sending SIGNAL USR2 to php-fpm..." kill -USR2 `cat /usr/local/php7/var/run/php-fpm.pid` if [ $? -ne 0 ]; then echo "error" else echo "done" fi #将项目根目录cron.d下的文件复制到/etc/cron.d目录下 if [ -x $PROJECT/script/post-install ]; then echo "Running post install script..." cd /web/$SITE/$PROJECT/ ./script/post-install fi #配置crontab if [ -f crontab ]; then echo "Setting up crontab..." cp crontab /etc/cron.d/$PROJECT chown root:root /etc/cron.d/$PROJECT service cron reload fi echo "Done"
-
与线上发布区别
(a): 包名不一样,测试已alpha开头。线上没有该前缀。 (b): $SITE 变量测试为neo,线上为shenlan (c): $TAG变量无需删除alpa前缀 (d): 线上同步需同步静态资源到CDN回源,代码如下:
rsync -az /web/neo/cdn/ 10.45.xx.xx:/web/neo/cdn/