简介
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不会运行。
- Materials and triggers - 材料和触发器
Material通常是代码存储仓库(Git、SVN、Mercurial等)。GoCD Server不断轮询查找是否有新的提交,如果有新的提交则Pipeline被触发重新运行。它还支持定时触发器、多种代码仓库。 - Pipeline dependency material - 流水线依赖关系
不同pipeline之间可以设置触发。
- 下图中,当 pipeline 1 的 stage 2 运行结束后,Pipeline 2 被触发。
- 下图中,当 pipeline 1 的 stage 1 运行结束后,Pipeline 2 被触发。此时 Pipeline 1 的 Stage 2 和Pipeline 2 的 Stage 1 同时运行。
- Fan-out and fan-in - 扇入和扇出
- 当一个 Material 的完成导致多个下游流水线触发时,这个 Material 被称为“扇出”到下游流水线。
- “扇入”是指需要多种上游 Material 来触发下游流水线,如下图所示。 “扇入”重要而有趣的一点是,GoCD将确保在触发下游流水线之前,上游流水线的版本是一致的。这就是说,在下图中,如果 pipeline 1 的 stage 2 慢,pipeline 2 的 stage 1 快, 则 Pipeline 3 会等到 Pipeline 1 结束后才被触发。
- 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");