Jenkins 实践

前言

老规矩,前言里吐槽一波。

每次写完代码,都需要本地 clean package,然后上传jar包到服务器上运行,神烦。所以还是决定搭建Jenkins,来帮我做这些繁琐的事请;但是没想到的是,搭建个Jenkins都这么麻烦,费劲。

留档,一整套搭建时解决问题的流程。

Jenkins 是什么?

Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。

Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。

来源与Jenkins文档:https://www.jenkins.io/zh/doc/

准备

我是部署Java项目,需要在Jenkins服务器上进行打包和,所以需要事先安装jdkmaven

其实服务器到手我已经装过openJdk-11了,至于提前装maven也不是我的风格(我比较喜欢最后用的时候再装)

但是,我一开始是用docker装的Jenkins,一开始很顺利,内置Jenkins中文社区提供的源(应该是,不然一开始安装插件的时候不会这么快),但是配置的时候给我整吐了,由于用的是Jenkins文档里提供的docker命令,有些宿主机和容器目录的映射并没有加,比如:jremaven,当我找到教程停掉docker修改容器配置文件n次仍无效后,果断docker rm jenkins。就是这暴脾气。

安装jdkmaven就不做缀述了,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中文社区的源的,都可以

换源.png

补装了刚刚未完成安装的插件后,再安装几个

汉化: Localization: Chinese (Simplified)Locale plugin

汉化不完全的解决方案

剩下的用到了再装

配置项目

新建一个任务,我选的是”构建一个maven项目“

  • 新建itme

源码管理

选择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

  • build

Post Steps 发布步骤

这里是忘记哪整的脚本,反正不敢怎么样都是输出Packaging failed

[[ -f target/hashicorp-vault-pipeline.hpi ]] && echo "Packaging successful" || echo "Packaging failed"

Post Steps

构建设置

看着是可以整邮件通知什么的,我没搞

构建后操作

很关键,因为我需要把打包好的jar放到远程服务器上去执行

需要插件: Publish Over SSHDeploy 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