使用 shell 脚本打包部署 springboot 项目

本贴最后更新于 2296 天前,其中的信息可能已经沧海桑田

背景:目前我们的非正式环境(包括 TEST,PRE)都使用 jenkins 进行发布,但正式环境还是手动打包发布。因此为了节省发布的时间,写了一套 shell 脚本进行一键发布。计划后期(如果还有后期的话)将项目迁移到 docker 进行发布管理。

code:

#!/bin/bash
#author cl* 

CODE_DIR="codedir"
PACKAGED_NAME="packagename"
GIT_PROJECT_NAME="projectname"
GIT_BRANCH_NAME="branchname"
APP_DEPLOY_PATH="deploypath"
PROFILE="prd"
PORT=9096

#如果任何语句的执行结果不是true则应该退出
set -e

#git初始化配置,配置后,无需手动输入用户名及密码即可从指定git管理代码
function gitinit(){
  echo "start gitinit..."
  cd ~/
  touch .git-credentials
  echo "http://username:password@xxx.xxx.xxx.xxx" > .git-credentials
  git config --global credential.helper store
  #执行此句后~/.gitconfig文件多了一项[credential] helper = store
  echo "finish gitinit..."
  
}

#pull and package gitcodeResource 
function package(){
  echo "start pull git resource code..."
  rm -rf ./$CODE_DIR
  git clone  http://xxx.xxx.xxx.xxx/Card/$GIT_PROJECT_NAME.git
  cd ./$CODE_DIR
  git checkout $GIT_BRANCH_NAME
  echo "git checkout succeed ..."
  echo "starting packaging app ..."
  mvn clean package -Dmaven.test.skip=true
  echo "packaging app success ..."
}

#code deploy
function deploy(){
  cd $APP_DEPLOY_PATH
  shutdown
  echo "rename last version..."
  if [ -f $PACKAGED_NAME.jar ]
    then
      mv $PACKAGED_NAME.jar $PACKAGED_NAME'_'`date +%Y%m%d%H%M%S`.jar
  fi
  echo "copy jar..."
  cp $APP_DEPLOY_PATH/$CODE_DIR/target/$PACKAGED_NAME.jar $APP_DEPLOY_PATH
  echo "start member@"$PORT
  startup
}

#app shutdown
function shutdown(){
  PID=$(ps -ef | grep $PACKAGED_NAME.jar | grep -v grep | awk '{ print $2 }')
  if [ -z "$PID" ]
  then
    echo Application is already stopped
  else
    echo kill $PID
    kill -9 $PID
  fi
}

#app startup
function startup(){
  echo "startuping"$GIT_BRANCH_NAME"..."
  export JAVA_HOME=$JAVA_HOME
  nohup java -server -Xms512M -Xmx512M -Xss256k \
      -XX:+UseStringDeduplication \
      -XX:+HeapDumpOnOutOfMemoryError \
      -jar $PACKAGED_NAME.jar \
      --server.port=$PORT \
      --spring.profiles.active=$PROFILE \
      > /dev/null 2>&1 &
  echo "startuping success ..."
  echo "打开端口:"$PORT"..."
  firewall-cmd --zone=public --add-port=$PORT/tcp --permanent

}

#pring helpinfo
function help(){
	echo "Usage: ./onekey.sh [gitinit|package|deploy|startup|shutdown|help]"
	echo "gitinit:初始化git设置"
	echo "package:程序打包"
	echo "deploy:程序发布"
	echo "startup:程序启动"
	echo "shutdown:程序关闭"
	echo "help:打印帮助信息"
}

case "$1" in
  'gitinit')
    gitinit
    ;;
  'package')
    package
	;;
  'deploy')
    deploy
	;;
  'startup')
	startup
	;;
  'shutdown')
	shutdown
	;;
  'help')
	help
	;;
  *)
    

esac
exit 0


用法:一次运行 gitinit,package,deploy 三个命令即可。当然也可以将三个命令组合成一个命令进行一键发布。

依赖环境:Maven3+,git,Java8。

  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    122 引用 • 73 回帖 • 2 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • yangyujiao

    我们无论线上环境 还是开发环境 还是测试环境 都是用 shell 启动项目的 有的组打包也用 shell 我们组一般都是自己打个 jar 传上去 然后 shell 启动一下

    1 回复
  • flhuoshan
    作者

    这个脚本包含了从 gitlab 拉代码到服务器打包以及部署启动,可以一键搞定。其实这也是 jenkins 一键部署的模拟。生产环境装 jenkins 麻烦。

  • yangyujiao

    image.png
    我们也有 shell 来做这个,没用 jenkins
    不过我们组更喜欢自己打包,用 shell 启动

    1 回复
  • flhuoshan
    作者

    不理解,一键发布不是更快,是有什么步骤需要人工干预吗?