mac crontab 定时部署前端项目,以及crontab中的npm 问题解决

当前文章仅在mac环境下使用的总结

crontab 编辑 语句: 

crontab -e

crontab内的定时语句格式

* * * * * 执行语句

编写好打包上传,同时在服务器压缩成压缩包的shell脚本

#!/bin/sh
export PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/james/work/shensi/web-medical-data-engineering/node_modules/.bin
# 本脚本专为自动化准备的脚本,请勿在自己的机器运行,很可能会给自己的机器带来破坏性的影响!!!!
# 将每个文件的dist文件整合到主项目的dist文件中, 子项目将会放在Child文件中的命令: bash build.sh copy
# build的命令:bash build.sh build
# 打tar包 命令:bash build.sh tar
# 从单个项目打包到测试部署完整过程命令为 bash build.sh auto WebCollect test 其中如果想部署到开发环境则 省略test即可。WebCollect为项目的存放文件名称需为项目git路径中名称的大驼峰。
echo "start"
start_time=`date +'%Y-%m-%d:%H:%M:%S'`
start_time_num=`date -j -f %Y-%m-%d:%H:%M:%S $start_time +%s`
build_num=0;
copy_num=0;
build_str="build" # 所有的项目同时打包的命令
copy_str="copy" # 所有的项目的打包后的文件整合到主应用的
tar_str="tar" # 将整合后的打包文件生成tar包
tar_file_name="medical-data-engineering-$(date "+%Y-%m-%d")" #生成的带有当前日期的文件包名称
update_file_name="$(date "+%Y-%m-%d %H:%M:%S")" #具体的发布日期
pull_str="pull" # 自动拉取最新
auto_str="auto" # 自动部署
not_build="not_build" # 不需要重新打包
pull_common_str="pull_common" # 所有模块更新common文件
git_pre_Str="http://lipengpeng:abc12345_@192.168.11.59:9000/frontend-dev" # git路径的前缀
# 所有的项目的集合
file_list=( "WebDecision" "WebIndexCenter" "WebDataCenter" "WebDrgDipSystem")
auto_git_str="" # git的文件名 /xx.git中的xx
auto_git_file_str="" # Child文件下的存放地址
address_str="192.168.128.121" # 开发环境地址
test_env_address_str="192.168.128.102" # 测试环境地址
show_env_address_str="192.168.11.51" # 演示环境地址
test_dev_package_path="/root/fontEnd" # 开发环境安装包存放地址
pre_package_path="/data/deeptht-deploy/deeptht-web" # 演示环境安装包存放地址
package_path="" # 安装包存放位置变量
code_path="work/shensi/web-medical-data-engineering" # 当前脚本存放位置

# 切换到当前位置,方便自动化执行
cd ~/$code_path;
pwd;
echo '-=-=-=-=-=-=-=-==-=='

dockerRunAndBuild() { # docker build and run,同时添加updateTime.txt 来记录部署的时间
  ssh -p 22 root@$address_str << eeooff
  cd $package_path/medical-data-engineering
  if [ ! -f "updateTime.txt" ]; then
    touch updateTime.txt
    echo '$update_file_name' > updateTime.txt
  else
    sed -i '1i $update_file_name' updateTime.txt
  fi
  docker build -t web-medical-data-engineering:1.0.0 .
  docker run --privileged -it -d --restart always -p 3330:80 --name web-medical-data-engineering web-medical-data-engineering:1.0.0
  cd ../
  find . -name 'medical-data-engineering-*.tar' | xargs rm
  tar cvf $tar_file_name.tar medical-data-engineering
eeooff
}

# 自动化部署子模块
autoFuncSub() {
  echo '---autoFuncSub---'
  pwd;
  git add .
  git stash save
  git subtree pull --prefix=Child/$auto_git_file_str $git_pre_Str/$auto_git_str dev --squash -m "$auto_git_file_str" #  git stash pop
  git push origin dev
  cd ./Child/$auto_git_file_str
  pwd;
  if [ ! -d node_modules ]
    then
      echo "adding node_modules"
      npm install --registry=https://registry.npm.taobao.org
    else
      echo "has node_modules"
  fi;
  echo "----start building----"
  npm run build-publish > build-dev.log
#  rm -rf node_modules
  mv dist $auto_git_file_str
  tar zcvf $auto_git_file_str.tar.gz $auto_git_file_str
  mv $auto_git_file_str dist
  scp $auto_git_file_str.tar.gz root@$address_str:$package_path/medical-data-engineering/dist/Child
  rm $auto_git_file_str.tar.gz
  echo "----- $auto_git_file_str 打包,压缩,上传完成!-----"
  cd ../../
  # scp to ssh scp -r 可以将本地的文件夹上传到服务器中,但是上传后会将当前的文件名也一起上传上去, 另外通过将本地的ssh 公钥放到服务器的~/.ssh/authorized_keys 中就可以不用每次输入密码了。
  # 通过 echo '$update_file_name' > updateTime.txt 在新文件中添加内容。 sed -i '1i $update_file_name' updateTime.txt 在第一行中插入一行内容, 当文件为空的时候失效。
  # touch updateTime.txt 新建文件
  # ssp -p 端口号 用户名@服务器IP地址 << xxx  /n xxx 在xxx与 换行 xxx 中间的的多个语句可以在本次连接中执行多条命令
pwd
echo "----- 开始暂停服务器 -----"

ssh -p 22 root@$address_str << eeooff
  cd $package_path/medical-data-engineering/dist/Child
  rm -rf $auto_git_file_str
  tar -zxvf $auto_git_file_str.tar.gz
  rm $auto_git_file_str.tar.gz
  docker stop web-medical-data-engineering
  docker rm web-medical-data-engineering
  docker rmi web-medical-data-engineering:1.0.0
eeooff
dockerRunAndBuild;
echo "----- $auto_git_file_str 部署完成 -----"
}

