查看原文
其他

基于 jenkins 的 CI/CD 实践

2017-10-26 Rock DevOps时代

本文整理自 Jenkins 北京线下沙龙,沙龙完整 PPT 请在文末下载

作者简介

Rock

讲师介绍:专注服务于某企业互联网公司的SCM工程师,标签:新技术、轻量级、弱流程、大宅、没追求、胖

一、实践背景

CD,主要指持续部署。

在公司,我主要负责的持续集成和发布部署这块,目前现在有N百万用户,开发最多的时候有200人,每日上线部署次数应该是50~60次。

部分团队最近开始使用 spring cloud 。

二、CD 中 jenkins 详解

2.1 CD业务建模

在做工具实施之前,肯定会构想一下所有部署的业务是什么样的模式,让它变得很灵活,可以支持开发、测试等环境的构建和部署。

先按产品切分,每个产品下面有很多工程,每个工程的部署流水线一般会分二方包,单独拿出来发布到私服。另外是应用程序包,会把代码生成部署包,这中间我们会加单测和 findbugs 检查。

再按环境切分:环境有开发测试、测试环境、集成测试环境、模拟和生产。
从代码到开发测试环境和测试环境、基准测试环境、集成测试环境、模拟环境和线上环境,每个环境可以支持多套,环境部署成功后会自动调用集成测试。

每个产品有不同的发布流程。还有的是配置没做到抽取,所以会有发布到每个环境时,都需要从源代码构建。

原则上: 代码和配置要做分离的。

2.2 CD系统支撑

系统调用,代码管理使用 GitLab ,中间是 Jenkins,通过 Jenkins 打包,部署工具使用 Rundeck ,当部署完成时自动调测试。

2.3 CD.jenkins 实战

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的权限 。

2.3.1 JOB-DSL

下面的图都是在上面的DSL上面定义完成后自动生成的。




 

Build 脚本里,把工程名称记下来,他的产品名称、工程名,从哪到哪。

下面的图则是我们构建的输出日志。

2.3.2 Nested View

上图是一个CD例子,产品A的工程 Login-Server 的发布流程,代码构建-》发布测试环境-》集成测试环境-》生产环境。

下图是 Nested View 我做的一个 Demo。

2.3.3 Pipeline

简单说一下 Pipeline ,在 Pipeline 里面,它的 list 集成里有两个项目,一个cd,一个ci,最后生成的样子如下图的。

以上说的所有的单工程或者 Pipeline 的工程都是可以通过 JOB-DSL 全部把它生成出来的。

2.3.4 Slave

Slave这块,使用 slave Docker 镜像,构建环境隔离,添加 slave 到 Jenkins 。

根据环境需要,做一个镜像 。

这是前几天做的一个 Demo ,我们会把M2和WS这两个目录挂出来,这两个目录经常会读写。

正常来说,做得好的话是无状态的,把WS和M2丢掉,重新再构建一次,跟这个结果应该是一样的。

BUILD_DATA 是构建中临时产生的文件,都放到 var/data 下面。

2.3.5 Groovy demo

如果要用好 Jenkins ,你可能需要了解 Groovy 。

在前面介绍的在 JOB-DSL 里给JOB配置权限,下面是个专门写个 Groovy 脚本给JOB配置权限。

如上图把这三个人加一个执行权限,到产品AA的Dev阶段的JOB配置权限。

其实,这个例子不太好,也可以通过 JOB-DSL配置JOB权限,脚本的量会更少。

三、CI 中 jenkins 详解

3.1 CI系统支撑

通过Gitlab pushed webhook 触发Jenkins 执行构建:取代码、编译、单测、静态分析、集成测试(部分项目)、sonar-scan 。通过度量系统对数据进行进一步的加工发布给相关人,比如按部门/产品汇总,可以给每个产品或者每个部门提供相应的代码重复率、注释率、类复杂度、阻断性问题单测覆盖率、集测覆盖率的数据。

3.2 CI.jenkins 实战

在CI,我们用到的jenkins插件主要有 4种:

  • Gitlab

  • Dashboard

  • Ext mail

  • Sonar

Jenkins 装插件装多了容易引起各种各样的问题,像 Maven 那种我们是不装的,虽然是官方维护的,也觉得它不是一个特别好的插件。

我们选了 GitLab-plugin用来和gitlab集成;Dashboard 能生成一些图表,静态分析的报告;邮件的选了 ext mail ,做自定义的邮件的推送,(构建失败,或者有新增的 findbugs 警告的时发邮件给相关人) 。

3.2.1 Gitlab

这是 Jenkins-GitLab 集成:

3.2.2 Dashboard

现在说 Dashboard ,比如pmd的警告可能会放在上面,下面会显示一些总共有多少个,高级别的什么样的,中级别的什么样的,低级别的什么样的。

前年去做 findbugs 清理的时候,发现 findbugs 是非常管用的东西。

3.2.3 Mail

ext-mail是发邮件,如果失败的时候发给谁,如下图:

另外还有 Script,写一些脚本去定义它,如果有新增,把邮件发给谁。下图是 Script 的脚本:

下面这个截图配置JOB邮件发送的Groovy脚本。

3.2.4 Sonar

Sonar,这是我们现在的一个界面,它会给你提供很多的信息。

下图早期版本的界面。

最后,我们会在度量系统里把这些数据收集起来,比如哪个部门哪个产品的,上个月和这个月的数据。

四、chat-bearychat

聊天机器人是比较好玩的:

我们用的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


更多相关文章阅读

大规模团队如何采用标准化的持续交付模式

基于 k8s 的 Jenkins 构建集群实践

《凤凰项目》读书笔记(上篇)

《凤凰项目》读书笔记(下篇)

无服务器化的微服务持续交付

基于DevOps、微服务以及k8s的高可用架构探索与实现

From Agile To DevOps - 微软开发部门 DevOps 经验谈

持续集成和几种工作流

华为专家 | 轻量化微服务测试实践


Jenkins 创始人、Apple 和微软等专家邀您一起参加

国内首届【Jenkins用户大会



独乐乐不如众乐乐,DevOps 时代社区长期欢迎原创作者投稿,DevOps 时代社区愿陪伴您共同成长。投稿邮箱:liuce@greatops.net


点击阅读原文参与大会报名

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存