构建系统,学到了啥?
结论一定要写在显眼的地方:(写着写着来个结论)
- 这些东西不及时记下来,或多或少以后都会忘记把,然后就是重复踩坑喽…
- 写文档并不是消磨时间的好方式,写代码才是
遇到的一些问题:
方案执行后遇到的一些问题:
- 基础镜像变多,看起来维护也挺麻烦的
- 部分项目依赖高版本软件或者系统环境
- 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 工程师
岗位职责
负责云计算领域研发能力和基础平台建设,成为云计算高速发展的发动机
岗位要求
- 理解Linux操作系统工作原理,熟悉Red Hat等主流发行版。
- 热爱技术、自我驱动、主动思考,有较好的技术敏感度、风险识别能力和全局意识,优招条件
- 有自动化运维(业务发布、安装部署、业务升级、监控)经验者优先
- 有过CICD(持续集成持续发布)经验者优先
- 熟悉XEN/KVM/Docker等虚拟化技术原理,有trouble shooting经验者优先
- 熟悉Jenkins常用工具,熟悉脚本语言开发,有shell/Python/Perl等脚本语言开发经验者优先
- 有开源社区(如GitHub、OpenStack、XDA等)相关开发经验者优先
- 根据自己经验,还有一条:要能推广自己的产出,沟通要好
顺便自己比对一下:
- 自动化运维:算是接触一点吧
- 虚拟化技术原理这一块并不懂
- 开源社区相关开发经验是指啥?好像没有?
- 其它的点,貌似基本满足要求把…
恩,有必要,感觉这中可以尝试一下的。
来来来,回到正题。我想主要按照时间顺序记录一下是怎样搭建这个构建系统的,在这个记录中一定要给出以下几个问题的明确的答案。
- 什么是持续集成?什么是构建系统?构建系统包括哪些部分?
- 是怎样搭建这个系统的?
- 个人怎样看构建系统未来的发展?
写完之后,我再把整个思路整理一遍。
正文
=。=,总感觉对不起这个总结…
感觉并不能太正经,怎么看也不像个正经的人啊…有点对不起这个分类啊…
当我正在理思路的时候,外面突然传来奇怪的声音,这个时候也有人点外卖么。擦,什么鬼
实践证明 (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
- continous database integration
- continous tesing
- continous inspection
- continous deployment
- 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 系统如下几个问题
- 几乎所有的 job 都跑在一台 Jenkins Slave 上。单点。由此带来许许多多的问题
- 总有些项目需要依赖奇怪的东西,为了支持这些东西,Slave 上有很多这样奇怪的东西,并且没人知道到底有多少
- 没办法很好地支持多语言版本
- 会出现 CPU 问题,磁盘问题,或者一些性能问题
- Jenkins job 生成系统的代码不好维护、扩展。(不能很好地支持新需求
- Jenkins 上许多 job 的配置为了满足一些需求(不合理或者合理),被人工修改过许多。没人知道 -> 人工成本高,不自动化
所以新 CI 系统的目标
- 支持多语言,语言多版本,混合语言的项目的持续集成。
- jenkins slave 不再单点,可以扩容
- 流程自动化,对于 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》
Comments