简介

GoCD是一个开源的持续集成和持续交付系统,可以在持续交付过程中执行编译、自动化测试、自动部署等等。

GoCD的基础框架由Server和Agent组成:

  • Server负责控制一切(配置),轮询材料(如代码仓库)的变化,检测到材料变化需要触发Pipeline时,将Job分配给Agent去执行
  • Agent接收Server分配的Job,执行Job下的Task(运行命令、部署等),并将Job的状态抱报告给Server,由Server整理信息判断该Job所处Stage的状态
  • 每个部署业务的机器上都必须安装Agent

下载

  • 下载安装GoCD Server,版本为19.8.0
sudo curl https://download.gocd.org/gocd.repo -o /etc/yum.repos.d/gocd.repo
sudo yum install -y go-server-19.8.0

注 1:从GoCD 20.2.0开始,默认情况下,GoCD服务器将不再生成任何自签名SSL证书或侦听端口8154(HTTPS)。

注 2:从GoCD 19.9.0开始不再支持java 8

  • 启动go-server
sudo systemctl start go-server
sudo systemctl enable go-server  # 设置开机启动
  • 设置artifact保存地址
sudo mkdir /opt/artifacts
sudo chown -R go:go /opt/artifacts
  • 防火墙开放端口
sudo firewall-cmd --zone=public --add-port=8153/tcp --permanent
sudo firewall-cmd --zone=public --add-port=8154/tcp --permanent
sudo firewall-cmd --reload
  • 设置登录验证
sudo yum -y install httpd-tools
sudo htpasswd -B -c /etc/go/passwd_auth goadmin
sudo htpasswd -B /etc/go/passwd_auth guomx

在菜单栏选择Admin >> Security >> Authorization Configurations,点击Add按钮,选择Password File Authentication Plugin for GoCD,在Password file path中填写/etc/go/passwd_auth

  • 安装并启动 GoCD agent,版本为19.8.0
sudo yum install -y go-agent-19.8.0
sudo systemctl start go-agent
sudo systemctl enable go-agent
  • 卸载
rpm -q go-server
rpm -e go-serverXXXXX
sudo find / -name 'go-server'
sudo rm -rf XXXgo-serverXXX/

基本概念

  • Task - 任务
    需要执行的操作。通常每个Task是一个命令。
  • Job - 工作
    由多个Task组成,每个Task按照顺序依次运行,运行过程中如果当前Task失败,则整个Job为失败,且后续Task不再运行。
  • Stage - 阶段
    一个Stage由多个Job组成,在一个Stage里,每个Job都是独立于其他Job的,这意味着GoCD可以并行执行多个Job,如果某一个Job运行失败,则这个Stage运行失败,但由于Job是相互独立的,这个Stage中的其他Job会继续完成运行。
  • Pipeline - 流水线
    一个Pipeline由多个Stage组成,每个Stage按照顺序运行,如果一个Stage运行失败,则这个Pipeline运行失败,后续的Stage不会运行。

GoCD开源持续集成持续交付系统_CICD

  • Materials and triggers - 材料和触发器
    Material通常是代码存储仓库(Git、SVN、Mercurial等)。GoCD Server不断轮询查找是否有新的提交,如果有新的提交则Pipeline被触发重新运行。它还支持定时触发器、多种代码仓库。
  • Pipeline dependency material - 流水线依赖关系
    不同pipeline之间可以设置触发。
  • 下图中,当 pipeline 1 的 stage 2 运行结束后,Pipeline 2 被触发。

GoCD开源持续集成持续交付系统_GoCD_02

  • 下图中,当 pipeline 1 的 stage 1 运行结束后,Pipeline 2 被触发。此时 Pipeline 1 的 Stage 2 和Pipeline 2 的 Stage 1 同时运行。

GoCD开源持续集成持续交付系统_GoCD_03

  • Fan-out and fan-in - 扇入和扇出
  • 当一个 Material 的完成导致多个下游流水线触发时,这个 Material 被称为“扇出”到下游流水线。

GoCD开源持续集成持续交付系统_java_04

  • “扇入”是指需要多种上游 Material 来触发下游流水线,如下图所示。 “扇入”重要而有趣的一点是,GoCD将确保在触发下游流水线之前,上游流水线的版本是一致的。这就是说,在下图中,如果 pipeline 1 的 stage 2 慢,pipeline 2 的 stage 1 快, 则 Pipeline 3 会等到 Pipeline 1 结束后才被触发。

GoCD开源持续集成持续交付系统_java_05

  • Value Stream Map - 价值流图(VSM)
    端到端的 Pipeline 全局图。
  • Artifacts - 工件
    Artifacts 一般是文件或者文件夹。当 Job 执行完毕后会发布 Artifacts,供给用户、后续执行的 Stage 或者 Pipeline 使用。
    所有上游 Pipeline 发布的 Artifacts 都可以被其下游的 Pipeline 通过 “提取工件任务(Fetch Artifact Task)”获取。
  • Agent - 代理
    Agent 是执行 Job 的 Go 节点。
  • Resource - 资源
    Resource 是标记 Agent 的标签,标识 Agent 上有哪些资源,用来判断在该 Agent 上是不是可以执行某种 Job。
  • Environment - 环境
    Environment 用来对 Pipeline 和 Agent 进行分组,分组规则如下:
  • 一个 Pipeline 最多属于一个 Environment
  • 一个 Agent 可以与任意个 Environment 关联
  • 一个 Agent 仅可执行与其关联的 Environment 中的 Pipeline 所包含的 Job
  • 一个与 Environment 关联的 Agent 不能执行没有与任何环境关联的 Pipeline 所包含的 Job
  • Environment Variable - 环境变量
    Environment Variable 是用户定义的变量。它的定义优先级从高到低依次如下:
    Job > Stage > Pipeline > Environment

GoCD Java Client

  • API手册
  • pom.xml文件中增加以下依赖
<!-- https://mvnrepository.com/artifact/in.ashwanthkumar/gocd-java-client -->
<dependency>
  <groupId>in.ashwanthkumar</groupId>
  <artifactId>gocd-java-client</artifactId>
  <version>0.0.7</version>
</dependency>
  • 用例
GoCD client = new GoCD("http://192.168.56.66:8153", "goadmin", "admin");
Map<Integer, PipelineRunStatus> statusMap = client.pipelineRunStatus("MyFirstPipeline");