- Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。
- 主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。
- Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。
- 通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
CI(Continuous integration持续集成)持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。
- CD(Continuous Delivery持续交付) 是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境。
- CD持续交付:
首先我们先明确主机id及其功能:
主机名称 | IP地址 | 功能 |
server3 | 172.25.254.3 | 作为gitlab服务器 |
server4 | 172.25.254.4 | 作为jenkins服务器 |
此时我们再开一个虚拟机用来安装jenkins:
jenkins官网下载:Jenkins 的安装和设置
国内镜像站:Index of /jenkins/redhat/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
jenkins要求java8的jdk:
可以看到jenkins的端口为8080。注:若是提示java版本原理一直启动不了,可以尝试手动安装更高版本的java包,但必须是java8的;或者用旧一点版本的jenkins。
此时可以看到我们要进行插件安装,但是官方的安装源特别慢,可以用以下方式查看哪个源比较快:
curl -sSL https://cdn.jsdelivr.net/gh/lework/jenkins-update-center/speed-test.sh | bash
多测试几次,选一个速度快的、稳定的源:
将此链路复制到:
注:在使用这个链路时,是需要证书的
- mkdir /var/lib/jenkins/update-center-rootCAs
- wget https://cdn.jsdelivr.net/gh/lework/jenkins-update-center/rootCA/update-center.crt -O /var/lib/jenkins/update-center-rootCAs/update-center.crt
- chown jenkins.jenkins -R /var/lib/jenkins/update-center-rootCAs
创建目录,将证书放进去:
此时会在jenkins目录下拉取一个default.json ,这个json文件就是我们从刚刚替换的url上下载下来的。
安装完成后:
直接使用admin账户进入:
管理插件 --> 安装中文插件:
安装完成后进入系统设置中 Configure System:
改完后退出再进来即可。
进来之后我们可以在源码管理这里将jenkins和gitlab仓库进行整合。
生产环境里,我们的代码托管在gitlab中,现在我们准备把项目代码从仓库中拉过来:
安装完成之后显示没有主机key:
因为我们是以ssh的方式连接,所以一定要有免密。我们在下面添加jenkins证书:
先将server4的公钥添加到gitlab上来:
我们将server3 gitlab主机上的私钥放到jenkins上来:
我们也可以描述一下我们添加的是什么:
此时git地址就ok了:
在gitlab中可以看到我们项目的主分支名称为 main:
我们可以设置轮询触发,每分钟触发一次:
我们可以设置在构建后简单的执行一个脚本:
然后保存即可。
接下来我们就可以等着看触发效果,我们也可以点图中红框内的按钮,手动触发:
点击控制台输出可以看到项目的工作记录:
可以看到拉取之后执行了我们写的shell命令。
显然,每分钟轮询一次是不合理的。我们希望的是gitlab中的代码或者文件一有变更,就直接触发jenkins进行变更。
我们回到工程配置里,更改触发器,首先我们要安装一个触发器插件:
再回去看我们的触发器,发现触发器选项里多了一项gitlab相关的:
往下翻,点击高级,点击生成密钥token(一定要点击下面的保存):
返回gitlab,点击 菜单--> 管理员,进入 设置--->网络:
将 允许来自webhook 和服务请求勾选上:
返回项目中,在 设置---> webhook中,在令牌处将刚刚的token复制过来:
添加成功:
此时gitlab会通知我们的jenkins,jenkins中收到触发后,项目进行构建:
此时收到触发后进行了第二次构建。
在server3的project1中进行更改,简单的写一个Dockerfile:
此时gitlab首先上传成功:
控制台输出可以看到详细的执行过程:
但是jenkins端,我们还没有进行任何的处理,我们只是单纯的把gitlab和jenkins做了一个整合,在jenkins端我们只是ls了一下,可操作空间还很大。我们接下来可以做在jenkins端写好代码,用Dockerfile文件直接构建镜像。此时整合的逻辑大致为:
用户把代码通过git提交push到gitlab上,然后gitlab触发jenkins的webhook,通知jenkins做构建。