你平常在做自己的项目时,是否有过部署项目太麻烦的想法?如果你是单体项目,可能没什么感触,但如果你是微服务项目,相信你应该是有过这种感触的。
这种情况下,我一般会劝你了解一下Jenkins这个玩意。怎么了解呢?我会建议你阅读本文🤡。
本文分为两部分:
- 第一部分为Jenkins安装教程,会教你如何在Linux上安装Jenkins。
- 第二部分为一个简单的Jenkins自动化构建部署实例讲解。
你可以根据自己的意愿,选择性的跳过第一部分,因为第二部分才是重点。(通过目录可以快速翻到第二部分)
Jenkins安装
当前环境
- CentOS 7.8
- Java 11(注意当前jenkins支持的Java版本最低为Java11)
- FinalShell 3.9(操作环境)
安装Jenkins
PS:不建议使用Docker安装Jenkins,因为使用Jenkins的时候一般会调用外部程序,比如Maven、Docker、JDK、Nodejs等,所以我们最好直接安装在本机上,以避免不必要的麻烦。
1. 添加Jenkins源
执行下面两条命令:
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
2. 通过yum安装Jenkins
- yum -y install jenkins
3. 修改Jenkins端口号
- Jenkins默认端口号为8080,输入
vim /etc/sysconfig/jenkins
进行编辑,将JENKINS_PORT修改为自己想要的端口号,前提得保证修改后的这个端口没有被其他的进程占用。
-
这里修改了可能还不能生效,还需要修改另一个地方,输入以下指令进行编辑
vim /usr/lib/systemd/system/jenkins.service
# 找到下面的文字 Environment="JENKINS_PORT=8080" # 修改为自己想要的端口号 # :wq退出
-
修改完成后,重新加载配置文件,随后再重启Jenkins,此时的启动端口应该已经变成你修改的端口号了。
# 重新加载配置文件 systemctl daemon-reload # 重启jenkins systemctl restart jenkins
启动Jenkins
Jenkins可以单独指定Java路径,在
/etc/init.d/jenkins
文件内大概一百行左右的位置,在最上面加上你的java路径即可:
PS:当前Jenkins支持的最低Java版本为11,如果机器上只有Java8的朋友需要先安装Java11或以上版本。Linux下多版本Java建议通过系统自带的 alternatives 来管理,参考这篇文章外加自己琢磨搞定:linux alternatives命令详解 - lpfuture
-
输入
service jenkins start
,会弹出提示:Starting jenkins (via systemctl):,意思是正在启动,第一次启动比较耗时,此时耐心等待。如果提示超时失败,没关系,jenkins仍然在启动,只是第一次启动比较耗时。如果提示内容不是超时失败,那大概率是你的Java没安装好或者版本不对。
-
放行刚刚配置的端口
# 放行15369端口 firewall-cmd --zone=public --add-port=15369/tcp --permanent # 重新加载防火墙 firewall-cmd --reload # 查看是否已经开启 firewall-cmd --list-ports
如果你是在阿里云腾讯云等类似服务器上的话,那你还需要去控制台防火墙或者安全组开放这个端口,像这样:
开放端口时记得设置授权ip,建议你直接给自家ip地址授权全部端口号。
-
在浏览器输入ip+port,可以进入到Jenkins的初始化界面,第一次启动要等的比较久:
进入这个界面,说明你的Jenkins已经在启动中了。
初始化配置Jenkins
-
系统启动完毕后,系统会提示你查看并输入管理员密码,根据中显示的密码位置,打开该文件并将密码复制粘贴即可:
# 在服务器查看密码文件 cat /var/lib/jenkins/secrets/initialAdminPassword
-
密码输入成功后,进入插件安装界面,如果你是新手,直接使用推荐安装的插件即可:
-
系统开始安装插件,需要等待系统安装完毕,这一步可能要比较久,耐心等待:
安装过程中可能会出现部分插件安装失败的情况,没关系,全部处理完毕后可以选择重试。
-
安装完毕后,系统会提示你创建第一个管理员账户:
-
配置Jenkins访问地址,便于一些插件使用,一般会有默认值:
-
配置完成,点击开始使用Jenkins:
随后就进入到Jenkins的管理界面了,不同版本的Jenkins界面可能会不一样:
至此,Jenkins安装完毕。
扩展
如果你是使用Jenkins来对Java服务做持续集成的话,那么你还需要安装下面的插件:
- Maven Integration: Maven 集成管理插件。
- Docker plugin: Docker集成插件。
- Publish Over SSH:远程文件发布插件。
- SSH: 远程脚本执行插件。
- GitLab:拉取远程仓库代码插件。
安装插件在系统管理 -> 插件管理
里面
实例讲解
接下来,我会拿出我的用户微服务构建任务的实际配置来向你进行解读,当你了解了Jenkins自动化构建部署的工作原理后,你便可以很快的上手这个玩意,因为你会发现它是如此的简单。
此实例是基于我的开源项目校园博客的Jenkins部分进行讲解的,开源地址:stick-i/scblogs: 🎉校园博客,基于微服务架构且前后端分离的博客社区系统。项目后端技术栈:SpringBoot + SpringCloud + Mybatis-Plus + Nacos + MySQL + Redis + MQ + ElasticSearch + Docker。前端主要是基于Vue2和ElementUI进行开发的。 (github.com)
基本环境
在此之前,我需要介绍一下我的基本环境:
-
我的操作环境为Windows,但是我要把微服务部署到一台Linux服务器上去,包括Jenkins也是安装在这个上面的。
-
服务器上安装了Jenkins、Git、Docker、JDK、Maven、NodeJs,都是些拿来构建的东西,都是单独安装的,而不是跑在Docker上。
-
而项目服务都是跑在Docker上的,还有Redis这种轻量的中间件也跑在Docker上。
-
我的项目已经在Git仓库里放好了,放github或者gitee或者gitlab都行。
全局工具配置
在Jenkins上,我已经配置好了这些构建工具的路径,以便于Jenkins可以直接调用到他们,在系统管理 -> 全局工具配置
这个页面下,这张图有点长:
在这张图上,你可以看到其中有一部分的配置是有路径的,还有一部分配置是没有路径的,这是因为我把他们的命令路径加到了系统路径上,即使不添加完整路径,Jenkins也可以调用到它们。
创建任务
好,现在我们已经准备好环境了,可以创建一个任务来试试水了,输入任务名称,然后选择构建一个自由风格的软件项目
:
别问我在哪新建任务,请你返回首页好好看看:
任务配置
源码管理
现在我们已经进入到任务配置界面了,往下划到源码管理的地方,选择Git,然后填写仓库地址等信息:
添加Credentials的时候,如果你会使用SSH密钥的话,建议还是用这个,但你得在机器上进行格外的配置,这里我就不多说了,不会的话直接用账号密码也是可以的:
构建步骤(Build Steps)
第一步:调用Maven
点击增加构建步骤,由于我们是Maven管理的项目,需要先使用Maven构建,所以第一步就用调用顶层Maven目标
:
选择maven版本,然后target根据项目的实际情况编写,我的命令是这样的:
- 先构建jar包,执行install的过程中会先执行package的,所以我直接install。我的项目中单元测试是没怎么梳理的,所以我使用参数
-Dmaven.test.skip=true
跳过单元测试。 - 然后我得打包成docker镜像,我使用的是
dockerfile-maven-plugin
这个Maven插件,所以打包docker镜像的步骤就也放在maven里面了,构建docker镜像的信息都在项目的pom文件里面。
sh
复制代码
install -Dmaven.test.skip=true dockerfile:build -f user-service/user-server/pom.xml
构建完镜像了,接下来我们直接使用这个镜像创建容器然后运行就完事了。
第二步:执行shell启动容器
再添加一个构建步骤,正常情况下我们调用docker通过命令行调用就可以了,所以我们现在也添加一个执行shell
的步骤即可。
具体的命令也很简单,就这么几步:
- 清理之前的旧镜像。由于我们刚刚构建了一个新的镜像,新镜像和旧镜像的名称和版本我们是没有改的,所以旧的镜像就会自动变成
<none>
,使用命令docker image prune -f
就可以清理掉这部分镜像。 - 停止旧容器运行并删除旧容器。当然我们得先判断一下是否存在旧容器,使用容器名称来进行判断,这部分指令涉及到
shell
和docker
的命令知识,看不懂没关系,可以直接cv,注意修改容器名称就好。 - 调用docker启动容器,根据项目实际情况来设定不同的参数,我这里设置了网络模式为host,并且映射了一个容器卷,用于读取nacos的地址,再指定容器名称为
user-service
,最后指定使用的镜像名称。
大功告成!具体命令如下:
# 清理镜像 docker image prune -f # 清理容器 if [ -n "$(docker ps -a -f name=user-service --format '{{.ID}}' )" ] then #停止容器运行 docker stop $(docker ps -a -f name=user-service --format '{{.ID}}' ) #删除之前的容器 docker rm $(docker ps -a -f name=user-service --format '{{.ID}}' ) fi # 启动容器 docker run -d --net=host -v scblogs-config:/config -e PARAMS="$params" --name user-service scblogs/user-server
最后别忘了点击保存!
后记
经过上面这些步骤,我不仅安装好了Jenkins,还完成了一个基本的自动化构建脚本,这个脚本会调用maven把我的项目打包,然后构建成一个docker镜像,再通过一段shell命令去启动这个程序。
如果你想尝试启动这个构建任务的话,你可以回到主页点击右边的绿色符号。
当然,你大概率是会构建失败的😯。因为我的这份实例讲解并没有完全的讲清楚,甚至里面有很多步骤你都看不懂,是不是?
其实我并没有想写一份手把手的Jenkins使用教程,因为这要写的内容实在是太多了,我甚至可以因此写一本小册了!
还记得我在实例讲解的最开始写的吗?写这个构建案例的目的是让你了解Jenkins自动化构建的原理,如果你看到这里已经发现了,这自动化构建,其实就跟我们手动构建部署差不多!只不过是把手动操作的东西设定成了脚本,那你就已经有能力去自己摸索它了。
用用插件、写写脚本,就可以搞定自己项目的自动化部署啦。
实际情况是,我有一台服务器专门用于Jenkins自动化部署,还有一台服务器专门用于生产环境,这两台服务器都可以连接到外网,也可以互相访问到彼此。这是由于Jenkins构建时是会比较吃CPU的,为了不影响生产环境,所以我把它们分开了。当然,这种情况下,脚本也会稍微复杂一点,具体流程大概是下面这样的:
总结:
感谢每一个认真阅读我文章的人!!!
作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。