上篇文章 jenkins 本地发布脚本中,通过cp命令将编译好的jar移动到同一个服务器中的另外发布目录,然后发布。正常情况肯定不会是这样的,他应该是其他服务器上指定的位置,并且服务器的数量可能还不止一个。

将一个文件从一个服务器移动到另一个服务器使用的是scp命令。但是使用shell脚本调用scp时会面临一个问题,即scp强制要求通过交互方式输入密码,而不像mysql等拥有-u -p选项。为了达成自动化部署,我们要借用expect脚本。

expect安装

cenos执行 yum install expect -y 命令安装脚本,因为其依赖了tcl,所以,也会跟着把tcl一起安装了。

jenkins 应用启动脚本 jenkins执行脚本_jenkins自动化部署脚本

Expect中最关键的四个命令是sendexpectspawninteract

  • 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,其脚本如下:

jenkins 应用启动脚本 jenkins执行脚本_服务器_02

#!/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。