image.png

  • 测试机器:若干台外网测试或者生产主机。
  • Jenkins服务器:搭建Jenkins服务器主机
  • git代码库: 我这里使用的码云

    测试环境目录结构

    根目录下创建data
    下面的目录一定要创建好,不然sh脚本会报错,不会自动创建目录

    1. /data 项目总目录
    2. /data/exec:执行脚本目录
    3. /data/pid:记录各个程序运行时pid
    4. /data/work:项目应用程序存放目录

    目录结构思路
    使用maven构建项目
    构建后使用Publish Over SSH部署到远程服务器:
    关闭应用
    备份应用到lastDepoly目录
    上传新版本的Jar包(或者war包)
    启动应用
    其中,关闭、备份、删除和启动应用都是由脚本来完成, 部署脚本 deploy.sh 放在 /data/exec下(内容见 相关脚本 章节)。
    Pushlish Over SSH的执行顺序是先上传文件再执行脚本,所以对于每个应用每个服务器我都设置了两个 Transfer Set :
    先执行清理脚本:关闭,备份和删除旧版应用jar包

    1. deploy.sh cps-platform-1.0.0 clean
  • 再执行启动脚本启动应用

    1. deploy.sh chl-tss start

    cps-platform-1.0.0 为项目打包的名称,替换自己的 *.jar 名称即可。
    jenkins
    下载Jenkins
    https://jenkins.io/download/下载Jenkins的最新版本。建议下载LTS(LongTermSuport) jenkins.war。

创建Jenkins目录结构,部署到jenkins服务器
在Jenkins服务器上创建以下结构

  1. | - /jenkins/
  2. | + pid # 记录jenkins运行pid
  3. | + conf # jenkins工作目录
  4. | + log
  5. | jenkins.sh # jenkins.sh是为了方便启动和停止jenkins服务器
  6. | jenkins.war
  • 启动jenkins :

    1. ./jenkins.sh start
  • 关闭jenkins:

    1. ./jenkins.sh stop

    将下载的jenkins.war包上传到Jenkins服务器上,使用一下命令启动:

    1. nohup java -Xms256m -Xmx1024m -XX:MaxPermSize=512m -jar jenkins.war --ajp13Port=-1 --httpPort=8099 > jenkins.out 2>&1 &

    增加 Publish Over SSH 插件

    在 系统设置->插件管理->可选插件 搜索 Publish Over SSH,选中点击立即安装即可安装。
    image.png

    设置SSH远程服务器

    在系统管理-系统配置中,下拉找到Push Over SSHimage.png
    点击新增,添加远程服务器

    注意,远程目录以及脚本执行目录一定要保持一致

    image.png
    项目配置
    注意,使用流水线构建方式,没有构建环境的配置,选maven构建模式。(需要安装插件maven)
    构建环境中勾选 Send files or execute commands over SSH after the build runs,然后点击 Add Server,即可新增目标远程服务器:

Name:新增的远程服务器
Source files:需要上传的文件,可以使用通配符和Jenkins变量。
Exec command:在远程服务器上执行的脚本,这里我的想法是,先清理一下远程服务器,关闭服务并备份程序。
image.pngimage.png

  1. cd /home/admin/data/exec
  2. sh ./deploy.sh cps-platform-1.0.0 clean

点击Add Transfer Set,新增一组设置:

Source files:需要上传的文件。**/cps-platform-1.0.0.jar。即maven打包生成后的jar包文件。路径相对于maven工程的根目录。
Exec command:在远程服务器上执行的脚本。这里需要先上传文件到服务器,再执行启动脚本
image.png

  1. cd /home/admin/data/exec
  2. sh ./deploy.sh web-0.0.1-SNAPSHOT start
  • 点开“高级”之后勾选上 Flatten files,扁平化文件。只上传文件,不上传文件所属文件夹。否则上传到远程文件夹之后就会多一级 target 目录。
  • image.png

注意,如果构建后,报错找不到settings文件,在上图右下角高级按钮处点击,然后配置maven的settings路径,一定要正确

相关脚本