#自动化部署主模块
autoFuncMain() {
  npm install --registry=https://registry.npm.taobao.org
  npm run build
  echo "主应用打包成功"
  # ---------------
  # 删除服务器中的原文件, 同时停掉和删除服务器的容器和镜像
  ssh -p 22 root@$address_str << eeooff
    cd $package_path/medical-data-engineering/dist
    rm -rf css
    rm -rf img
    rm -rf js
    rm favicon.ico
    rm index.html
    docker stop web-medical-data-engineering
    docker rm web-medical-data-engineering
    docker rmi web-medical-data-engineering:1.0.0
eeooff
# ---------
echo "已经停止并删除服务器的容器和镜像"
# 复制本地的文件到服务器
scp -r dist/css root@$address_str:$package_path/medical-data-engineering/dist
scp -r dist/js root@$address_str:$package_path/medical-data-engineering/dist
scp -r dist/img root@$address_str:$package_path/medical-data-engineering/dist
scp dist/favicon.ico root@$address_str:$package_path/medical-data-engineering/dist
scp dist/index.html root@$address_str:$package_path/medical-data-engineering/dist
dockerRunAndBuild;
echo "publish success"
}

controlFunc() {
  package_path=$test_dev_package_path
  auto_git_file_str=$1
  case $1 in
  "WebDecision")
    auto_git_str="web-decision"
    ;;
  "WebIndexCenter")
    auto_git_str="web-index-center"
    ;;
  "WebDataCenter")
    auto_git_str="web-data-center"
    ;;
  "WebDrgDipSystem")
    auto_git_str="web-drg-dip-system"
    ;;
  esac
}
if [ $1 != "" ]; then #模块名称校验,当模块名称和数组中定义的模块不一致时做出提示同时 停止运行程序。
  if [ $1 = "WebMain" ]; then # bash build.sh auto WebMain
    echo "---开始部署主模块---"
    controlFunc $1 # bash build.sh auto WebCollect test
    autoFuncMain;
  elif [[ ${file_list[@]} =~ $1 ]]; then
    echo "---开始部署子模块$auto_git_file_str---"
    controlFunc $1 # bash build.sh auto WebCollect test
    autoFuncSub
  elif [[ ! ${file_list[@]} =~ $1 ]]; then
    echo "输入的模块名称有误"
  fi
else # 没有输入部署的模块
  echo "请输入需要部署的模块"
fi
end_time=`date +'%Y-%m-%d:%H:%M:%S'`
end_time_num=`date -j -f %Y-%m-%d:%H:%M:%S $end_time +%s`
echo "部署开始时间:$start_time"
echo "部署结束时间:$end_time"
echo "部署时长: $((($end_time_num - $start_time_num)/60)) 分钟"
if [[ -n "$1" ]]; then
  echo "部署模块:$1"
fi;
echo "部署环境:开发环境"
echo "$package_path";
echo "$address_str";
osascript -e 'display notification "俺部署成功啦!" with title "通知"';
pwd;
#osascript -e 'set volume output volume 20'
#say -v Samantha Successfully uploaded the demo environment file
#osascript -e 'set volume output volume 0'


当时遇到的问题就是,在控制台运行这个脚本没有问题, 在crontab种执行这个语句就会没法打包。 最会通过在shell 脚本中添加这一句,分别在mac控制台和crontab中执行后,查看日志问题得出问题是出在crontab的执行环境和mac控制台的执行环境path不同,在crontab中没有sbin,所以无法在里面运行npm语句。

echo $PATH > auto-dev.log

解决方案1: 在shell脚本中添加一行

export PATH=/usr/sbin:$PATH

解决方案2:  把crontab改成

* * * * * . /etc/profile; your command

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值