环境准备
服务器说明
本文使用3台服务器做演示
- 服务器A:代码仓库
- 服务器B:
该服务器装有jenkins默认会创建jenkins用户,方便管理权限,
创建一个server用户,tomat安装目录归属server用户所有
- 服务器C: 装有tomcat
B服务器也创建一个server用户,tomat安装目录归属server用户所有
SSH免密登录配置
- 为B服务器jenkins用户生成秘钥,一路回车即可。如遇到无法切换jenkins用户请参考
ssh-keygen -t rsa
- B服务器server用户生成秘钥,方法同上。
秘钥生成完成后你会发现没有authorized_keys 文件,需要自己创建一个即可,创建完成该文件需要600权限,执行以下命令
chmod 600 authorized_keys
- C服务器server用户生成秘钥并创建authorized_keys 文件,方法同上。
- 将B服务器jenkins用户生成的公钥(id_rsa.pub里的东西)分别配置到,A服务器的代码仓库目录拥有者,B服务器server用户,C服务器server用户的authorized_keys文件中
- 验证是否能免密登录,在B服务器切换jenkins用户
- 登录C服务器
[root@lw tomcat]#su jenkins [jenkins@lw tomcat]$ssh server@C服务器ip
- 登录B服务器serverr用户
[jenkins@lw tomcat]$ssh server@B服务器ip
- 显示以下图片登录成功(exit退出登录)
目录结构
- B服务器
[root@lw ~]#cd /home/
[root@lw home]#mkdir jenkins
[root@lw home]#cd jenkins/
[root@lw jenkins]#mkdir sh
[root@lw jenkins]#mkdir word
[root@lw jenkins]#tar -zxvf apache-maven-3.5.4-bin.tar.gz
-
/home/jenkins/sh 用来存放shell脚本
/home/jenkins/word jenkins临时工作目录
/home/jenkins/apache-maven-3.5.4 jenkins打包项目用
·在sh目录创建一个shell脚本
[root@lw jenkins]#cd sh
[root@lw sh]#vi springboot.sh
·加入以下代码,保存并退出
#!/bin/sh
路径) --restart-server= (是否重启服务) ]" ;
# 参数
# (git 仓库路径),
repository_url="";
# (构建 ID)
release_id="";
# (mvn 构建参数)
package_params="";
# (部署名称)
context_path="/ROOT";
# (应用名称)
app_name="";
# (部署机器)
hosts="";
# (web 容器的 Home 目录 )
web_home="";
# (备份路径)
backup_dir="";
# (APP 的安装路径)
app_home=
# (是否重启服务)
restart_server="";
deploy_type="normal";
if [ $# = 0 ];then
echo ${show_usage};
exit 1;
fi
#获取参数!
while [ -n "$1" ]
do
case "$1" in
--repository-url) repository_url=$2; shift 2;;
--release-id) release_id=$2; shift 2;;
--package-params) package_params=$2; shift 2;;
--repository-url) repository_url=$2; shift 2;;
--app-name) app_name=$2; shift 2;;
--context-path ) context_path=$2; shift 2;;
--hosts) hosts=$2; shift 2;;
--web-home) web_home=$2; shift 2;;
--backup-dir) backup_dir=$2; shift 2;;
--app-home) app_home=$2; shift 2;;
--restart-server) restart_server=$2; shift 2;;
--deploy-type) deploy_type=$2; shift 2;;
--) break ;;
*) echo $1,$2,${show_usage}; break ;;
esac
done
# 临时工作区
deploy_time=$(date +'%Y%m%d%H%M%S')
deploy_basic_path=/home/jenkins/word
deploy_app_path=$app_name/${opt_build_id}_${deploy_time}
# 临时工作文件目录deploy_basic_path + 应用名+ 构建 ID + 时间戳(201606061212)/.
deploy_full_path=$deploy_basic_path/$deploy_app_path
mkdir -p $deploy_full_path
cd $deploy_full_path
echo '当前工作目录为: ' $deploy_full_path
echo info : check out ${repository_url} ${release_id} ...
git archive --remote=${repository_url} ${release_id} | tar -x -C .
if [ $? != 0 ]; then
echo ${repository_url} is not a git repository;
exit 2;
fi
chmod -R 777 *
echo info : mvn clean package ${package_params}
#maven位置
/home/jenkins/apache-maven-3.5.4/bin/mvn clean package ${package_params}
chmod -R 777 *
target_path=$deploy_full_path/target${context_path}
war_name=${target_path}.war
# tomcat 操作
tomcat_opt(){
local hosts=$1;
local deploy_opt=$2;
local p_tomcat_opt=$3;
hosts=${hosts//:2375/''}
hostList=${hosts//,/ }
echo hostList is $1
for host in $hostList ; do
echo host_event `date "+%Y-%m-%d %H:%M:%S"` is $host
if [ $deploy_opt == "yes" ] ;then
echo info : chmod -Rf 777 $deploy_full_path
chmod -Rf 777 $deploy_full_path
echo info : unison ${target_path} ssh://server@${host}/${app_home}${context_path} -force ${target_path} -batch
unison ${target_path} ssh://server@${host}/${app_home}${context_path} -force ${target_path} -batch
fi;
echo p_tomcat_opt is $p_tomcat_opt
if [ $p_tomcat_opt == "restart" ];then
echo ansible $hosts -m shell -a "${web_home}/bin/shutdown.sh 10 -force ;nohup ${web_home}/bin/catalina.sh start "
ansible $hosts -m shell -a "${web_home}/bin/shutdown.sh 10 -force ;nohup ${web_home}/bin/catalina.sh start "
sleep 30s
fi
if [ $p_tomcat_opt == "stop" ];then
ansible $hosts -m shell -a "${web_home}/bin/shutdown.sh 10 -force "
fi
echo "build successfully ..." ${host}
done;
}
# 普通tomcat 运行环境部署
deploy_tomcat(){
echo "start deploy_tomcat ......"
echo unzip -oq ${war_name} -d ${target_path}
mkdir -pv ${target_path}
unzip -oq ${war_name} -d ${target_path}
local _tp='normal';
if [ $restart_server == 'YES' ] ; then
_tp='restart';
fi;
if [ $restart_server == 'FYES' ] ; then
_tp='frestart';
fi;
tomcat_opt ${hosts} 'yes' ${_tp} ;
}
# 如果maven构建成功, 则开始部署
if [ -f ${war_name} ];then
deploy_tomcat ;
echo "build successfully ..." ${hosts}
else
echo "build failed"
exit 10
fi
·如果以上操作不是用jenkins用户操作,则需要执行以下命令,否则构建会报各种权限不足错误
[root@lw sh]#chown -R jenkins:jenkins /home/jenkins/
[root@lw server]#cd /home/server/
[root@lw server]#mkdir tomcat
[root@lw server]#cd tomcat
[root@lw tomcat]#tar -zxvf apache-tomcat-8.5.30.tar.gz
[root@lw tomcat]#mv apache-tomcat-8.5.30 tomca-8080
[root@lw sh]#chown -R server:server /home/server
此台服务器端口为8080
- C服务器
[root@lw1 ~]#cd /home/server/
[root@lw1 server]#mkdir tomcat
[root@lw1 server]#cd tomcat
[root@lw1 tomcat]#tar -zxvf apache-tomcat-8.5.30.tar.gz
[root@lw1 tomcat]#mv apache-tomcat-8.5.30 tomca-8080
[root@lw1 tomcat]#vi tomcat-8080/conf/server.xml 修改端口为8050
[root@lw1 sh]#chown -R server:server /home/server
分别启动BC服务器tomcat并删除webapps下的所有东西
启动前修改bin目录下的catalina.sh文件,添加一行CATALINA_PID="/home/deploy/tomcat/mjs-app-prod/logs/tomcat.pid",即指定tomcat.pid位置/home/deploy/tomcat/mjs-app-prod/logs(可以任意修改),要不然以后启动的时候会kill不掉进程,无法构建的问题
在BC两台服务器安装tomcat的时候注意保持路径一直,并且用root操作时需注意修改目录所属用户,否则构建没有操作权限
配置jenkins构建
- 登录jenkins新建一个任务,选择一个自由风格项目
- 填写描述,勾选参数化构建
3. 构建项目
4. 分别访问两台服务器,端口为8080和8050,显示成功
说明
如果没有多台服务器,在填写参数化构建时只填写一个ip即可。