Jenkins Publish Over SSH 远程自动发布
1、应用场景
Publish Over SSH 不是将war包发布到tomcat容器下,而是先利用该插件将build好的文件上传到远程linux 的指定目录下,然后利用该插件远程执行脚本将指定目录下的文件复制到tomcat的执行文件夹下,再利用脚本远程重启tomcat即可 。
2、发布环境要求
远程 tomcat部署在linux上,不支持 windows上远程发布
3、publish over ssh 插件安装和配置
a、 jenkins 控制台下 系统管理->管理插件->可选插件->通过搜索找到
“Publish Over SSH”,进行勾选安装。安装完毕重起jenkins网页控制台。
b、配置远程linux SSH的访问权限
系统管理->系统设置界面,滚动配置界面直至如下位置,会看到了多了Publish over SSH的配置选项,点击“增加”SSH Server,出现如下界面,分别填写远程linux的HostName(登录IP)、userName(linux ssh的用户名)。
4、现在构建一个maven项目来发布
5、填入代码提交的具体位置
6、配置自动构建(每晚凌晨自动构建)
Build Triggers 是一个持续集成的触发器插件,可以根据已经完成构建的结果,触发新Job或者传递参数
默认的选项是Build whenever a SNAPSHOT dependency is built,
意思是依赖于快照的构建意思是依赖于快照的构建,当代码有更新时就构建项目。
下面的Build periodically和Poll SCM可以设置定时自动构
Build periodically:定时构建。工作中更多以这种方式设置构建任务
Poll SCM:根据监听源代码的版本变化来触发构建,这里" */5 * * * * "代表每5分钟检测一遍git上的源代码,如果源代码发生变化则执行构建
Pre Steps选项用来配置构建前的工作,这里不做更改。
因为Maven项目,Build 选项有Root POM和Goals and options的设置,使用默认的打包就可以。
7、Post Steps选项设置构建
这里我们将war包拷贝到指定的tomcat的目录,删除项目原来的内容文件夹,并重启Tomcat。
clean 删除target文件夹及其下所有内容
package生成target目录,编译、测试代码,生成测试报告,生成jar/war文件
install在本地Repository中安装jar
mvn source:jar install -Dmaven.test.skip=true给任何目标添加maven.test.skip 属性就能跳过测试,打源码包
8、配置服务器脚本信息
Transfer Set Source Files这个路径默认是在项目的workspace中,因为构建好的war包在target目录中,所以这里指向了target/shop.war。
Remove prefix可以把target/shop.war的target/去掉,这样上传到服务器上就是shop.war,否则它会创建target目录。
domain可以与文件目录不一致。主要是 Sources files要与Jenkins上war的位置一致,package的名称需要与jenkins上war名一致
#!/bin/bash
#bash shell,shell中的一种,linux一般默认是bash shell
domain="man.picking.wms.dmall.com
" #给domain赋值,参数化
package="wms-picking-man-web"
deployid=${package}_${BUILD_ID}
#deployid=wms-picking-man-web_BUILD_ID,BUILD_ID=构建版本号
ports="(9000,8000)"
# make sure domain directory exists
#此句为注释
mkdir -p /web/domains/${domain}
#/web/domains/新建文件夹man.picking.wms.dmall.com
#-p参数:如果没有父目录会直接创建父目录
mkdir -p /web/logs/${domain}
# stop the running tomcat server
ps -aef | grep java|grep "/${domain}/"| grep -v grep | sed 's/ [ ]*/:/g' |cut -d: -f2 |xargs kill -9
#过滤java进程中包含${domain}的进程传递给xargs
#grep -v grep 过滤掉查询进程
#sed 's/ [ ]*/:/g'将获取到的进程数据,按照空格拆开用:隔开组合,[中间是空格]*匹配1个或多个空格
#cut -d: -f2 取:隔开的第二个字符
#xargs kill -9 等于 kill -9 PID 9是信号变量
#kill -9 pid等于kill -s 9 pid,表示强制,尽快终止一个进程
# unzip package
mkdir "/web/app/${domain}" #等于 mkdir -p /web/app/${domain}
mv /web/app/deploy/${package}.war /web/app/deploy/${deployid}.war #将war包重命名为项目名+构建号
rm -rf /web/app/${domain}/* #删除所有原目录下所有文件
echo "deploy ${domain} application" #打印提示:deploy man.picking.wms.dmall.com
application
unzip /web/app/deploy/${deployid}.war -d /web/app/${domain} #将需要部署的war包,解压到/web/app/man.picking.wms.dmall.com
#此文件夹为代码库
domain_conf="/web/servers/tengine/conf/domains/${domain}.conf"
if [ ! -f "${domain_conf}" ]; then #如果配置文件domain_conf不存在
cp /home/dmadmin/deploy/domain.conf ${domain_conf} #将/home/dmadmin/deploy/domain.conf拷贝到domain_conf去
sed -i "s/{domain}/${domain}/g" ${domain_conf} #将domain_conf文件中所有{domain}替换${domain}
else
sed -i "/weight=10 max_fails=2 fail_timeout=30s;/d" ${domain_conf} #否则,删除weight=10 max_fails=2 fail_timeout=30s;这行
fi
# deploy
for port in $ports; #ports中有多少个参数就执行多少次
do
port=${port//(/} #去括号,port=9000,800)
port=${port//)/}
# tomcat connection port
sd_port=`echo $port|cut -d "," -f1` #将port元素按照“,”分开,取第一个数
# tomcat shutdown port
conn_port=`echo $port|cut -d "," -f2`
# insert upstream into nginx domain
#######
sed -i "1 a server 172.16.195.30
:${conn_port} weight=10 max_fails=2 fail_timeout=30s;" ${domain_conf} #在${domain_conf}配置文件中第一行插入服务器数据,nginx监听
#copy conf to 193 server
scp -P 50027 -i /home/dmadmin/kp-lsq6dded ${domain_conf} [email protected]:/web/servers/tengine/conf/domains #当前服务器为172.16.195.30
#将当前服务器的配置文件domain_conf拷贝到119.254.210.145