开启自动化之旅! Jenkins 在 Linux 中的安装指南

320 阅读11分钟

最近想学习下如何使用jenkins自动化部署项目,网上看了很多博文,但是真到自己实操阶段总是这不行那也不行的,没办法,还是自己参考网上各派所长,自己从零到一搞一个,废物不多说,先把需要的东西搭建起来

首先虚拟机,然后是Linux服务器,我这里使用的是CentOS7版本,这里搭建服务器就不多赘述了,直接从jenkins开始了,jenkins都知道是依赖java的,所以第一步得先装java环境 通过以下命令查看java版本

yum list java*    

如图所示

image.png 这里小小说明下,查看java的版本,注:带-devel的安装的是jdk,而不带-devel的,实际上安装的是jre,剩下的按照自己的服务器位数选择安装

这里我安装的是java11,因为比较新版的jenkins最新依赖是11,使用以下命令安装11

yum install -y java-11-openjdk-devel.x86_64  安装java

剩下的就是等待安装完成了,这个还有一个小贴士,如果你的服务器之前有安装其他java版本,如java8,那么你该怎么指定使用java8还是java11呢,答案是可以通过alternatives来管理你的java版本,如下命令

alternatives --config java 查看并配置你当前需要的java版本

如图所示,当你输入上述命令时,会显示你服务器上安装的所有java版本,通过选项编号就可以指定使用哪个版本的java,被指定的版本在选项序号前会显示一个+号作为标记

image.png

到这里java基本就安装完成了,接下来就是maven了,进入maven官网找到maven的.tar.gz结尾的下载链接,然后用wget 命令下载

wget https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz

这个maven版本jenkins没什么要求,所以下载官网当前显示的版本就可以,下载完成之后开始解压

unzip apache-maven-4.0.0-alpha-7-bin.zip  

如果没有安装wget和unzip命令可以使用yum install wget -y和yum install unzip -y安装下就ok了

解压完成,进入到maven的conf目录,找到settings.xml文件,使用命令 vim settings.xml打开它,然后在标签下把所有的都删除,最后加上下面这个mirror,也就是阿里云的仓库地址,这样后面下载依赖包的时候速度会更快,也不会失败

    <mirror>
          <id>aliyunmaven</id>
          <mirrorOf>*</mirrorOf>
          <name>阿里云公共仓库</name>
          <url>https://maven.aliyun.com/repository/public</url>
        </mirror>

做完这些,再编辑下配置文件,使用以下命令

    vim /etc/profile

在profile的顶部加上下面这两句,其中MAVEN_HOME根据你自身安装的路径来填,填完就和下图一样,保存退出

MAVEN_HOME=/root/app/apache-maven-3.9.9
export PATH=${MAVEN_HOME}/bin:${PATH}   

image.png

退出之后使用命令source /etc/profile刷新是配置生效,最后用命令mvn -v检查maven是否安装完成

到这里,maven也配置好了,接下来是git安装,git安装很简单

    yum install git -y

就一句,等待安装就好了 最后,就是安装主角jenkins,首先,添加Jenkins源,执行下面两条命令

    wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate;

    rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key;

执行完成之后执行jenkins安装命令

    yum install jenkins -y

如果安装出现xx 的公钥没有安装,执行下面命令

   wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo;

   rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key;

然后再次执行jenkins安装命令即可,剩下的时间就是等待安装完成了,如果安装顺利完成之后,就执行启动jenkins的命令

    service jenkins start

启动之后,我们可以验证,在windows中使用浏览器,输入自己的虚拟机ip+8080端口号,jenkins的默认端口就是8080,在做这步操作之前,防止防火墙禁止访问端口,先放行下8080端口,执行如下命令

    firewall-cmd --zone=public --add-port=8080/tcp --permanent  # 放行8080端口
    firewall-cmd --reload  # 重新加载防火墙
    firewall-cmd --list-ports # 查看是否已经开启

做完以上操作后大概率可以在浏览器上看到jenkins的输入密码界面了,根据界面提示的路径,复制然后加上cat 命令,在linux终端就可以看到输出的密码,复制然后粘贴到浏览器上就可以进入,进入之后就是定义用户名和密码,按照操作来就好了,这些都做完就会看到如下页面

