更多相关文章阅读
本文整理自 Jenkins 北京线下沙龙,沙龙完整 PPT 请在文末下载
Rock
讲师介绍:专注服务于某企业互联网公司的SCM工程师,标签:新技术、轻量级、弱流程、大宅、没追求、胖
CD,主要指持续部署。
在公司,我主要负责的持续集成和发布部署这块,目前现在有N百万用户,开发最多的时候有200人,每日上线部署次数应该是50~60次。
部分团队最近开始使用 spring cloud 。
在做工具实施之前,肯定会构想一下所有部署的业务是什么样的模式,让它变得很灵活,可以支持开发、测试等环境的构建和部署。
先按产品切分,每个产品下面有很多工程,每个工程的部署流水线一般会分二方包,单独拿出来发布到私服。另外是应用程序包,会把代码生成部署包,这中间我们会加单测和 findbugs 检查。
再按环境切分:环境有开发测试、测试环境、集成测试环境、模拟和生产。
从代码到开发测试环境和测试环境、基准测试环境、集成测试环境、模拟环境和线上环境,每个环境可以支持多套,环境部署成功后会自动调用集成测试。
每个产品有不同的发布流程。还有的是配置没做到抽取,所以会有发布到每个环境时,都需要从源代码构建。
原则上: 代码和配置要做分离的。
系统调用,代码管理使用 GitLab ,中间是 Jenkins,通过 Jenkins 打包,部署工具使用 Rundeck ,当部署完成时自动调测试。
Jenkins 实际使用我们分为以下五点:
JOB-DSL
Nested View
Pipeline
Slaves
Groovy
JOB-DSL ,单项目构建好模型后,从代码到某个环境或者从环境到某个环境,会用 JOB-DSL 批量做生成;
Nested View ,切成两级或者三级,现在有1000+的job,可以按照1级或者2级产品线去做归类;
Pipeline 目前主要用在是批量构建,一个产品有可能拆成50个微服务,在开发阶段经常需要批量执行所有服务的构建部署。
Slaves 目前运行在 Docker容器中 ,理想状态是Master 上不做构建(目前我们在master上还有少量工程)。这样master上做升级和迁移会容易很多。另外一个原因是:用docker做构建环境的管理:有的团队用 Python ,有的团队用 JAVA 等等,使用docker可以把环境描述成文件。
Groovy Scripts 用来配置JOB的权限 。
下面的图都是在上面的DSL上面定义完成后自动生成的。
Build 脚本里,把工程名称记下来,他的产品名称、工程名,从哪到哪。
下面的图则是我们构建的输出日志。
上图是一个CD例子,产品A的工程 Login-Server 的发布流程,代码构建-》发布测试环境-》集成测试环境-》生产环境。
下图是 Nested View 我做的一个 Demo。
简单说一下 Pipeline ,在 Pipeline 里面,它的 list 集成里有两个项目,一个cd,一个ci,最后生成的样子如下图的。
以上说的所有的单工程或者 Pipeline 的工程都是可以通过 JOB-DSL 全部把它生成出来的。
Slave这块,使用 slave Docker 镜像,构建环境隔离,添加 slave 到 Jenkins 。
根据环境需要,做一个镜像 。
这是前几天做的一个 Demo ,我们会把M2和WS这两个目录挂出来,这两个目录经常会读写。
正常来说,做得好的话是无状态的,把WS和M2丢掉,重新再构建一次,跟这个结果应该是一样的。
BUILD_DATA 是构建中临时产生的文件,都放到 var/data 下面。
如果要用好 Jenkins ,你可能需要了解 Groovy 。
在前面介绍的在 JOB-DSL 里给JOB配置权限,下面是个专门写个 Groovy 脚本给JOB配置权限。
如上图把这三个人加一个执行权限,到产品AA的Dev阶段的JOB配置权限。
其实,这个例子不太好,也可以通过 JOB-DSL配置JOB权限,脚本的量会更少。
通过Gitlab pushed webhook 触发Jenkins 执行构建:取代码、编译、单测、静态分析、集成测试(部分项目)、sonar-scan 。通过度量系统对数据进行进一步的加工发布给相关人,比如按部门/产品汇总,可以给每个产品或者每个部门提供相应的代码重复率、注释率、类复杂度、阻断性问题单测覆盖率、集测覆盖率的数据。
在CI,我们用到的jenkins插件主要有 4种:
Gitlab
Dashboard
Ext mail
Sonar
Jenkins 装插件装多了容易引起各种各样的问题,像 Maven 那种我们是不装的,虽然是官方维护的,也觉得它不是一个特别好的插件。
我们选了 GitLab-plugin用来和gitlab集成;Dashboard 能生成一些图表,静态分析的报告;邮件的选了 ext mail ,做自定义的邮件的推送,(构建失败,或者有新增的 findbugs 警告的时发邮件给相关人) 。
这是 Jenkins-GitLab 集成:
现在说 Dashboard ,比如pmd的警告可能会放在上面,下面会显示一些总共有多少个,高级别的什么样的,中级别的什么样的,低级别的什么样的。
前年去做 findbugs 清理的时候,发现 findbugs 是非常管用的东西。
ext-mail是发邮件,如果失败的时候发给谁,如下图:
另外还有 Script,写一些脚本去定义它,如果有新增,把邮件发给谁。下图是 Script 的脚本:
下面这个截图配置JOB邮件发送的Groovy脚本。
Sonar,这是我们现在的一个界面,它会给你提供很多的信息。
下图早期版本的界面。
最后,我们会在度量系统里把这些数据收集起来,比如哪个部门哪个产品的,上个月和这个月的数据。
聊天机器人是比较好玩的:
我们用的hubot 版本是2.19.0,bearychat是0.7.2。
效果是:不用打开网页点点点;在聊天室,所有触发的动作其他人可以看到; 还有一个比较方便的点,手机端装一个 bearychat 客户端,比如你正在坐班车或者正在下班路上,手机可以触发一些事,也可以查某个机器的状态。 hubot 和其他工具也可以做集成,如 Jira 、 GitLab ,提供更加快捷的方式。
上图是 bearychat 自己的插件通知消息截图。
hubot Jenkins ,跟它说把所有的job列表打出来,它就说这些是列表。
如果想看编译结果,就说show output for demo-a。
demo code地址:https://github.com/rhinoceros/cicd-jenkins-practice
Jenkins 北京线下沙龙全部 PPT 链接: https://pan.baidu.com/s/1gffBFQr 密码: w5qm
END
更多相关文章阅读
From Agile To DevOps - 微软开发部门 DevOps 经验谈
独乐乐不如众乐乐,DevOps 时代社区长期欢迎原创作者投稿,DevOps 时代社区愿陪伴您共同成长。投稿邮箱:liuce@greatops.net
点击阅读原文参与大会报名