CI/CD简介
- CI(Continuous integration,中文意思是持续集成)是一种软件开发时间。持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。
- CD(Continuous Delivery, 中文意思持续交付)是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境。
“持续”是什么意思?
“持续”用于描述遵循我在此提到的许多不同流程实践。这并不意味着“一直在运行”,而是“随时可运行”。在软件开发领域,它还包括几个核心概念/最佳实践。这些是:
- 频繁发布: 持续实践背后的目标是能够频繁地交付高质量的软件。此处的交付频率是可变的,可由开发团队或公司定义。对于某些产品,一季度、一个月、一周或一天交付一次可能已经足够频繁了。对于另一些来说,一天可能需要多次交付也是可行的。所谓持续也有“偶尔、按需”的方面。最终目标是相同的:在可重复、可靠的过程中为最终用户提供高质量的软件更新。通常,这可以通过很少甚至无需用户的交互或掌握的知识来完成(想想设备更新)。
- 自动化流程: 实现此频率的关键是用自动化流程来处理软件生产中的方方面面。这包括构建、测试、分析、版本控制,以及在某些情况下的部署。
- 可重复: 如果我们使用的自动化流程在给定相同输入的情况下始终具有相同的行为,则这个过程应该是可重复的。也就是说,如果我们把某个历史版本的代码作为输入,我们应该得到对应相同的可交付产出。这也假设我们有相同版本的外部依赖项(即我们不创建该版本代码使用的其它交付物)。理想情况下,这也意味着可以对管道中的流程进行版本控制和重建。
- 快速迭代: “快速”在这里是个相对术语,但无论软件更新/发布的频率如何,预期的持续过程都会以高效的方式将源代码转换为交付物。自动化负责大部分工作,但自动化处理的过程可能仍然很慢。例如,对于每天需要多次发布候选版更新的产品来说,一轮集成测试integrated testing下来耗时就要大半天可能就太慢了。
Jenkins
Jenkins简介
Jenkins是一个开源的、可扩展的持续集成、交付、部署(软件/代码的编译、打包、部署)的基于web界面的平台。允许持续集成和持续交付项目,无论用的是什么平台,可以处理任何类型的构建或持续集成。
- Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
官网:https://jenkins.io/
官方文档:https://jenkins.io/doc/
Jenkins特性
- 开源的java语言开发持续集成工具,支持CI,CD;
- 易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理;
- 消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告;
- 分布式构建:支持Jenkins能够让多台计算机一起构建/测试;
- 文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等;
- 丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等。
Jenkins的安装
软件下载:https://jenkins.io/zh/download/
国内镜像站:https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/
- 准备好软件包,开始安装
rpm -ivh jdk-8u221-linux-x64.rpm
rpm -ivh jenkins-2.269-1.1.noarch.rpm
- 启动jenkins,更改更新插件源(这里的插件源不进行更新的话,在后面安装插件时,会出现问题,国外镜像站不一定能用)
systemctl start jenkins
刚开始未启动时,/var/lib/jenkins/目录里为空,当启动jenkins时,此目录出现很多文件。一般等到updates目录出现,就可以进行插件安装。
vim /var/lib/jenkins/hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
</site>
cd /var/lib/jenkins
ls
cd updates/
sed -i.bak 's/https:\/\/updates.jenkins.io\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
systemctl restart jenkins
- 在浏览器中输入http://192.168.0.110:8080进行访问
查看密码进行登录
cat /var/lib/jenkins/secrets/initialAdminPassword
使用admin登录
gitlab+jenkins实验
- 实验环境
主机 | 角色 |
---|---|
server2 | gitlab主机 |
server10 | jenkins主机 |
实验一:设置jenkins触发主动探测gitlab仓库
- 步骤一:在jenkins上创建项目
- 步骤二:为gitlab代码库配置认证
注意:这里出现了报错,原因有两个:(1)连接gitlab仓库时是使用git来连接的,检查一下server10上有没有安装git命令;(2)jenkins在连接gitlab仓库时应该选择一种连接方式(ssh或者http等)。
将gitlab主机的私钥添加在jenkins上
- 步骤三: 查看jenkins上构建的项目的返回结果
注意:仔细观察这个控制台输出信息,即就是jenkins主机通过ssh连接到gitlab仓库,将gitlab仓库中的东西,通过git命令拉取到jenkins主机的的对应目录下,然后再执行一次ls -l命令
这种触发方式的缺点:实时性差。例如上面设置的轮询,如果探测时间设置较短则做了太多的无用功(因为gitlab仓库中的东西不是每时每刻都会变化的);如果探测时间设置较长。不能够实时获取到最新的仓库资源。对我们工作效率有一定的影响。
实验二:设置gitlab仓库主动触发jenkins
- 实验环境:接着实验一继续做
- 步骤一:为jenkins安装gitlab插件
- 步骤二:在jenkins中进入工程test1,进行配置
- 接着点击这里的Advanced后进入高级设置,点击Generate生成一个Secret token
- 步骤三:在gitlab仓库中进行设置
而实验一中的控制台信息输出如下: