前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于 jenkins 的 CI/CD 实践

基于 jenkins 的 CI/CD 实践

作者头像
DevOps时代
发布2018-02-02 15:05:38
4.3K1
发布2018-02-02 15:05:38
举报

一、实践背景

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps时代 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、实践背景
    • 二、CD 中 jenkins 详解
      • 三、CI 中 jenkins 详解
        • 四、chat-bearychat
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档