image.png 这里直接选择安装推荐的插件进行安装即可,接下来就是漫长的等待插件安装的过程,如果途中大部分插件安装失败,可以选择重试,只有少数几个插件失败可以不用管,直接进入jenkins即可

image.png

进入之后大概就是这样的,网上很多都是汉化的,但是按照网上的方法汉化也不太行,如果有知道的朋友可以留言,这里就按照这种半英文版的样例来玩一玩了 配置jenkins,第一步是点击Tools进入配置界面,如下

image.png 这里是配置maven的settings文件路径,按照图上的来就ok了,但是路径还是填你之前安装maven的路径,接着往下翻,来到git这里,很简单,看图说话

image.png 最后翻到maven安装这里,点击新增maven,仍然是按照图中的来,这里的dd可以随意取名,然后路径还是一样,按照自己安装maven的路径来,最后应用保存返回

image.png 然后是插件的安装,点击Plugins进入插件安装界面,选择Available plugins,如图所示

image.png 这里要安装几个插件,分别是Maven Integration plugin、Gitee Plugin,安装gitee plugin是因为代码我放在gitee上,依次搜索安装这两个插件即可,等待安装完成后重启jenkins,重启命令是service jenkins restart

重启之后我们就可以开始创建Item了,如下图

image.png 这里选择构建一个maven项目,然后设置一个名称,点击应用就到item的配置界面了,如图

image.png

下滑到源码管理这里,选中Git,会弹出输入框让你填项目URL,如图

image.png 这里填上你需要自动化部署的项目在gitee上的地址,然后再点击图中的添加按钮,添加你gitee的凭证,可以是令牌,也可以是用户名密码 ,点击后会弹出添加页面,如图 image.png

按照要求填上用户名密码就可以,点击确认保存即可,然后在Credentials这里就可以选择你刚才添加的用户名密码了,别忘了修改你需要拉取的分支,想拉什么分支就修改为什么分支名称即可

接下来拉到Build这里,如图所示,配置上就可以了

image.png

其实配置到这里,你就已经可以拉取代码然后编译生成jar包了,保存之后退出点击My Views就可以看到刚才创建的那个item,然后点击运行按钮,或者点击item的名称进入详情页面,点击Build Now,点击后会看到构建历史这里会多一条记录,如下图,进入控制台输出就可以看到jenkins执行每一步的日志信息

image.png 第一次编译的时候时间会很长,完成之后进入到jenkins的工作目录去看是否有源代码和jar包,jenkins的工作目录一般为/var/lib/jenkins/workspace/,该目录下会有你创建的item的同名文件夹,源代码和jar就在该目录下

到这里自动拉取代码和编译代码的动作就完成了,但是应该还希望在修改或者提交代码的时候jenkins自动去执行这个item,所以,接下来就是配置这些动作的操作了,进入到之前创建的item的详情页中,点击配置按钮,重新进入配置界面,然后拉到构建触发器这里,因为之前安装了gitee插件,所以这里应该能看到Gitee webhook 触发构建这个选项,勾选它,就会出现下图所示的内容,不需要修改什么,默认就好,这里复制下选项里的URL

image.png

然后进入gitee进入到我们的项目中,点击管理,出现如下页面

image.png 然后选择webHooks,出现如下页面

image.png 点击添加webhook

image.png 这里的URL先填上之前在jenkins上复制的内容,然后这里要说明下,因为复制的ip和端口是属于本地的,所以gitee是访问不到的,如果需要访问应该使用内网穿透来映射,我这里使用花生壳,去官网下载,然后点击内网穿透,点击添加,如图

image.png 这里还有一个坑,我之前选的是TCP协议,导致一直无法自动执行任务,这里应该选择HTTPS协议,然后填上自己的内网主机ip和端口就可以了,最后用花生壳的映射域名去替换之前的ip和端口就可以了,像我映射的就是这样的,如图

image.png

后面/gitee-project/test按照jenkins上复制的来,只需要替换前面的ip和端口就好了,然后是这个webHook密码,重新回到jenkins界面,在刚才的勾选那里往下拉,找到gitee webHoot生成密码,点击生成,如下图

