本文不探讨如何安装配置jdk、maven、git等环境,不探讨jenkins如何安装,该安装哪些插件等。你要知道这些,可以看看 使用Jenkins配置SpringBoot的自动化构建,讲得很详细了。

全局工具配置

如果你的jdk、maven、git环境都是正常的,并且都配置了环境变量。那么只需在【全局工具配置】中做下环境配置

jenkins 本地 shell 启动 java jenkinsfile 执行脚本_本地部署

jenkins 本地 shell 启动 java jenkinsfile 执行脚本_maven_02

Post Steps

然后新建项目,很显然,我这里通过git来管理代码。并在Post Steps配置一把如下脚本。

jenkins 本地 shell 启动 java jenkinsfile 执行脚本_jenkins入门脚本_03

#export BUILD_ID=dontKillMe这一句很重要,这样指定了,项目启动之后才不会被Jenkins杀掉。
export BUILD_ID=dontKillMe

#指定最后编译好的jar存放的位置 即是发布目录
www_path=/home/pec/www
#Jenkins中编译好的jar位置  即是编译目录
jar_path=/var/lib/jenkins/workspace/demo-test/target
#Jenkins中编译好的jar名称 
jar_name=demo-test-0.0.1-SNAPSHOT.jar

#获取运行编译好的进程ID,便于我们在重新部署项目的时候先杀掉以前的进程
pid=$(cat /home/pec/www/demo-test.pid)

#进入指定的编译好的jar的位置
cd  ${jar_path}
#将编译好的jar复制到最后指定的位置
cp  ${jar_path}/${jar_name} ${www_path}
#进入最后指定存放jar的位置
cd  ${www_path}

if ${pid}; then  #判断进程号id是否存在
    echo "pid is null"
else
    kill -9 ${pid}  #杀掉以前可能启动的项目进程
fi    #if结束标志

#启动jar,指定SpringBoot的profiles为dev,后台启动
#java -jar -Dspring.profiles.active=dev ${jar_name} &
#启动jar,后台执行
java -jar ${jar_name} &

#将进程ID存入到demo-test.pid文件中
echo $! > /home/pec/www/demo-test.pid

这个脚本的意思是当jenkins编译完成,将编译的jar文件复制到copy目录/home/pec/www/下,执行jar包文件,并记录进程id。
实际上,编译的过程jenkins通过pom.xml以及maven插件的配合做得。之前配置的maven环境就是为了jenkins根据pom下载依赖和编译使用。 而发布的过程是通过Post Steps写的linux命令脚本来实现的。

遇到的问题
权限不足

jenkins 本地 shell 启动 java jenkinsfile 执行脚本_jar_04


权限不足,估计是很常见的问题之一了。执行vi /etc/sysconfig/jenkins命令,可以看到下图:

jenkins 本地 shell 启动 java jenkinsfile 执行脚本_maven_05


由上图可知,JENKINS_USERjenkins,不是root,而我的目录/home/pec/www还有jenkins相关操作目录是root用户新建的,使用权限都是root组的用户或者root用户(ps:不明白用户与组概念的,可以看看我的这篇文章)。所以执行以下命令:

[root@localhost ~]# chown -R jenkins:jenkins /var/lib/jenkins
[root@localhost ~]# chown -R jenkins:jenkins /var/cache/jenkins
[root@localhost ~]# chown -R jenkins:jenkins /var/log/jenkins
[root@localhost ~]# chown -R jenkins:jenkins /home/pec/www

重启jenkins服务:

service jenkins restart

还有另一种解决方法,就是,你可以把JENKINS_USER改成是jenkins,然后重启即可。

kill 执行失败问题

其实最开始的脚本,我是直接使用的kill -9 pid,而没有做判断,这样是不对的。所以才改成了判断脚本

if ${pid}; then  #判断进程号id是否存在
    echo "pid is null"
else
    kill -9 ${pid}  #杀掉以前可能启动的项目进程
fi    #if结束标志

事实上,这样也还是有可能执行不成功,因为,可能由于不可知因素导致pid进程已经死掉了,这样的话,会不会也会执行失败。笔者就不深入了,留给读者发挥的空间。

还有值得一说的是,root 用户可用 kill 命令来停止任何进程。如果您并非 root 用户,那么您要停止的进程必须已由您启动。