在没有ssh插件的Jenkins环境中部署Java项目

660 阅读1分钟

Jenkins安装参考:

www.cnblogs.com/wfd360/p/11…

Jenkins相关资料已经非常多了,但是大多都安装了Publish over ssh插件,但是我在公司部署项目时发现没有这个插件,所以只能写进shell脚本了

一、新建任务

选择项目类型

任务描述

关联git

添加git凭据

构建触发器

构建shell

shell脚本:

##1.进入到项目所在目录并打包项目为jar包
cd /home/linux/.jenkins/workspace/test

echo mvn clean install
mvn clean install

sleep 3
echo trans

##2.从jenkins默认目录复制jar包到指定位置
cp -rf /home/linux/.jenkins/workspace/test/main/target/main.jar /home/linux/test/main.jar

##3.上传jar包文件到另一台服务器
scp -r /home/linux/test/main.jar linux@10.0.0.1:/home/linux/jar/newJar
sleep 3

##4.连接其他服务器
ssh -tt linux@10.0.0.1 > /dev/null 2>&1 << eeooff

##5.备份服务器端原先JAR包
cd /home/linux/jar
cp -rf /home/linux/jar/main.jar /home/linux/jar/jar_bak

##6.替换JAR包并重启
cp -rf /home/linux/jar/newJar/main.jar /home/linux/jar
sleep 3

sh autoDeploy.sh restart

sleep 3

exit 0
eeooff

echo done

完成配置

在服务器端/home/linux/jar部署autoDeploy.sh

#!/bin/bash

# 定义常量
# 要运行的jar包名
JAR_NAME="XXX.jar"

# 日志路径
LOG_PATH="./log/XXX-`date +%F`.log"

# 输入格式不对,给出提示
tips(){
	echo ""
	echo "please use command : sh autoDeploy.sh [ start | stop | restart | status ]"
	echo ""
	exit 1
}

# 启动方法
start(){
	
	# 获取pid
	pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`

	# -z 表示如果$pid 为空时执行
	if [ -z $pid ]; then
		nohup java -jar $JAR_NAME >> $LOG_PATH 2>&1 &
		pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
			echo ""
		echo "Service ${JAR_NAME} is starting! pid=${pid}"
			echo ""
        
                # 如果出现success即退出,没有则显示日志
		tail -f $LOG_PATH | sed '/success/q'
			
			echo"...................Start successful............................"
	else
			echo ""
		echo "Service ${JAR_NAME} is already running , it's pid = ${pid} . "
			echo ""
	fi	
}

# 停止方法
stop(){
	
	# 获取pid
	pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
	
	# -z 表示如果$pid 为空时执行
	if [ -z $pid ]; then
			echo ""
		echo "Service ${JAR_NAME} is not running!"
			echo ""
	else
		kill -9 $pid
			echo ""
		echo "Service stop successful! pid : ${pid} which has been killed forcibly!"
			echo ""
	fi			
}

# 运行状态
status(){
	# 获取pid
	pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
	
	# -z 表示如果$pid 为空时执行
	if [ -z $pid ]; then
			echo ""
		echo "Service ${JAR_NAME} is not running!"
			echo ""
	else
			echo ""
		echo "Service ${JAR_NAME} is running , it's pid = ${pid} . "
			echo ""
	fi		
}

# 重启方法
restart(){
		echo ""
		echo "........................... Restarting .............................."
		echo ""
		
	# 获取pid
	pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
	
	# -z 表示如果$pid 为空时执行
	if [ -z $pid ]; then
		echo "................Program is not starting yet........................."
        else
                kill -9 $pid
	fi

	start
		echo "........................ Restart successful .........................."
}

# 根据输入参数执行对应方法,不输入则执行tips提示方法
case "$1" in
	"start")
		start
		;;
	"stop")
		stop
		;;
	"status")
		status
		;;
	"restart")
		restart
		;;
	*)
		tips
		;;
esac
		

tips:

1. ssh远程登录时需要验证远程服务器密码,脚本无法执行

Host key verification failed

**解决:**设置ssh免密登录

(1)客户端生成公私钥

shell脚本中是Jenkins主动连接项目服务器,所以Jenkins相当于是客户端,项目所在是服务器端

ssh-keygen

上面这个命令会在用户目录.ssh文件夹下创建公私钥

cd ~/.ssh
ll -a

如下两个密钥:

id_rsa (私钥)
id_rsa.pub (公钥)   

(2)上传公钥到项目服务器

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.1(服务器root用户,也可以是其他用户)

上面这条命令是写到项目服务器上的.ssh目录下去了

cd ~/.ssh
vi authorized_keys  //或者是 vi know_hosts

可以看到客户端写入到服务器的 id_rsa.pub (公钥)内容

(3) 测试免密登录

ssh root@192.168.1.1

2. 执行时可能会报 xxx.sh : line 2 : $'\r' : command not found,原因是Windows中的回车是“\n”, Linux中的回车是“\r\n”. 所以用Windows下的编辑器会不能识别。

解决:在Linux部署脚本时:用vi打开,命令模式下 set ff=unix 即可

vi XXX.sh


:set ff=unix

  

二 、构建

构建失败,查看控制台输出

构建成功

进入服务器,查看项目日志,over