构建系统,学到了啥?

结论一定要写在显眼的地方:(写着写着来个结论)

  1. 这些东西不及时记下来,或多或少以后都会忘记把,然后就是重复踩坑喽…
  2. 写文档并不是消磨时间的好方式,写代码才是

遇到的一些问题:

方案执行后遇到的一些问题:

  • 基础镜像变多,看起来维护也挺麻烦的
  • 部分项目依赖高版本软件或者系统环境
  • python-gitlab 的一些小坑(解决办法:要以 gitlab API 为准

架构图

    +-----------------------+    <---- Send notify, candidate ready.
    |  Nami (CD server)     | --------------------------------------+
    |                       |                                       |                                               +-------------+
    +-----------------------+                                       |                                               |             |
        |                                                           |                    <- webhook                 |   Gitlab    |
        |                                               +----------------+ ---------------------------------------+ |             |
        |                                               |                |     get and parse joker.yml ->           +-------------+
        |                                               |     lavie      |                                                 |
        |                                               |   (CI server)  |                                                 |
        |                                               +----------------+                                                 |
        |                                                       |                                                          |
        |                                                       |                                                          |
        |                                                       |                                                          |
        |                                             +------------------+                                                 |
        |                                             |                  |                                                 |
        |                 +-------------------------  |  Jenkins Master  |                                                 |
        |                 |          +----------------|                  |                                                 |
        |                 |          |                +------------------+                                                 |
        |                 |          |                          |                                                          |
        |              +-------+  +-------+    +-------------------------------------------------+                         |
        |              |slave 1|  | slave2|    |+---------------------------------------------+  |                         |
        |              +-------+  +-------+    ||  Jenkins Slave (worker)              +----+ |  |     pull code base ->   |
        |                                      ||  Docker in docker (DID)              |job1| |  | ------------------------+
        |                                      ||                                      +----+ |  |
        |                                      ||  +---------------------------------+ +----+ |  |                     +---------------------+
        |                                      ||  | Job0 (Docker Container)         | |job2| |  |  ----------------   |  npm.in             |
        |                                      ||  | Docker in docker                | +----+ |  |                     +---------------------+
+-------------------------------+              ||  |         python/java1.7/node...  | +----+ |  |                    +-----------------------+
|   +---------+  +--------+     |              ||  |                                 | |....| |  |    --------------  |   mirror.in           |
|   |         |  |        |     |              ||  | RUN BUILD/TEST and so on        | +----+ |  |                    +-----------------------+               -
|   |  Bay    |  | AWS S3 |     |--------------||  +---------------------------------+        |  |                    +-----------------------+
|   +---------+  +--------+     |push artifacts|+---------------------------------------------+  |  ----------------  |   repo.in             |
|                               |  <-------    |   Docker daemon                                 |                    +-----------------------+
|    Artifacts Store            |              |   /var/run/docker.sock:/var/run/docker.sock     |                   +-------------------------+
+-------------------------------+              |                                                 |                   |   ......                |
                                               |  Linux Host                                     |                   +-------------------------+
                                               +-------------------------------------------------+

这东西好歹也弄弄三个月了,接下来可能不会投入太多精力? 想起前几天,就像要甩『锅』一样,然后来了一发段子『接锅,可能有点烫手。』恩,腻害了,很少的好笑的事情之一。

早就想记录一下,一方面没有找到合适的时间;另一方面动力不是很强。趁现在这种无聊作死的时候,适当总结一下,对能力、各种计划、或者其它什么意料之外的事情都是有好处的把。

前几天一不小心发现其实竟然有专门的 CI/CD 岗位,虽然并不想入这个坑(不知道这个坑有啥有趣的东西啊)。但是基于现状,将它作为切入点,看起来也不糟糕。顺便复制过来一下。

华为云计算 OpenStack CI/CD 工程师

岗位职责

负责云计算领域研发能力和基础平台建设,成为云计算高速发展的发动机

岗位要求

  1. 理解Linux操作系统工作原理,熟悉Red Hat等主流发行版。
  2. 热爱技术、自我驱动、主动思考,有较好的技术敏感度、风险识别能力和全局意识,优招条件
  3. 有自动化运维(业务发布、安装部署、业务升级、监控)经验者优先
  4. 有过CICD(持续集成持续发布)经验者优先
  5. 熟悉XEN/KVM/Docker等虚拟化技术原理,有trouble shooting经验者优先
  6. 熟悉Jenkins常用工具,熟悉脚本语言开发,有shell/Python/Perl等脚本语言开发经验者优先
  7. 有开源社区(如GitHub、OpenStack、XDA等)相关开发经验者优先
  8. 根据自己经验,还有一条:要能推广自己的产出,沟通要好

顺便自己比对一下:

  • 自动化运维:算是接触一点吧
  • 虚拟化技术原理这一块并不懂
  • 开源社区相关开发经验是指啥?好像没有?
  • 其它的点,貌似基本满足要求把…

恩,有必要,感觉这中可以尝试一下的。

来来来,回到正题。我想主要按照时间顺序记录一下是怎样搭建这个构建系统的,在这个记录中一定要给出以下几个问题的明确的答案。

  1. 什么是持续集成?什么是构建系统?构建系统包括哪些部分?
  2. 是怎样搭建这个系统的?
  3. 个人怎样看构建系统未来的发展?

写完之后,我再把整个思路整理一遍。

正文

=。=,总感觉对不起这个总结… 感觉并不能太正经,怎么看也不像个正经的人啊…有点对不起这个分类啊… 当我正在理思路的时候,外面突然传来奇怪的声音,这个时候也有人点外卖么。擦,什么鬼 实践证明 (2017-2-19):写文档并不是消磨时间的好方式,写代码才是。看了下时间,今天怎么还是 19 号?我嘞个去… 恩,我已经意识到今晚应该已经写不完这个总结了

好了,正文真的来了。

持续集成 - 构建系统 - DevOps

尼玛,零食吃完了,怎么办?呜呜

CI is the practice of merging all developer working copies to a shared mainline several times a day.

持续集成是一种 软件开发实践 ,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。 也有些比较简单的理解:持续集成是指频繁地(一天多次)将代码集成到主干。(感觉大同小异

先发布一下,免的等下出 bug 了,没保存那不亏大发了。哎

DevOps: a set of practices that emphasize the collaboration and communication of both software developers and information technology (IT) professionals while automating the process of software delivery and infrastructure changes. 也算是一种工程实践把、是一种理念、是一种文化。大概是说鼓励开发者和运维要多交流? 突然想到一种观点:DevOps 是一个公司组织架构的重组。

构建系统 (build system): 是用来从源代码生成用户可以使用的目标的自动化工具。(恩,这个解释应该比较科学。所以 buildout, maven, sbt 这种东西应该算是构建系统。同事之间交流的时候,我有时会说『我在做新的构建系统』,实际上貌似并不对,不过 who cares?

说起 who cares? 这个 sentence,今天好像不太适合说这个东西,好累啊…突然想睡觉啊,但是感觉暂(请脑补第三声)时睡不着。

那我在做的是啥呢?持续集成工具/系统?恩,想了想我们应该是开发一个 持续集成系统,或者说,我们的目标是这样的。

继续理解持续集成

一本书叫做《continuous integration improving software quality and reducing risk》,里面详细的介绍了关于 CI 的各种概念。虽然内容/技术可能不先进,但是理论基础,你懂得。当年还认真看了大部分内容(不过感觉现在也不记得啥了)

随便摘抄一点过来(真的很随便)

Full-Features CI System

  1. continous database integration
  2. continous tesing
  3. continous inspection
  4. continous deployment
  5. continous feedback

不理解这个概念了。说说我们做了啥把

开发一个持续集成系统

具象一下目标:我们要开发一个系统,当程序员提交一次代码,这个系统就要自动对这份代码进行一系列的评估,然后保证它合并到主干分支的时候,它是比较正确的。(基本目标)

不过,我们目标并不是这么简单,我们还需要为持续部署做准备。所以,我们还要做一些事情,让持续部署系统能够方便的部署主干的代码。

以上两个目标,应该比较完整了。(噗,我要去睡觉了,下次继续)

噗,仍然是 19 号诶。擦 恩,神奇的相似。哎 -> 立 flag 么?

2017-2-20,其实想想,生活还是挺美好的啦 ~ ?

  • 是吧?
  • 恩。只是或多或少有误会和无赖把?恩(感慨认真脸。

正题:就是要实现一个 Full-Features CI System.

当时,我们调研了 Gitlab CI,觉得它功能不够(非本宝宝自己调研,所以细节不清楚),最后决定还是基于 Jenkins,二次开发

项目:改进旧的持续集成系统

背景

(终于到了 2017-2-20,噗,这个地方总是要改怎么办…现在已经过了 40 分钟了)

之前尝试写了写做持续集成系统的背景,好像要把背景详细的描述清楚,需要太多的文字。简单说下

老 CI 系统的背景:(纯属个人猜测)随着 python 项目越来越多,这些项目需要一个通用的自动化测试的方案。于是有了老的 CI 系统。

老的 CI 系统包括两大部分:Jenkins job 生成系统(一个 Python 服务)和 Jenkins。

但是在使用的过程当中,我们发现了老的 CI 系统如下几个问题

  1. 几乎所有的 job 都跑在一台 Jenkins Slave 上。单点。由此带来许许多多的问题
  • 总有些项目需要依赖奇怪的东西,为了支持这些东西,Slave 上有很多这样奇怪的东西,并且没人知道到底有多少
  • 没办法很好地支持多语言版本
  • 会出现 CPU 问题,磁盘问题,或者一些性能问题
  1. Jenkins job 生成系统的代码不好维护、扩展。(不能很好地支持新需求
  2. Jenkins 上许多 job 的配置为了满足一些需求(不合理或者合理),被人工修改过许多。没人知道 -> 人工成本高,不自动化

所以新 CI 系统的目标

  1. 支持多语言,语言多版本,混合语言的项目的持续集成。
  2. jenkins slave 不再单点,可以扩容
  3. 流程自动化,对于 99.9% 的项目,保证没有人工干预。

(好,睡觉了,改日再续

新持续集成系统架构

新 CI 系统由三部分组成。GitLab, Jenkins2.x, lavie 组成。

GitLab: 代码版本管理 Jenkins2.x: 运行构建任务 lavie: CI server (大概可以看做 GitLab 和 Jenkins2.x 的管理者

lavie 是什么东东:a continuous integration server built on top of Jenkins, worked with GitLab, and designed for PaaS.(模仿 janky 的定义… 但是很准确

PaaS 是什么,内部 PaaS 平台。

As a result:

  • a clean container for every build
  • scalable jenkins-slave
  • readable yaml configuration
  • integration with GitLab
  • Slack, email and more (Feature)
  • run tests in parallel (Feature)
  • Great API (Feature)

####

最后记录一下一些资料:

  • 书籍《continuous integration improving software quality and reducing risk》

Updated:

Comments