jenkins 是一个提高敏捷开发效率的工具。
实践过程中,将项目的脚本化构建用 shell 编写成命令脚本,并附加在项目中,即使不使用 Jenkins,通过执行 shell 脚本也能够实现项目的自动化构建。这么做主要有如下考虑:
增强拓展性 即使没有 Jenkins,项目也能完成构建,增加构建的拓展性
减少对 Jenkins 的依赖 让 Jenkins 承担实践调度的角色,具体构建过程由标准化的脚本来完成。
既然 shell 脚本能够完成自动化构建,那么还需要用到 Jenkins 吗,是否冲突?答案是不冲突。shell 脚本配合 Jenkins 使用有两大方面优势:
使用 shell 脚本必须登录目标服务器,拥有相应的权限后,方能执行 shell 脚本,Jenkins 能够实现在不登录目标服务器的基础上,使用一对账号和密码,管理可视化的 Web 操作界面触发构建事件。 按需构建,开发者在提交完代码后,向 Jenkins 服务器发送一个信号,便可触发构建。
编写自动构建脚本的流程
平常使用写的自动构建的maven服务的脚本,做一个模板记录。
确定构建目录——更新依赖打包成功——进入工作目录,按时间备份之前的包体——新包移动替换到新的工作目录——找到已经启动的进程并杀死——启动新包
如果有使用守护进程的话,可以省略一步启动新包 后台启动 使用nohup command > output.log 2>&1 & 可以减轻日志压力,不会生成详细的nohup.out文件。 jenkins与工作目录不在同一服务器上时,需要配置密钥并传输到对应的服务器上。
下面是之前使用过的版本,有待改进(XD)
#!/bin/bash
deplay_path=/usr/local/
time_now=`date +'%Y%m%d%H%M%S'`
work_path=`pwd`
echo "***************start auto deploy script********************"
echo "work path: ${work_path}"
cd $deplay_path
echo "cd to path: " `pwd`
name=`find . -name service*.jar | awk -F '/' '{print $2}'`
if [ $name ];then
echo "service jar file exist , kill process, backup old jar file..."
ps -ef | grep ${name} | grep -v grep| awk '{print $2}' | xargs sudo kill -9
echo "kill ${name} pid, done..."
sleep 3
sudo mv $name ${name}_bak_${time_now}
echo "backup jar file, done..."
else
echo "service jar file not exist , continue..."
ps -ef | grep service-1.0-SNAPSHOT.jar | grep -v grep| awk '{print $2}' | xargs sudo kill -9
sleep 3
fi
cd ${work_path}/target
echo "cd to path: `pwd`"
name2=`find . -name service*.jar | awk -F '/' '{print $2}'`
if [ $name2 ] ;then
echo "`pwd` , find jar file is: ${name} ..."
sudo cp -p $name2 $deplay_path
if [[ $? == 0 ]];then
echo "copy file $name2 to $deplay_path, done..."
else
echo "copy file $name2 to $deplay_path, ERROR!!!please check!!!"
exit 1
fi
else
echo "`pwd` , not find jar file ,please check build , exit now. ERROR!!!"
exit 1
fi
cd ${deplay_path}
echo "cd to path: `pwd`"
echo "start ${name2} program..."
echo "nohup java -jar ./${name2} >${deplay_path}/nohup.out 2>&1 &" | sudo sh
sleep 5
if [[ $? == 0 ]];then
echo "program started..."
exit 0
else
echo "program start error !!!"
exit 1
fi
echo "***************finish auto deploy script********************"