使用spring boot写了个检测考勤记录的程序,感觉部署太麻烦,准备用jenkins,项目上用的是svn,我用的git,遇到了不少坑,特此记录。
环境:系统是ubuntu
git服务器、Jenkins、应用部署服务器都是这一台
Jenkins安装
这个过程就不说了,比较简单,网上教程很多。
参考大神教程:
https://www.cnblogs.com/ityouknow/p/7899349.html
https://www.cnblogs.com/fakerblog/p/8482682.html
根据教程安装好jenkin,配置好各种插件和环境,比较重要的是Publish over SSH,需要测试成功
部署项目
这个也不详细说了,主要记录下遇到的问题
1.git检出代码权限问题
Failed to connect to repository : Command "git ls-remote -h git@140.143.241.138:/home/gitrepo/test.git HEAD" returned status code 128:
stdout:
stderr: Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
之前用git也比较少,看报错信息应该是没有权限,下面的凭据添加了好几个都不行
解决
参考网上的一种解决方案:https://www.jianshu.com/p/ed0edb93e234
为jenkins应用新建一个jenkins用户,用于检出代码
为jenkins生成SSH 私钥和公钥
将jenkins用户的公钥添加到git用户的authorized_keys文件中
然后配置检出代码的凭据就可以了,具体操作如下
#添加用户
useradd jenkins
#设置密码
passwd jenkins
#切换jenkins用户
su jenkins
#生成公钥私钥
ssh-keygen -t rsa -C "你的邮箱标识"
#在jenkins home路径下生成.ssh文件夹,里面包含两个文件
cd /home/jenkins/.ssh
ls
id_rsa id_rsa.pub
#其中id_rsa中存储的是私钥private key,id_rsa.pub是公钥public key
#接下来将jenkins的公钥也就是id_rsa.pub中的内容添加到git用户的authorized_keys文件中
#因为我jenkins和git都在同一台服务器上,可以直接使用下面的命令
cat /home/jenkins/.ssh/id_rsa.pub >> /home/git/.ssh/authorized_keys
配置凭据,username填写jenkins用户名,key中复制jenkins用户的私钥,也就是id_rsa文件中的内容
2.上传jar包到指定运行目录
上面的Name填写服务器地址
Source files填写jar包相对于jenkins工作区项目根目录的相对路径
比如我的工程jenkins拉取代码编译的jar包位置在
/home/ubuntu/.jenkins/workspace/Oalert/target/oalert-0.0.1-SNAPSHOT.jar
这里我只需要填写target/*.jar 之前填写的是/target/*.jar测试不成功
Remove prefix猜测可能是需要填写去掉的路径前缀,只留下文件名称,这里填写target/
Remote directory这里应该是将文件上传的相对路径,我在配置Publish over SSH插件信息时路径就是填写的jar包运行路径,这里空着
如果之前没有配置,这里应该填写的是相对于程序运行服务器用户home目录的路径,比如我的用户名是ubuntu,这里填写相对于/home/ubuntu的路径
Exec command这里填写上传完jar包文件后执行的命令
网上普遍做法是执行shell脚本,我也是采用这种方法,参考:https://www.cnblogs.com/fakerblog/p/8482682.html
echo `pwd` #这个命令可以在jenkins构建的时候在控制台记录打印当前所在路径
cd /home/ubuntu/Project/OAlert #进入到脚本所在路径
chmod 777 *.sh #为脚本添加运行权限
./stop.sh #运行脚本停止之前正在运行的程序
./start.sh #运行脚本启动新上传的jar包程序
stop.sh文件
#!/bin/bash
echo `pwd`
echo `ls -l`
echo "stop SpringBoot BAppApiServerApplication"
pid=`ps -ef | grep oalert-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{print $2}'`
echo “旧应用进程id:$pid”
if [ -n "$pid" ]
then
kill -9 $pid
fi
start.sh文件
#!/bin/bash
#指定jdk路径,这里我用默认的java不行,必须这么配置才能启动程序,原因不明
export JAVA_HOME=/opt/java/jdk1.8.0_161
echo ${JAVA_HOME}
echo "授权当前用户"
chmod 777 /home/ubuntu/Project/OAlert/oalert-0.0.1-SNAPSHOT.jar
echo "执行...."
cd /home/ubuntu/Project/OAlert
BUILD_ID=dontkillMe nohup ${JAVA_HOME}/bin/java -jar oalert-0.0.1-SNAPSHOT.jar > /dev/null &
echo "启动成功"
在这里两个地方需要注意
第一个是我本地必须指定java运行路径,不然程序不能启动,我看其他一些教程上都没有配置
第二个是在最后运行jar包的时候 在后面加上 > /dev/null & ,这样将不会在jenkins控制台打印记录,如果不加将会有超时提醒,不过不会影响程序运行
命令如果这么填写:BUILD_ID=dontkillMe nohup ${JAVA_HOME}/bin/java -jar oalert-0.0.1-SNAPSHOT.jar &
结果如下:
ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 286,436 ms]
Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE
Finished: UNSTABLE
加上之后:BUILD_ID=dontkillMe nohup ${JAVA_HOME}/bin/java -jar oalert-0.0.1-SNAPSHOT.jar > /dev/null &
结果如下:
授权当前用户
执行....
启动成功
SSH: EXEC: completed after 201 ms
SSH: Disconnecting configuration [140.143.241.138] ...
SSH: Transferred 1 file(s)
Finished: SUCCESS
目前没有找到更合适的处理方式