GoCD概念篇

GoCD,一个开源的持续集成和持续交付系统。

诞生于2007年,但是目前很难搜索到中文资料,不知道是推广问题还是Jenkins已经足够强大!

笔者公司的一个产品线上使用了GoCD,有幸见识到如此一个简洁漂亮的软件,所以了解部署了一下,所有图片和概念均来自官网,如理解有误,请不吝指正。

架构简介:

Server and Agents

- Server负责控制一切(配置),轮询材料(如代码仓库)的变化,检测到材料变化需要触发Pipeline(流水线)时,将Job(作业)分配给Agent去执行

- Agent接收Server分配的Job,执行Job下的Task(任务)(运行命令、部署等),并将Job的状态报告给Server,由Server整理信息判断该Job所处Stage(阶段)的状态

- 每个部署业务的机器上都必须安装agent

 概念:

 1. Task(任务)

- 通常是一个单独的命令,如执行一个系统命令cat,ant构建等

 

2. Job(作业)

- 由多个Tasks(任务)组成

- Task执行方式为顺序执行,Task之间是相互独立的,即修改的环境变量不会影响到其它Task

- 一个Task失败,则该Job失败,除非另有说明,否则其余Task将不会运行

 

3. Stage(阶段)  

- 由多个Jobs(作业)组成

- Job执行方式为并行,由于Job之间是相互独立的,某个Job失败后,其它的Job会被运行到完成

- 一个Job失败,则该Stage失败

 

4. Pipeline(流水线)

- 由多个Stages(阶段)组合而成

- Stage执行方式为顺序执行,一个Stage失败,将不会执行后续Stage

- 一个Stage失败,则该Pipeline失败

下面两张图分别为完整图和精简图

 

5. Materials and triggers(材料和触发)

- 使用Git、SVN等材料时,GoCD可以轮询检测资源变更,以触发Pipeline,也可以手动触发

- Pipeline可以有多个材料,任何一个材料变更都可以触发Pipeline

 

6. Pipeline dependency material (Pipeline依赖材料)

- Pipeline和Pipeline之间可以产生依赖关系,例如当Pipeline1完成之后触发Pipeline2

- Pipeline和Pipeline之间也可以通过上游Pipeline中的某个Stage完成后,触发下游Pipeline执行

 

7. Resources(资源)

- 资源是我们打在Agent的标签,以表示哪些Agent能运行这个Job

如图,我们运行一个需要Firefox资源的Job,那么只有Agent1和Agent3满足,如何知道Agent1和Agent3上有Firefox?在这两个Agent上打上标签"Firefox(or XXX)"

 

8. Environments(环境)

- GOCD中的“Environments”是对Pipeline和Agent进行分组和隔离的一种方式

如图,Pipeline1和Pipeline只能运行在Agent1、2、3上,而不能运行在Agent4和Agent5上,从而实现环境隔离

 

9. Environment Variables(环境变量) 

- 环境变量在各层级都可以配置,原则类似于全局变量和局部变量的概念,最底层的变量值会覆盖上层的变量值

注:此环境变量跟第8个概念Environment(环境)不要混淆,前者指a=1变量赋值,后者为运行环境

 

上图各变量的最终值为:

ENV_ENV => 1
ENV_PIP => 2
ENV_STG => 3
ENV_JOB => 4
MY_VAR => 4

 

10. Fan-out and fan-in(扇出和扇入)

Fan-out:

- 一个material(材料)的完成,触发下游多个Pipeline,该材料不一定是Pipeline依赖材料,可以是任何材料

Fan-in:

- 多个上游材料触发下游Pipeline,在触发下游Pipeline之前,GoCD将确保上游Pipeline的修订是一致的

如图,git触发Pipeline1和Pipeline2,而Pipeline1的Stage2的完成和Pipeline2的Stage1的完成是触发Pipeline3的条件,如果Pipeline2的Stage1的完成较快而Pipeline1的Stage2完成较慢,Pipeline会等待Pipeline1的Stage2的完成后被触发,以确保一致性。

 

11. Value Stream Map (价值流图)

- VSM是端到端的视图,详细描述了它的上下游依赖关系,在决定哪个Pipeline被触发时,GoCD的扇入扇出一直保持所有依赖关系

如图,当Repo1(git)中有新的提交时,GoCD不会立即触发Pipeline5,它将等待Pipeline1触发并成功完成,然后等待Pipeline4触发并成功完成,最后,

它将触发Pipeline5与Pipeline1使用相同的Repo1相同的修订版本。

 

 

12.  Artifacts(工件)

- GoCD中的工件是在Pipeline运行期间最常生产的文件或目录。Pipeline中的每个Job都可以配置发布自己的工件集,GoCD将确保这些工件从Agent端移动到Server端并存储在那里,以便随时检索。

- 通常,在Job运行期间,通过其中一个Job创建工件,由这些Job发布的工件可以被任何下游Pipeline或在同一Pipeline中产生该工件的Stage之后的任何阶段使用名称为

- 工件的一些示例为:测试报告、覆盖率报告、安装程序、文档、有关构建过程本身的元信息以及Pipeline完成后需要存储的其它任何内容。

"Fetch Artifact"的Task来获取和使用。

如图,第一个Job有两个文件和一个目录作为其工件,第二个Job一个文件和两个目录作为其工件。

 

如图,Pipeline1 Stage1中的Job会发布一些工件。在Stage2中,Fetch Artifact任务将获取在Stage1中发布的工件。然后,在Pipeline2中,Fetch Artifact Task将获取在Pipeline1中发布的工件。最后,在下游的Pipeline3中,Fetch Artifact Task通过Pipeline2获取来自Pipeline1的工件。

 

13. GoCD Server首页面貌

 

 

GoCD官网:https://www.gocd.org

 

posted @ 2017-06-25 06:55  elisun  阅读(9087)  评论(0编辑  收藏  举报