如果jenkins部署在内网,而生产环境存在DMZ区的话,此方式就不太适合了,需要考虑其它方式来部署升级。
由于jenkins部署在内网,生产环境在公网,所以中间需要一个安装包转移的过程,将内网的安装包copy到远程公网对应位置,可采用scp命令,同样也可以采用上传到远程服务器,在公网服务器上get下来,笔者采用是scp的方式。
采用scp存在一个问题,此命令会与人产生交互,无法在shell中自动完成,此时需要借助另外一个工具expect(Tcl语言的另一个衍生版),上篇文章已经介绍到【如何编写无须人工干预的shell脚本】
脚本如下:
#!/usr/local/bin/expect
set timeout 30
set password xxxxxx
spawn scp -P 10010 /usr/local/src/portal.war root@218.76.43.83:/home/server/apache-tomcat-7.0.70/webapps
expect {
"(yes/no)?"
{
send "yes\n"
expect "*assword:" { send "$password\n"}
}
"*assword:"
{
send "$password\n"
}
}
expect "100%"
expect eof
spawn ssh -l root 118.36.23.113 -p 10000 #远程登陆
expect "*assword:" { send "$password\n"}
expect "*#"
send "echo get into directory\r"
expect "*#"
send "cd /home/shell\r"#存放脚本的目录
expect "*#"
send "sh server-restart.sh \r" #远程的启动脚本
expect "*#"
#send "exit\r" -- 希望执行完sh脚本,退出远程服务。这么做导致war包部署时异常,这里要注释掉,统一交由jenkins的job来终结
expect "100%"
expect eof
interact
server-restart.sh脚本内部就如之前一篇《利用jenkins实现自动构建、部署,提升团队开发效率》中有提到,内容类似,这里不再赘述。