编写自动化部署脚本之前要先确认git 插件  maven插件以及setting文件设置  jdk 插件都已经安装并配置到jenkins中

脚本实现思路

1.将git 项目下载到jenkins的工作空间里 /var/lib/jenkins/workspace

2.使用maven 打包构建项目

3.上传文件夹构建脚本到目标服务器

3-1.修改文件夹构建脚本中项目路径变量为当前项目路径

3-2.并执行构建不存在的目标文件夹 然后删除文件夹构建脚本

4.上传jar包到目标服务器

5.上传执行脚本到目标服务器

5-1.修改执行脚本中的jar包全路径变量为当前项目jar包全路径

6.执行启动脚本

 

jenkins pipeline脚本示例:

node () {
def workspace = pwd()
user='root'
passwd='*******'
project_name='scf-gateway'
jar_name='scf-gateway-1.0.0-SNAPSHOT.jar'
server_path='/var/lib/jenkins/workspace/server.sh'
haveDivectory_path='/var/lib/jenkins/workspace/haveDivectory.sh'
currentpath='/data/'+project_name+'/'+jar_name
project_path='/data/'+project_name+'/'
	/**
	* 项目检出 新项目复制脚本只需要修改project_name 和 jar_name 两个变量 在项目结构不一致情况下需注意下方两个注释处区别
	**/
  stage 'checkout'
     git branch: branches, credentialsId: 'git_account', url: 'http://192.168.0.246:2080/scf-ms/scf-gateway.git'
    
	 /**
     * 项目构建 当项目结构为单项目体结构时使用"cd $workspace/"  项目结构为多项目结构式使用 "cd $workspace/$project_name/"
     **/
	stage 'Build'
    sh """
        cd $workspace/
        /usr/local/maven/apache-maven-3.6.1/bin/mvn clean install -Dmaven.test.skip=true -P $activation
 """
	
	stage 'delete_old'
    sh """sshpass  -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$environment_ip' "rm -rf  $currentpath && rm -rf /data/$project_name/server.sh"
    """
     /**
     * 上传文件 当项目结构为单项目体结构时使用"cd $workspace/target"  项目结构为多项目结构式使用 "cd $workspace/$project_name/target"
     **/
    stage 'upload'
    sh """
    cd $workspace/target
	sshpass -p '$passwd' scp -o StrictHostKeyChecking=no '$haveDivectory_path' '$user'@'$environment_ip':/haveDivectory.sh
	sshpass  -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$environment_ip'  "sed -i 's#targetServerPath#$project_path#g' /haveDivectory.sh"
	sshpass  -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$environment_ip' "cd / && sh haveDivectory.sh && rm -rf haveDivectory.sh"
    sshpass -p '$passwd' scp -o StrictHostKeyChecking=no '$jar_name' '$user'@'$environment_ip':$currentpath
    sshpass -p '$passwd' scp -o StrictHostKeyChecking=no '$server_path' '$user'@'$environment_ip':/data/$project_name/server.sh
    sshpass  -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$environment_ip'  "sed -i 's#currentappath#$currentpath#g' /data/$project_name/server.sh"
    """
    /**
	* 启动项目
	**/
    stage 'restart'
    sh """
    sshpass  -p '$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$environment_ip' "cd $project_path && sh server.sh restart"
    """
    echo 'done_______________'
}

变量说明

1.workspace=pwd()  是获取当前项目所在工作空间一般在jenkins安装目录下的workspace目录下可以找到

2.user 目标服务器的链接用户名

3.passwd 目标服务器的密码

4.project_name 当前项目名称

5.jar_name 当前项目打包后jar包名称

6.server_path 原始启动脚本(未修改项目路径的脚本)地址

7.haveDivectory_path 原始在目标服务器创建目标文件夹脚本地址(未修改项目路径的脚本)

8.currentpath 目标服务器jar包所在全路径

9.project_path 目标服务器项目所在路径

10.branches git源码分支变量(页面配置多选)

11.environment_ip 目标服务器ip地址(页面配置多选)

12.activation 配置文件环境变量 (页面配置多选。需要在maven项目中pom中设置profiles参数变量)

13.git_account 是在jenkins中配置的全局凭证(git仓库的用户名密码)

 

2.jenkins配置变量示例

Jenkins pipeline发布应用 jenkins pipeline git_jar

 

3.原始新建文件夹脚本示例:(使用shell命令修改'targetServerPath'变量)

#!/bin/bash

if [ ! -d 'targetServerPath' ];then
mkdir targetServerPath
else
echo "文件夹已经存在"
fi

4.原始启动服务脚本示例:(修改shell命令修改'currentappath'变量)

#!/bin/bash
export JAVA_HOME=/usr/local/jdk1.8.0_101/
export JRE_HOME=/$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

#这里可替换为你自己的执行程序,其他代码无需更改

APP_NAME=currentappath
#使用说明,用来提示输入参数
usage() {
    echo "Usage: sh robotcenter.sh [start|stop|restart|status]"
    exit 1
}

#检查程序是否在运行
is_exist(){
  pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
  #如果不存在返回1,存在返回0     
  if [ -z "${pid}" ]; then
   return 1
  else
    return 0
  fi
}

#启动方法
start(){
  is_exist
  if [ $? -eq 0 ]; then
    echo "${APP_NAME} is already running. pid=${pid}"
  else
    nohup java -jar ${APP_NAME}  >info.out 2>&1 &
  fi
}

#停止方法
stop(){
  is_exist
  if [ $? -eq "0" ]; then
    kill -9 $pid
  else
    echo "${APP_NAME} is not running"
  fi  
}

#输出运行状态
status(){
  is_exist
  if [ $? -eq "0" ]; then
    echo "${APP_NAME} is running. Pid is ${pid}"
  else
    echo "${APP_NAME} is NOT running."
  fi
}

#重启
restart(){
  stop
  sleep 5
  start
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
  "start")
    start
    ;;
  "stop")
    stop
    ;;
  "status")
    status
    ;;
  "restart")
    restart
    ;;
  *)
    usage
    ;;
esac