jenkins.sh

  1. #!/bin/sh
  2. ## java env
  3. export JAVA_HOME=/usr/java/jdk1.8.0_261-amd64
  4. export JRE_HOME=$JAVA_HOME/jre
  5. export JENKINS_HOME=/jenkins/conf
  6. ## exec shell name
  7. EXEC_SHELL_NAME=jenkins\.sh
  8. ## service name
  9. SERVICE_NAME=jenkins
  10. SERVICE_DIR=/jenkins
  11. JAR_NAME=$SERVICE_NAME\.war
  12. PID=pid/$SERVICE_NAME\.pid
  13. cd $SERVICE_DIR
  14. case "$1" in
  15. start)
  16. nohup java -Xms256m -Xmx1024m -XX:MaxPermSize=512m -jar $JAR_NAME --ajp13Port=-1 --httpPort=8099 > log/jenkins.out 2>&1 &
  17. echo $! > $SERVICE_DIR/$PID
  18. echo "#### start $SERVICE_NAME"
  19. ;;
  20. stop)
  21. kill `cat $SERVICE_DIR/$PID`
  22. rm -rf $SERVICE_DIR/$PID
  23. echo "#### stop $SERVICE_NAME"
  24. sleep 8
  25. TEMP_PID=`ps -ef | grep -w "$SERVICE_NAME" | grep "java" | awk '{print $2}'`
  26. if [ "$TEMP_PID" == "" ]; then
  27. echo "#### $SERVICE_NAME process not exists or stop success"
  28. else
  29. echo "#### $SERVICE_NAME process pid is:$TEMP_PID"
  30. kill -9 $TEMP_PID
  31. fi
  32. ;;
  33. restart)
  34. $0 stop
  35. sleep 2
  36. $0 start
  37. echo "#### restart $SERVICE_NAME"
  38. ;;
  39. esac
  40. exit 0

deploy.sh

  1. #!/bin/sh
  2. ## java env
  3. export JAVA_HOME=/usr/local/jdk8
  4. export JRE_HOME=$JAVA_HOME/jre
  5. ## exec shell name
  6. EXEC_SHELL_NAME=$1\.sh
  7. ## service name
  8. SERVICE_NAME=$1
  9. SERVICE_DIR=/home/admin/java-data/data
  10. JAR_NAME=$SERVICE_DIR/$SERVICE_NAME\.jar
  11. PID=pid/$SERVICE_NAME\.pid
  12. WORK_DIR=$SERVICE_DIR/work
  13. #function start
  14. start(){
  15. cd $WORK_DIR
  16. if [ ! -d "log" ]; then
  17. mkdir log
  18. fi
  19. nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME --spring.profiles.active=test >log/$SERVICE_NAME.out 2>&1 &
  20. echo $! > $SERVICE_DIR/$PID
  21. echo "#### start $SERVICE_NAME"
  22. }
  23. # function stop
  24. stop(){
  25. cd $WORK_DIR
  26. if [ -f "$SERVICE_DIR/$PID" ]; then
  27. kill `cat $SERVICE_DIR/$PID`
  28. rm -rf $SERVICE_DIR/$PID
  29. fi
  30. echo "#### stop $SERVICE_NAME"
  31. sleep 6
  32. TEMP_PID=`ps -ef | grep -w "$SERVICE_NAME" | grep "java" | awk '{print $2}'`
  33. echo "#### TEMP_PID $TEMP_PID"
  34. if [ "$TEMP_PID" == "" ]; then
  35. echo "#### $SERVICE_NAME process not exists or stop success"
  36. else
  37. echo "#### $SERVICE_NAME process pid is:$TEMP_PID ."
  38. kill -9 $TEMP_PID
  39. fi
  40. }
  41. # function clean
  42. clean(){
  43. cd $WORK_DIR
  44. if [ ! -d "lastDeploy" ]; then
  45. mkdir lastDeploy
  46. else
  47. rm lastDeploy/$SERVICE_NAME*
  48. fi
  49. if [ -f "$JAR_NAME" ]; then
  50. mv $JAR_NAME lastDeploy
  51. fi
  52. }
  53. case "$2" in
  54. start)
  55. start
  56. ;;
  57. stop)
  58. stop
  59. ;;
  60. restart)
  61. stop
  62. sleep 2
  63. start
  64. echo "#### restart $SERVICE_NAME"
  65. ;;
  66. clean)
  67. stop
  68. sleep 2
  69. clean
  70. echo "#### clean $SERVICE_NAME"
  71. ;;
  72. *)
  73. ## restart
  74. stop
  75. sleep 2
  76. start
  77. ;;
  78. esac
  79. exit 0

问题:

构建maven项目时,报错
Error: Could not find or load main class .usr.local.maven
image.png
原因是在全局配置了maven,取消配置即可
系统配置=》Maven项目配置
image.png

完整示例

image.png

image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png
补充,远程目录在Jenkins全局配置里设置即可,项目里不要再设置,否则会叠加