image.png 把生成的密码复制填到gitee那里,最后点击添加gitee的配置就ok了,然后再回到jenkins这里,继续往下翻,找到Post steps,然后选择Run only if build succeeds,点击Add post-build step,选择Execute shell,会出现一个填写命令的框框,把下面命令按照自己的目录修改即可

    #!/bin/bash

# 检查是否有正在运行的应用进程
api_pid=$(ps -ef | grep "*.jar" | grep -v grep | awk '{print $2}')

echo "api pid: $api_pid"

if [ "$api_pid" != "" ]; then
    # 如果有正在运行的进程,杀死它
    echo "kill api"
    kill -9 $api_pid

    # 等待3秒,然后再继续执行下面的命令
    sleep 3s
fi

# 检查 jar 包位置
jarfile_path="/var/lib/jenkins/workspace/test/target/*.jar"

echo $jarfile_path

if [ -z "$jarfile_path" ]; then
    echo "找不到 jar 包,请检查 jar 包位置"
    exit 1
fi

# 获取应用名称
# appName=$(basename $jarfile_path | cut -d '.' -f 1)

appName=$(basename $jarfile_path | sed 's/\.jar//g')


echo "app name: $appName"

# 设置BUILD_ID以防止Jenkins杀死进程
BUILD_ID=dontKillMe

# 将应用jar包移动到指定路径
mv $jarfile_path /usr/local/program/myweb

# 进入应用运行路径
cd /usr/local/program/myweb

# 使用nohup命令启动应用,并将输出重定向到log文件中
nohup java -jar $appName.jar >> myweb.log 2>&1 &

cat myweb.log

echo "应用已成功启动"

exit 0

上面应该关注的是/var/lib/jenkins/workspace/test/usr/local/program/myweb目录,第一个是我代码生成的目录,第二个是我定义的一个移动jar包的目录,第二个你可以按照我的名称来定义,但是第一个目录涉及到之前item的名称,所以需要修改,不然会出错,做完这些之后,还有一个问题,那就是权限问题,因为jenkins默认是以jenkins用户运行的,所以之前创建的/usr/local/program/myweb目录对于jenkins用户来说是没有权限的,所以需要加上这个目录的权限,在Linux终端执行命令chown -R jenkins /usr/local/program/myweb就可以了,配置完成后点击应用保存,退出后首先手动执行一遍看看配置的命令是否可以正常部署jar包,可以之后再通过修改代码然后提交到gitee上触发自动创建,看是否可行,所以到这里代码自动拉取编译打包部署的任务就结束了。

其实除了这个还有一种自动构建方式,回到之前的构建触发器那一步,可以选择如下图所示的触发远程构建,然后填写自己的token之后保存

image.png 可以直接使用浏览器访问ip加端口再加图片中JENKINS_URL后面一部分,然后修改token的值为之前填写的值,你会惊奇的发现它也会自动构建了,但是这个有一个缺点,那就是需要登录才能访问,如果你把该url放到post中去访问那么就会翻车了,那有方法可以解决吗,当然有,需要装另一个插件Build Authorization Token Root Plugin,安装完成之后使用ip加端口然后加上buildByToken/build?job=NAME&token=SECRET 这一段,替换自己的job名称和token,然后把它放到postmen执行,你会发现一样自动构建了,同理,你把这个url放到gitee的webHook中提交代码的时候同样可以起效果,不过的是不要忘记内网穿透,两种方式出现叠加态,最后,安利一个免费内网穿透的工具,natapp,使用教程可以参考这篇博文blog.csdn.net/weixin_6615… 这个工具个人使用完全免费

到这里,其实完成基本入门了,至少知道了通过jenkins如何拉取代码,编译代码,部署代码,然后自动构建任务等相关的功能,其实真正对于生产环境来说,jenkins和应用不可能在同一台服务器上,剩下的扩展可以在前面的shell脚本上下功夫,然后构建jenkins也提供了丰富的触发机制,通过这篇文章至少掌握了比较常见的触发机制,在以后的实战中如果碰上其他触发场景,也能做到举一反三,触类旁通的功效,因为,走完这一圈之后你会发现,jenkins也没有那么陌生了,我想这应该就是大脑已经开始接受这被强加的经验了吧。

最后,还是要送上一位名人曾说的一句话:手上没有剑和有剑不用是两回事!