上篇文章 jenkins 本地发布脚本中,通过cp命令将编译好的jar移动到同一个服务器中的另外发布目录,然后发布。正常情况肯定不会是这样的,他应该是其他服务器上指定的位置,并且服务器的数量可能还不止一个。
将一个文件从一个服务器移动到另一个服务器使用的是scp命令
。但是使用shell脚本调用scp时会面临一个问题,即scp强制要求通过交互方式输入密码,而不像mysql等拥有-u -p选项。为了达成自动化部署,我们要借用expect脚本。
expect安装
cenos执行 yum install expect -y
命令安装脚本,因为其依赖了tcl
,所以,也会跟着把tcl
一起安装了。
Expect
中最关键的四个命令是send
、expect
、spawn
、interact
。
- send:用于向进程发送字符串
- expect:从进程接收字符串
- spawn:启动新的进程
- interact:允许用户交互
服务器间文件传输
首先来做一个小实验,需求是将文件重A服务器传输到B服务器
。这里利用Expect
来实现两台服务器间的文件传输。
在A服务器
指定目录/home/pec/tmp
下新建一个tranport.sh
cd /home/pec/tmp //切换到指定目录
touch tranport.sh //创建文件
vi tranport.sh //编辑
在tranport.sh
添加以下内容:
#!/usr/bin/expect
spawn scp -P 22 /var/lib/jenkins/workspace/demo-test/target/demo-test-0.0.1-SNAPSHOT.jar root@192.168.56.103:/home/pec/www
expect "*assword" {set timeout 300; send "123456\r";}
expect "*#"
interact
说明:
1. /var/lib/jenkins/workspace/demo-test/target/demo-test-0.0.1-SNAPSHOT.jar
表示的是A服务器的文件路径,
2. root@192.168.56.103:/home/pec/www
表示 【B远程主机的用户名
@B远程主机的ip地址
:B远程主机上接收文件的目录
】
3. 123456
表示 B远程主机的密码
最后一步就是执行tranport.sh
文件了,注意执行之前,要给tranport.sh
可执行的权限,不然是无法执行的。
chmod +x startup.sh //赋予文件可以行的权限
./startup.sh //执行文件
按照提示,就可以将文件从一台服务器,传输到另一台服务器了。读者可以在B的服务器目录查看下。
远程发布脚本
需求和上述情况基本是一样的,利用jenkins将服务器A编译打包好的jar包,远程传送到B服务器,并让其在B服务器上运行起来
。
把工作区分,A服务器上的jinkens
负责编译打包并执行B服务器上的发布脚本。B服务器则准备好发布位置和发布脚本,供服务器A调用。当然这里B服务器得有Java运行环境才行。
B服务器先做好准备:
- 发布目录:
/home/pec/www
- 发布脚本:
startup.sh
- 存储pid的文件:
demo-test.pid
以上名字都随便取,只要后缀一样,并且使用时别用错就行。
mkdir /home/pec/www //新建目录
cd /home/pec/www //切换至目录下
touch demo-test.pid //新建存储pid的文件
touch startup.sh //新建脚本文件startup.sh
chmod +x startup.sh //给脚本startup.sh赋予可执行的权限
vi startup.sh //编辑
在startup.sh
文件中添加以下代码:
#!/bin/bash
www_path=/home/pec/www
jar_name=demo-test-0.0.1-SNAPSHOT.jar
pid=$(cat /home/pec/www/demo-test.pid)
if ${pid}; then
echo "pid is null"
else
kill -9 ${pid}
fi
cd ${www_path}
java -jar ${jar_name} &
echo $! > /home/pec/www/demo-test.pid
OK,B服务器得准备工作就都完成了。
A服务器上要做的事情:
其他的就不看了,直接给脚本吧,在jenkins
任务中配置Post Steps
,其脚本如下:
#!/bin/bash
export BUILD_ID=dontKillMe
www_path=/home/pec/www
jar_path=/var/lib/jenkins/workspace/demo-test/target
jar_name=demo-test-0.0.1-SNAPSHOT.jar
expect -c "
spawn scp -P 22 ${jar_path}/${jar_name} root@192.168.56.103:${www_path}
expect \"*assword\" {set timeout 300; send \"123456\r\";}
expect \"yes/no\" {send \"yes\r\"; exp_continue;}
"
expect -c "
spawn ssh root@192.168.56.103
expect {
\"*assword\" {set timeout 300; send \"123456\r\";}
\"yes/no\" {send \"yes\r\";exp_continue}
}
expect \"*#\"
send \"cd /home/pec/www\r\"
expect \"*#\"
send \"sh startup.sh\r\"
expect \"*#\"
send \"exit\"
"
保存后立即构建即可完成服务的远程发布。这里没有具体些jenkins的配置和其他东西,那些如JDK、mvaen、git等配置,请读者自行Google。