Jenkins 实践
Jenkins 实践
前言
老规矩,前言里吐槽一波。
每次写完代码,都需要本地 clean package
,然后上传jar包到服务器上运行,神烦。所以还是决定搭建Jenkins,来帮我做这些繁琐的事请;但是没想到的是,搭建个Jenkins都这么麻烦,费劲。
留档,一整套搭建时解决问题的流程。
Jenkins 是什么?
Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。
Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。
来源与Jenkins文档:https://www.jenkins.io/zh/doc/
准备
我是部署Java项目,需要在Jenkins服务器上进行打包和,所以需要事先安装jdk
和maven
其实服务器到手我已经装过openJdk-11
了,至于提前装maven也不是我的风格(我比较喜欢最后用的时候再装)
但是,我一开始是用docker装的Jenkins,一开始很顺利,内置Jenkins中文社区提供的源(应该是,不然一开始安装插件的时候不会这么快),但是配置的时候给我整吐了,由于用的是Jenkins文档里提供的docker命令,有些宿主机和容器目录的映射并没有加,比如:jre
和maven
,当我找到教程停掉docker修改容器配置文件n次仍无效后,果断docker rm jenkins
。就是这暴脾气。
安装jdk
和maven
就不做缀述了,openjdk
安装着老方便了,都不用配置环境变量一键安装。
安装Jenkins
如上所属,我最终抛弃了docker
安装Jenkins
,转而使用了war包,此相关内容Jenkins
官网也是有的
Jenkins Redhat Packages To use this repository, run the following command: sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key If you've previously imported the key from Jenkins, the rpm --import will fail because you already have a key. Please ignore that and move on. yum install epel-release # repository that provides 'daemonize' yum install java-11-openjdk-devel yum install jenkins The rpm packages were signed using this key: pub rsa4096 2020-03-30 [SC] [expires: 2023-03-30] 62A9756BFD780C377CF24BA8FCEF32E745F2C3D5 uid Jenkins Project sub rsa4096 2020-03-30 [E] [expires: 2023-03-30] 来源:https://pkg.jenkins.io/redhat-stable/
安装的war包路径在/usr/lib/jenkins/
配置文件在:/var/lib/jenkins
工作空间:/var/lib/jenkins/workspace
一般的默认目录,搜索引擎搜索下就有的。
当然,也可以直接下载war包去启动,都是可以的。我用的是上述方案。可以使用systemctl
相关命令。
启动Jenkins:systemctl start jenkins
找到初始密码:systemctl status jenkins
,一串类似于uuid的就是
打开页面:http://192.168.0.118:8080/ (内网服务器,暂时没走frp,走frp应该需要先在Jenkins里把url改成localhost:8080)
页面上有个路径,cat
一下也能找到密码
然后安装插件了(没有换源之前很慢,不过没关系,可以找教程先换了重启后再装,就算不换装失败了也没关系,进入Jenkins后再换中文社区的源再重新安装也行),配置url(上面提到的那个,先默认就行),然后就正式进入Jenkins了。
插件安装
Manage Jenkins > Manage Plugins > 高级
先把源给换掉,我是从清华的源换成Jenkins中文社区的源的,都可以
补装了刚刚未完成安装的插件后,再安装几个
汉化: Localization: Chinese (Simplified) 、 Locale plugin
剩下的用到了再装
配置项目
新建一个任务,我选的是”构建一个maven项目“
源码管理
选择git,因为我是GitHub拉代码的时候容易超时,所以用的是代理站地址
Credentials ,凭证,我添加了GitHub的账号和密码,其实随便天几下就好了,我这个是公开的仓库。
构建触发器
这个现在是默认的,以后可能会改成” 触发远程构建 (例如,使用脚本) “
构建环境
这里可以替换仓库里的某些文件,比如我的仓库里并没有放邮件的账号密码,但项目运行是需要的,所以我需要在这里替换掉仓库的application.propertiers
这是需要安装插件的: Config File Provider Plugin
具体的配置:https://www.cnblogs.com/muzipaopao/p/12018044.html
添加后是这样的
Pre Steps 准备步骤
我没搞
Build 构建
pom文件也没什么说的,clean package -Dmaven.test.skip=true
Post Steps 发布步骤
这里是忘记哪整的脚本,反正不敢怎么样都是输出Packaging failed
[[ -f target/hashicorp-vault-pipeline.hpi ]] && echo "Packaging successful" || echo "Packaging failed"
构建设置
看着是可以整邮件通知什么的,我没搞
构建后操作
很关键,因为我需要把打包好的jar放到远程服务器上去执行
需要插件: Publish Over SSH 、 Deploy to container Plugin
Publish Over SSH用于连接远程服务器
Deploy to container插件用于把打包的应用发布到远程服务器
具体配置: https://blog.csdn.net/ming19951224/article/details/80958761
相关配置:
密钥登录:https://www.cnblogs.com/lamp01/p/10456390.html
密钥配置失败处理:https://blog.csdn.net/woailyoo0000/article/details/79782986
转换密钥格式: ssh-keygen -p -m PEM -f /root/.ssh/Su123456
(这个命令使用FinalShell进行密钥登录时提示的,不然不能登录)
配置多态服务器使用不同密钥: https://blog.csdn.net/johnshen2017/article/details/113924893
构建项目
这些都配置完就可以保存并应用了。
点击构建
构建时可以插件控制台输出
如果报错可以根据提示进行相关处理,另外maven在Jenkins的配置我也忘记说了,百度一下你就知道。
相关报错处理
Jenkins用户操作root用户所有的文件:https://blog.csdn.net/Sarah_xye/article/details/117036289
打包失败:https://blog.csdn.net/u011590297/article/details/108589708
打包失败这个处理之前我还把pom.xml文件里的relativePath
注释掉了。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<!-- <relativePath/> lookup parent from repository -->
</parent>
ERROR: Error cloning remote repo 'origin':https://blog.csdn.net/wgl307293845/article/details/121384185
启动脚本
Jenkins构建后会链接远程服务器,上传打包后的jar,然后执行命令。
在”构建后操作“截图里有bash /usr/local/apps/webapps/start.sh
这个就是远程服务器上的启动脚本
内容如下:
#/bin/bash
#这里已经获取到了全路径
startJarPath=` ls -t /usr/local/apps/webapps/*.jar | head -1 `
echo $startJarPath
#判断是否获取到执行文件jar
if [ ! -n "$startJarPath" ]; then
echo "IS NULL"
else
echo "NOT NULL"
fi
#查询端口是否被占用
#lsof -i:8081 | awk '{print $2}' 会查到两行数据,分别是PID、和PID具体的值
#tail -n 1 会输出最后一行,正好是需要的PID的值,统里head是从前开始输出
pid=` lsof -i:8081 | awk '{print $2}' | tail -n 1 `
if [ ! -n "$pid" ]; then
echo "PID IS NULL"
else
echo "PID NOT NULL"
echo "PID:${pid}"
#杀死占用端口的pid,这里不能直接用“$pid”,这样杀不掉,需要改成“${pid}”,可能是跟字符串什么的有关
kill -9 ${pid}
fi
#basePath=/usr/local/apps/webapps/$startJarPath
#basePath=`pwd`/$startJarPath
#这个变量其实无用了,没删而已
basePath=$startJarPath
echo 执行目录如下:
echo $basePath
echo 开始执行。。。。
#nohup java -jar $basePath &
#标准执行命令,其他命令会导致Jenkins一直连接服务器直到超时
nohup java -jar $basePath > app.log 2>&1 &
echo “执行结束,success”
stop.sh
#/bin/bash
startJarPath=` ls -t /usr/local/apps/webapps/*.jar | head -1 `
echo $startJarPath
#判断是否获取到执行文件jar
if [ ! -n "$startJarPath" ]; then
echo "IS NULL"
else
echo "NOT NULL"
fi
#查询端口是否被占用
pid=` lsof -i:8081 | awk '{print $2}' | tail -n 1 `
if [ ! -n "$pid" ]; then
echo "PID IS NULL"
else
echo "PID NOT NULL"
echo "PID:${pid}"
kill -9 ${pid}
fi