#!/bin/bash #https://doc.huosdk.com/web/#/183?page_id=11285 #TOP_PROJECT_DIR=$(dirname $(dirname $(dirname $(readlink -f "$0")))) #最原始项目路径 OLD_PROJECT_DIR=/huosdk TOP_PROJECT_DIR=/code PROJECT_NAME=mp LN_UPLOAD=no BRANCH_PROJECT_DIR=${TOP_PROJECT_DIR}/branch/${PROJECT_NAME} DATE=`/bin/date +%Y%m%d` MASTER_PROJECT_DIR=${TOP_PROJECT_DIR}/${PROJECT_NAME} TEST_PROJECT_DIR=${MASTER_PROJECT_DIR}test BASE_PROJECT_DIR=${BRANCH_PROJECT_DIR}base OLD_BASE_PROJECT_DIR=${BRANCH_PROJECT_DIR}old NEW_PROJECT_DIR=${BRANCH_PROJECT_DIR}${DATE} if [ -d "${OLD_PROJECT_DIR}" ]; then du -h ${OLD_PROJECT_DIR} --max-depth=1 fi TREE_INSTALL=$(rpm -qa | grep tree) if [ -z ${TREE_INSTALL} ]; then yum -y install tree fi RSYNC_INSTALL=$(rpm -qa | grep rsync) if [ -z ${RSYNC_INSTALL} ]; then yum -y install rsync fi tree ${TOP_PROJECT_DIR} -L 2 add_test_php(){ #新增所有test.php if [ -z $1 ]; then echo 'param error!'; return 0; fi TEST_PHP_PROJECT_DIR=$1 #新增所有test.php if [ -d "${TEST_PHP_PROJECT_DIR}/public" ]; then INDEX_FILES=`find ${TEST_PHP_PROJECT_DIR}/public/* -type f -name "index.php"` for INDEX_FILE in ${INDEX_FILES} do TEST_PHP_ACCESS_DIR=$(dirname ${INDEX_FILE}) if [[ -z ${TEST_PHP_ACCESS_DIR}/test.php ]];then touch ${TEST_PHP_ACCESS_DIR}/test.php fi echo -e " ${TEST_PHP_ACCESS_DIR}/test.php done fi if [ -d "${TEST_PHP_PROJECT_DIR}/access" ]; then INDEX_FILES=`find ${TEST_PHP_PROJECT_DIR}/access/* -type f -name "index.php"` for INDEX_FILE in ${INDEX_FILES} do TEST_PHP_ACCESS_DIR=$(dirname ${INDEX_FILE}) if [[ -z ${TEST_PHP_ACCESS_DIR}/test.php ]];then touch ${TEST_PHP_ACCESS_DIR}/test.php fi echo -e " ${TEST_PHP_ACCESS_DIR}/test.php done fi } #设置主线 set_master(){ [ ! -d "${NEW_PROJECT_DIR}" ] && { echo "Error: ${NEW_PROJECT_DIR} not exist"; exit 0; } #修改域名去除TEST find ${NEW_PROJECT_DIR}/* -type f -name "domain.inc.php" -exec sed -i "s@^define(\"HTTP\".*);@define(\"HTTP\", 'http://');@" {} \; find ${NEW_PROJECT_DIR}/* -type f -name "domain.inc.php" -exec sed -i "s@^define(\"HTTPS\".*@define(\"HTTPS\", 'https://');@" {} \; #同步static文件到BASE目录 if [ "${NEW_PROJECT_DIR}" == "${BASE_PROJECT_DIR}" ]; then STATIC_PROJECT_DIR=${OLD_BASE_PROJECT_DIR}; else STATIC_PROJECT_DIR=${NEW_PROJECT_DIR}; fi #rsync -avl --stats --progress ${STATIC_PROJECT_DIR}/public/static/ ${BASE_PROJECT_DIR}/public/static/ #清理runtime RUNTIME_DIRS=`find ${NEW_PROJECT_DIR}/* -type d -name runtime` for RUNTIME_DIR in ${RUNTIME_DIRS} do chmod -R 777 ${RUNTIME_DIR} rm -rf ${RUNTIME_DIR}/* done add_test_php ${NEW_PROJECT_DIR} rm -rf ${MASTER_PROJECT_DIR} ln -s ${NEW_PROJECT_DIR} ${MASTER_PROJECT_DIR} #设置权限 chmod 750 ${MASTER_PROJECT_DIR}/shell/set_auth.sh sh ${MASTER_PROJECT_DIR}/shell/set_auth.sh chmod 400 ${MASTER_PROJECT_DIR}/shell/set_auth.sh tree ${TOP_PROJECT_DIR} -L 2 } #设置测试路径 new_test_branch(){ MASTER_PROJECT_DIR_REAL=$(readlink -f ${MASTER_PROJECT_DIR}); TEST_PROJECT_DIR_REAL=$(readlink -f ${TEST_PROJECT_DIR}); #判断测试路径是否已经存在 if [[ -L "${TEST_PROJECT_DIR}" && "${MASTER_PROJECT_DIR_REAL}" != "${TEST_PROJECT_DIR_REAL}" ]]; then echo -e "\n${TEST_PROJECT_DIR} -> ${TEST_PROJECT_DIR_REAL} exist!\n"; exit 1; fi #判断对应目录是否存在 产生目录 [ -d "${NEW_PROJECT_DIR}" ] && { echo "${NEW_PROJECT_DIR} exist"; exit 1; } mkdir -p ${NEW_PROJECT_DIR} #删除upload目录 UPLOAD_DIR=`find ${NEW_PROJECT_DIR}/ -type d -name upload` rm -rf ${UPLOAD_DIR} #拷贝原有所有文件到此目录 \cp -rf ${MASTER_PROJECT_DIR}/* ${NEW_PROJECT_DIR}/ chmod -R 777 ${NEW_PROJECT_DIR} #清理runtime RUNTIME_DIRS=`find ${NEW_PROJECT_DIR}/* -type d -name runtime` for RUNTIME_DIR in ${RUNTIME_DIRS} do chmod -R 777 ${RUNTIME_DIR} rm -rf ${RUNTIME_DIR}/* done #UPLOAD软链接 if [ -d "${BASE_PROJECT_DIR}/access/upload" ]; then NEW_PROJECT_UPLOAD_DIR=${NEW_PROJECT_DIR}/access/upload BASE_PROJECT_UPLOAD_DIR=${BASE_PROJECT_DIR}/access/upload #关联UPLOAD rm -rf ${NEW_PROJECT_UPLOAD_DIR} ln -s ${BASE_PROJECT_UPLOAD_DIR} ${NEW_PROJECT_UPLOAD_DIR} fi if [ -L "${BASE_PROJECT_DIR}/access/upload" ]; then NEW_PROJECT_UPLOAD_DIR=${NEW_PROJECT_DIR}/access/upload BASE_PROJECT_UPLOAD_DIR=$(readlink -f ${BASE_PROJECT_DIR}/access/upload) #关联UPLOAD rm -rf ${NEW_PROJECT_UPLOAD_DIR} ln -s ${BASE_PROJECT_UPLOAD_DIR} ${NEW_PROJECT_UPLOAD_DIR} fi if [ -d "${BASE_PROJECT_DIR}/public/upload" ]; then NEW_PROJECT_UPLOAD_DIR=${NEW_PROJECT_DIR}/public/upload BASE_PROJECT_UPLOAD_DIR=${BASE_PROJECT_DIR}/public/upload #关联UPLOAD rm -rf ${NEW_PROJECT_UPLOAD_DIR} ln -s ${BASE_PROJECT_UPLOAD_DIR} ${NEW_PROJECT_UPLOAD_DIR} fi if [ -L "${BASE_PROJECT_DIR}/public/upload" ]; then NEW_PROJECT_UPLOAD_DIR=${NEW_PROJECT_DIR}/public/upload BASE_PROJECT_UPLOAD_DIR=$(readlink -f ${BASE_PROJECT_DIR}/public/upload) #关联UPLOAD rm -rf ${NEW_PROJECT_UPLOAD_DIR} ln -s ${BASE_PROJECT_UPLOAD_DIR} ${NEW_PROJECT_UPLOAD_DIR} fi #修改域名添加TEST find ${NEW_PROJECT_DIR}/* -type f -name "domain.inc.php" -exec sed -i "s@^define(\"HTTP\".*@define(\"HTTP\", 'http://test');@" {} \; find ${NEW_PROJECT_DIR}/* -type f -name "domain.inc.php" -exec sed -i "s@^define(\"HTTPS\".*@define(\"HTTPS\", 'http://test');@" {} \; #关联test文件夹 rm -rf ${TEST_PROJECT_DIR} ln -s ${NEW_PROJECT_DIR} ${TEST_PROJECT_DIR} add_test_php ${NEW_PROJECT_DIR} #设置所有debug请求为 TRUE find ${NEW_PROJECT_DIR}/* -type f -name "index.php" -exec sed -i "s@^define(\"APP_DEBUG\".*@define(\"APP_DEBUG\", true);@" {} \; chown -R rsynccode:www ${NEW_PROJECT_DIR} sh ${NEW_PROJECT_DIR}/shell/set_auth.sh 1 tree ${TOP_PROJECT_DIR} -L 2 echo -e "【ETL】 请手动处理\n【测试缓存开关】 请手动处理"; } set_nginx(){ #1检查测试域名是否存在 CONF_DIR=/www/wdlinux/nginx/conf/vhost/ OLD_CONF_DIR=/www/wdlinux/nginx/conf/vhost/old${DATE} #备份原有nginx配置 if [ ! -d ${OLD_CONF_DIR}/ ];then mkdir -p ${OLD_CONF_DIR} fi \cp -rf ${CONF_DIR}* ${OLD_CONF_DIR}/ if [ ! -d ${NGINX_OLD_DIR} ];then NGINX_DEMO_DIR=${BASE_PROJECT_DIR}/data/nginx/demo NGINX_DEV_DIR=${BASE_PROJECT_DIR}/data/nginx/dev NGINX_OLD_DIR=${BASE_PROJECT_DIR}/data/nginx/old else NGINX_DEMO_DIR=${OLD_PROJECT_DIR}/data/nginx/demo NGINX_DEV_DIR=${OLD_PROJECT_DIR}/data/nginx/dev NGINX_OLD_DIR=${OLD_PROJECT_DIR}/data/nginx/old fi #原有目录 if [ ! -d ${NGINX_OLD_DIR} ];then mkdir -p ${NGINX_OLD_DIR} fi CHECK_CONF_DIR=`ls ${NGINX_OLD_DIR} | grep -i '.conf'` if [[ -z ${CHECK_CONF_DIR} ]];then #校验 NGINX_MASTER 目录 if [ ! -d ${NGINX_DEMO_DIR} ];then mkdir -p ${NGINX_DEMO_DIR} fi rm -rf ${NGINX_DEMO_DIR}/* #校验 NGINX_DEV 目录 if [ ! -d ${NGINX_DEV_DIR} ];then mkdir -p ${NGINX_DEV_DIR} fi rm -rf ${NGINX_DEV_DIR}/* #校验 NGINX_OLD 目录 if [ ! -d ${NGINX_OLD_DIR} ];then mkdir -p ${NGINX_OLD_DIR} fi rm -rf ${NGINX_OLD_DIR}/* #备份原有配置 \cp -rf ${CONF_DIR}/* ${NGINX_OLD_DIR}/ #原有 CONF_FILES=$(find ${NGINX_OLD_DIR}/* -name '*.conf' | xargs grep ${OLD_PROJECT_DIR} -l ) for CONF_FILE in ${CONF_FILES} do \cp -rf ${CONF_FILE} ${NGINX_DEMO_DIR}/ done #新增 CONF_FILES=$(find ${NGINX_OLD_DIR}/* -name '*.conf' | xargs grep ${MASTER_PROJECT_DIR} -l ) for CONF_FILE in ${CONF_FILES} do \cp -rf ${CONF_FILE} ${NGINX_DEMO_DIR}/ done #删除测试域名 rm -rf ${NGINX_DEMO_DIR}/test* #修改 NGINX_MASTER 路径 sed -i "s@/${OLD_PROJECT_DIR};@/code${MASTER_PROJECT_DIR};@" ${NGINX_DEMO_DIR}/* sed -i "s@${OLD_PROJECT_DIR}/@/code${MASTER_PROJECT_DIR}/@" ${NGINX_DEMO_DIR}/* sed -i "s@${OLD_PROJECT_DIR};@/code${MASTER_PROJECT_DIR};@" ${NGINX_DEMO_DIR}/* sed -i "s@/code${MASTER_PROJECT_DIR}/@${MASTER_PROJECT_DIR}/@" ${NGINX_DEMO_DIR}/* sed -i "s@/code${MASTER_PROJECT_DIR}/@${MASTER_PROJECT_DIR}/@" ${NGINX_DEMO_DIR}/* sed -i "s@/code${MASTER_PROJECT_DIR}/@${MASTER_PROJECT_DIR}/@" ${NGINX_DEMO_DIR}/* CONF_FILES=$(ls ${NGINX_DEMO_DIR}/ | grep -i '.conf') for CONF_FILE in ${CONF_FILES} do if [ `grep -c 10080 ${NGINX_DEMO_DIR}/${CONF_FILE}` -eq '0' ]; then sed -i '/listen.*80/a listen 10080;' ${NGINX_DEMO_DIR}/${CONF_FILE} fi sed -i "s@.*listen .*10080;@ listen 10080;@" ${NGINX_DEMO_DIR}/${CONF_FILE} done \cp -rf ${NGINX_DEMO_DIR}/* ${NGINX_DEV_DIR}/ pushd ${NGINX_DEV_DIR}/ sed -i "s@${MASTER_PROJECT_DIR}/@${TEST_PROJECT_DIR}/@" ${NGINX_DEV_DIR}/* CONF_FILES=$(ls ${NGINX_DEV_DIR}/ | grep -i '.conf') for CONF_FILE in ${CONF_FILES} do HOSTNAME=`echo ${CONF_FILE%.*}` sed -i "s@#listen .*10080;@listen 10080;@" ${NGINX_DEV_DIR}/${CONF_FILE} sed -i "s@${HOSTNAME}@test${HOSTNAME}@" ${NGINX_DEV_DIR}/${CONF_FILE} sed -i "s@listen.*443.*@@" ${NGINX_DEV_DIR}/${CONF_FILE} sed -i "s@ssl on.*@@" ${NGINX_DEV_DIR}/${CONF_FILE} sed -i "s@ssl_.*@@" ${NGINX_DEV_DIR}/${CONF_FILE} sed -i "s@add_header Strict-Transport-Security max-age=15768000;@@" ${NGINX_DEV_DIR}/${CONF_FILE} mv ${NGINX_DEV_DIR}/${CONF_FILE} ${NGINX_DEV_DIR}/test${CONF_FILE} done popd NGINX_DEMO_DIR=${OLD_PROJECT_DIR}/data/nginx/demo NGINX_DEV_DIR=${OLD_PROJECT_DIR}/data/nginx/dev NGINX_OLD_DIR=${OLD_PROJECT_DIR}/data/nginx/old if [ ! -d ${OLD_BASE_PROJECT_DIR}/data/nginx/demo ];then mkdir -p ${OLD_BASE_PROJECT_DIR}/data/nginx/demo fi if [ ! -d ${BASE_PROJECT_DIR}/data/nginx/demo ];then mkdir -p ${BASE_PROJECT_DIR}/data/nginx/demo fi if [ ! -d ${TEST_PROJECT_DIR}/data/nginx/demo ];then mkdir -p ${TEST_PROJECT_DIR}/data/nginx/demo fi rsync -avl --stats --progress ${NGINX_DEMO_DIR}/* ${OLD_BASE_PROJECT_DIR}/data/nginx/demo/ rsync -avl --stats --progress ${NGINX_DEV_DIR}/* ${OLD_BASE_PROJECT_DIR}/data/nginx/dev/ rsync -avl --stats --progress ${NGINX_OLD_DIR}/* ${OLD_BASE_PROJECT_DIR}/data/nginx/old/ rsync -avl --stats --progress ${NGINX_DEMO_DIR}/* ${BASE_PROJECT_DIR}/data/nginx/demo/ rsync -avl --stats --progress ${NGINX_DEV_DIR}/* ${BASE_PROJECT_DIR}/data/nginx/dev/ rsync -avl --stats --progress ${NGINX_OLD_DIR}/* ${BASE_PROJECT_DIR}/data/nginx/old/ rsync -avl --stats --progress ${NGINX_DEMO_DIR}/* ${TEST_PROJECT_DIR}/data/nginx/demo/ rsync -avl --stats --progress ${NGINX_DEV_DIR}/* ${TEST_PROJECT_DIR}/data/nginx/dev/ rsync -avl --stats --progress ${NGINX_OLD_DIR}/* ${TEST_PROJECT_DIR}/data/nginx/old/ #拷贝所有域名到正式目录下 \cp -rf ${NGINX_DEMO_DIR}/* ${CONF_DIR}/ \cp -rf ${NGINX_DEV_DIR}/* ${CONF_DIR}/ echo -e "\cp ${NGINX_DEMO_DIR}/* ${CONF_DIR}/ \n" echo -e "\cp ${NGINX_DEV_DIR}/* ${CONF_DIR}/ \n" #检查域名配置 /www/wdlinux/nginx/sbin/nginx -t echo -e '/www/wdlinux/nginx/sbin/nginx -t \n' echo -e '请检查配置 配置OK 请重启nginx \nservice nginx restart \nservice nginxd restart ' else echo '域名已配置' fi } set_base(){ #判断原始目录是否存在 if [ ! -d "${OLD_PROJECT_DIR}" ]; then return 1; fi #设置权限 #${OLD_PROJECT_DIR}/shell/set_auth.sh #判断目录是否存在 if [ -d "${BASE_PROJECT_DIR}" ]; then if [ ! -L "${MASTER_PROJECT_DIR}" ]; then ln -s ${BASE_PROJECT_DIR} ${MASTER_PROJECT_DIR} fi if [ ! -L "${TEST_PROJECT_DIR}" ]; then ln -s ${BASE_PROJECT_DIR} ${TEST_PROJECT_DIR} fi #echo "${BASE_PROJECT_DIR} exist"; return 1; fi #保存所有old文件 mkdir -p ${OLD_BASE_PROJECT_DIR} #保存所有base文件 mkdir -p ${BASE_PROJECT_DIR} if [ "${LN_UPLOAD}" == "no" ]; then #迁移原有目录到old目录 rsync -avl --stats --progress --exclude 'runtime' --exclude 'Runtime' ${OLD_PROJECT_DIR}/* ${OLD_BASE_PROJECT_DIR}/ #迁移原有目录到base目录 rsync -al --exclude 'runtime' --exclude 'Runtime' ${OLD_PROJECT_DIR}/* ${BASE_PROJECT_DIR}/ echo "rsync -avl --stats --progress --exclude 'runtime' --exclude 'Runtime' ${OLD_PROJECT_DIR}/* ${OLD_BASE_PROJECT_DIR}/" echo "rsync -avl --stats --progress --exclude 'runtime' --exclude 'Runtime' ${OLD_PROJECT_DIR}/* ${BASE_PROJECT_DIR}/" else #迁移原有目录到old目录 rsync -avl --stats --progress --exclude 'runtime' --exclude 'Runtime' --exclude 'upload' ${OLD_PROJECT_DIR}/* ${OLD_BASE_PROJECT_DIR}/ #迁移原有目录到base目录 rsync -al --exclude 'runtime' --exclude 'Runtime' --exclude 'upload' ${OLD_PROJECT_DIR}/* ${BASE_PROJECT_DIR}/ echo "rsync -avl --stats --progress --exclude 'runtime' --exclude 'Runtime' --exclude 'upload' ${OLD_PROJECT_DIR}/* ${OLD_BASE_PROJECT_DIR}/" echo "rsync -avl --stats --progress --exclude 'runtime' --exclude 'Runtime' --exclude 'upload' ${OLD_PROJECT_DIR}/* ${BASE_PROJECT_DIR}/" #UPLOAD软链接 if [ -d "${OLD_PROJECT_DIR}/access/upload" ]; then OLD_BASE_PROJECT_DIR_UPLOAD_DIR=${OLD_BASE_PROJECT_DIR}/access/upload OLD_PROJECT_DIR_UPLOAD_DIR=${OLD_PROJECT_DIR}/access/upload BASE_PROJECT_DIR_UPLOAD_DIR=${BASE_PROJECT_DIR}/access/upload #关联UPLOAD rm -rf ${OLD_BASE_PROJECT_DIR_UPLOAD_DIR} ln -s ${OLD_PROJECT_DIR_UPLOAD_DIR} ${OLD_BASE_PROJECT_DIR_UPLOAD_DIR} rm -rf ${BASE_PROJECT_DIR_UPLOAD_DIR} ln -s ${OLD_PROJECT_DIR_UPLOAD_DIR} ${BASE_PROJECT_DIR_UPLOAD_DIR} fi if [ -d "${OLD_PROJECT_DIR}/public/upload" ]; then OLD_BASE_PROJECT_DIR_UPLOAD_DIR=${OLD_BASE_PROJECT_DIR}/public/upload OLD_PROJECT_DIR_UPLOAD_DIR=${OLD_PROJECT_DIR}/public/upload BASE_PROJECT_DIR_UPLOAD_DIR=${BASE_PROJECT_DIR}/public/upload #关联UPLOAD rm -rf ${OLD_BASE_PROJECT_DIR_UPLOAD_DIR} ln -s ${OLD_PROJECT_DIR_UPLOAD_DIR} ${OLD_BASE_PROJECT_DIR_UPLOAD_DIR} rm -rf ${BASE_PROJECT_DIR_UPLOAD_DIR} ln -s ${OLD_PROJECT_DIR_UPLOAD_DIR} ${BASE_PROJECT_DIR_UPLOAD_DIR} fi fi #生成 runtime find ${OLD_PROJECT_DIR} -type d -name runtime | sed "s@^${OLD_PROJECT_DIR}@mkdir -p ${OLD_BASE_PROJECT_DIR}@" | sh find ${OLD_PROJECT_DIR} -type d -name runtime | sed "s@^${OLD_PROJECT_DIR}@mkdir -p ${BASE_PROJECT_DIR}@" | sh find ${OLD_BASE_PROJECT_DIR} -type d -name runtime -exec chmod 777 {} \; find ${BASE_PROJECT_DIR} -type d -name runtime -exec chmod 777 {} \; #生成 Runtime find ${OLD_PROJECT_DIR} -type d -name Runtime | sed "s@^${OLD_PROJECT_DIR}@mkdir -p ${OLD_BASE_PROJECT_DIR}@" | sh find ${OLD_PROJECT_DIR} -type d -name Runtime | sed "s@^${OLD_PROJECT_DIR}@mkdir -p ${BASE_PROJECT_DIR}@" | sh find ${OLD_BASE_PROJECT_DIR} -type d -name Runtime -exec chmod 777 {} \; find ${BASE_PROJECT_DIR} -type d -name Runtime -exec chmod 777 {} \; if [ ! -L "${MASTER_PROJECT_DIR}" ]; then ln -s ${BASE_PROJECT_DIR} ${MASTER_PROJECT_DIR} fi if [ ! -L "${TEST_PROJECT_DIR}" ]; then ln -s ${BASE_PROJECT_DIR} ${TEST_PROJECT_DIR} fi ${BASE_PROJECT_DIR}/shell/set_auth.sh #${OLD_PROJECT_DIR}/shell/set_auth.sh } set_base if [ -z $1 ]; then new_test_branch else FIRST_PARAM=$1; if [ "${FIRST_PARAM}" == "nginx" ]; then #配置nginx set_nginx echo "nginx ok"; exit 1; fi if [ "${FIRST_PARAM}" == "1" -o "${FIRST_PARAM}" == "base" ]; then if [ "${FIRST_PARAM}" == "1" ]; then #为1表示取用当前目录 FIRST_PARAM=${DATE} fi fi #存在文件夹才处理 NEW_PROJECT_DIR=${BRANCH_PROJECT_DIR}${FIRST_PARAM} if [ -d "${NEW_PROJECT_DIR}" ]; then if [ -z $2 ]; then #第二个参数不存在 停留60s 可以关闭 echo -e '正式环境切换确保所有人员知晓【客户】【产品】【运营】【商务】\n停留60s 可以终止执行'; sleep 60; fi set_master echo "${MASTER_PROJECT_DIR} -> ${NEW_PROJECT_DIR} ok"; exit 1; else echo "${NEW_PROJECT_DIR} not exits!"; exit 1; fi echo "参数输入错误"; exit 1; fi