目录
什么是持续集成
持续集成(CI)
持续集成(Continuous integration)指的是频繁地(一天多次)将代码集成到主干。它的好处主要有两个:
- 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
- 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
Martin Fowler 说过,"持续集成并不能消除 Bug,而是让它们非常容易发现和改正。"
持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。
持续交付(CD)
持续交付(Continuous delivery)指的是频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
持续交付可以看作持续集成的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。
持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-likeenvironments)中。比如我们完成单元测试后,可以把代码部署到连接数据库的 Staging 环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境中。
在TEST环境测试完,在STAGING类生产环境可能会有各种各样的问题,本版问题,内存条问题,等等
持续部署
持续部署(continuous deployment)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。、
- 持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。
- 持续部署的前提是能自动化完成测试、构建、部署等步骤。
持续集成的操作流程
根据持续集成的设计,代码从提交到生产,整个过程有以下几步。
提交
流程的第一步,是开发者向代码仓库提交代码。所有后面的步骤都始于本地代码的一次提交(commit)。
测试(第一轮)
代码仓库对commit 操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。
测试的种类:
代码仓库对commit 操作配置了钩子(hook),只要提交代码或者合并进主干,就跑自动化测试。
测试的种类:
- 单元测试:针对函数或模块的测试
- 集成测试:针对整体产品的某个功能的测试,又称功能测试
- 端对端测试:从用户界面直达数据库的全链路测试
第一轮至少要跑单元测试。
构建
通过第一轮测试,代码就可以合并进主干,就算可以交付了。
交付后,就先进行构建(build),再进入第二轮测试。所谓构建,指的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源(样式表、JS脚本、图片)等等。
常用的构建工具如下:
- Jenkins
- Travis
- Codeship
- Strider
Jenkins 和 Strider 是开源软件,Travis 和 Codeship 对于开源项目可以免费使用。它们都会将构建和测试,在一次运行中执行完成。
测试(第二轮)
构建完成,就要进行第二轮测试。如果第一轮已经涵盖了所有测试内容,第二轮可以省略,当然,这时构建步骤也要移到第一轮测试前面。
第二轮是全面测试,单元测试和集成测试都会跑,有条件的话,也要做端对端测试。所有测试以自动化为主,少数无法自动化的测试用例,就要人工跑。
需要强调的是,新版本的每一个更新点都必须测试到。如果测试的覆盖率不高,进入后面的部署阶段后,很可能会出现严重的问题。
部署
通过了第二轮测试,当前代码就是一个可以直接部署的版本(artifact)。将这个版本的所有文件打包( tarfilename.tar * )存档,发到生产服务器。
生产服务器将打包文件,解包成本地的一个目录,再将运行路径的符号链接(symlink)指向这个目录,然后重新启动应用。这方面的部署工具有Ansible,Chef,Puppet等。
回滚
一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改一下符号链接,指向上一个版本的目录。(就是类似于软链接指向上个版本)
Jenkins简介
Jenkins,原名Hudson,2011年改为现在的名字,它是一个开源的实现持续集成的软件工具。官方网站:http://jenkins-ci.org/。
Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。
特点:
- 易安装:仅仅一个 java -jar jenkins.war,从官网下载该文件后,直接运行,无需额外的安装,更无需安装数据库;
- 易配置:提供友好的 GUI配置界面;
- 变更支持:Jenkins能从代码仓库(Subversion/CVS)中获取并产生代码更新列表并输出到编译输出信息中;
- 支持永久链接:用户是通过 web来访问Jenkins的,而这些web页面的链接地址都是永久链接地址,因此,你可以在各种文档中直接使用该链接;
- 集成 E-Mail/RSS/IM:当完成一次集成时,可通过这些工具实时告诉你集成结果(据我所知,构建一次集成需要花费一定时间,有了这个功能,你就可以在等待结果过程中,干别的事情);
- JUnit/TestNG 测试报告:也就是用以图表等形式提供详细的测试报表功能;
- 支持分布式构建: Jenkins可以把集成构建等工作分发到多台计算机中完成;
- 文件指纹信息: Jenkins会保存哪次集成构建产生了哪些jars文件,哪一次集成构建使用了哪个版本的jars文件等构建记录;
- 支持第三方插件:使得 Jenkins 变得越来越强大
jenkins安装及使用
Docker环境下的安装
apt install docker.io
systemctl status docker
apt update #更新库
sudo apt-get upgrade
下载Jenkins的Docker镜像
docker pull jenkins/jenkins:lts #最新版本lst
在Docker容器中运行Jenkins 10.0.0.100:8080
docker run -di --name=jenkins -p 8080:8080 -v /mydata/jenkins_home:/var/jenkins_home
jenkins/jenkins:lts
有可能启动失败,是权限问题啊,用以下命令解决
chown -R 1000 /mydata/jenkins_home
使用管理员密码进行登录,可以使用以下命令从容器启动日志中获取管理密码
docker logs jenkins
cat /mydata/jenkins_home/secrets/initialAdminPassword #亦可以看到
[root@ubuntu2004 ~]#cd /mydata/jenkins_home/ #jenkins的相关目录
安装推荐的插件
如果失败了几个可以多点几次重试
安装完成后,创建管理员账号
进行实例配置,配置Jenkins的URL
至此,Jenkins开始使用
插件安装
红色为不建议安装 安装是否成功都可以显示出来:灰色-等待,红色-失败,蓝色-成功
失败多试几次 可以上传插件
配置JDK和Maven
进入全局配置
最后点击保存即可
配置ssh
ssh目前没有修复,但是我们使用内网部署,不存在这种情况,外网部署的情况需要慎重考虑
需要创建凭据,先去创建
之后在配置ssh 可以点击右下角测试写下 保存
部署应用
先将代码上传至码云(GitHub或Gitab)
有一点需要注意,要将pom.xml中的dockerHost地址改成你自己的Docker镜像仓库地址:执行脚本准备
在/usr/local/jenkins目录下创建jenkins.sh
#!/usr/bin/env bash
app_name='jenkinsdemo'
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker run -di --name=${app_name} -p 7070:7070 test/${app_name}:1.0-SNAPSHOT
echo '----start container----'
给.sh脚本添加可执行权限
chmod +x ./jenkins.sh
在Jenkins中创建执行任务
选择自由 点击确定
添加maven构建
增加构建执行shell
点击保存,这样任务就好了
可以在这里添加淘宝加速
/mydata/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven/conf/settings.xml