介绍 Agola:重新定义 CI/CD
[](https://res.cloudinary.com/practicaldev/image/fetch/s--Kd2FdYDF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://agola.io/screenshots/ screenshot_run_01.png)
外面有许多 CI/CD 工具,其中一些仅作为 SaaS 提供(许多对开源项目是免费的,但其中一些是闭源的),还有一些是开源的,您可以将它们安装在任何您想要的地方。那么:为什么要使用另一个 CI/CD 工具?
在Sorint.lab多年来,我们使用了许多不同的 CI/CD 工具,我们的开源项目通常使用免费的 SaaS 工具,在内部和从我们的客户那里我们使用本地安装的开源工具。因此,这些年来,我们在许多 CI/CD 工具上获得了大量知识,并了解了它们的许多优缺点。最后,我们总是努力实现一些我们认为对于此类工具非常重要的功能。这就是我们创建自己的工具的原因:Agola。
在设计和编写 Agola 时,我们试图满足哪些要求?
-
易于安装和管理。
-
可扩展和高可用:从单实例(单进程)部署到分布式部署。
-
在任何地方部署:Kubernetes、IaaS、裸机并在任何地方执行“任务”(目前是容器执行器,如 docker 或编排器和 Kubernetes,但很容易扩展到未来的技术或虚拟机而不是容器)。
-
支持任何语言,部署系统等...(只需使用正确的图像)
-
同时与多个 git 提供者集成:您可以在同一个 agola 安装中添加来自 github、gitlab、gitea(以及更多)的 repos。
-
使用它来管理整个开发生命周期:从构建到部署。
-
个任务工作流(我们称之为 Runs),能够实现扇入、扇出、矩阵等...,所有内容都被容器化以实现最大的可重复性。
-
基于 Git 的工作流:运行定义在 git 存储库中提交(因此所有内容都被跟踪和重现)。运行执行由 git 操作(推送、拉取请求)启动。
-
将其设计为能够实现最多一次运行:在部署到生产期间,我们不希望部署的多个并发执行......
-
可重新启动和可重现的运行(使用相同的源提交、变量等从头开始或从失败的任务重新开始运行......)
-
用户直接运行:让每个用户都可以使用与在 Agola 安装中推送 git/打开拉取请求时使用的相同运行定义来测试他们的软件,就像他们在本地运行测试一样(不需要一个超级强大的工作站)。
-
可测试的“运行”(如果您无法测试对运行定义的更改,什么是 CI/CD 环境?):使用相同的运行定义,但使用强大的秘密和变量系统访问不同的资源(环境、docker注册表等...)。
-
不要尝试将 YAML 扩展为模板语言,而是使用真正的模板语言(截至目前jsonnet)轻松生成运行配置而不会产生副作用。
-
高级权限系统(正在进行中)。
-
依赖缓存加速任务
运行
运行是一个工作流程。 Agola 是一个持续的 Doer,深度集成在基于 git 的工作流程中。 Agola(或更好的主要服务之一:Run Service)以容器化和有组织的方式执行“命令”。这些命令可以是任何东西,可以用任何语言编写,并且可以为所欲为。它非常适合 CI/CD 系统。
运行由可以依赖于其他任务并且仅在某些条件下执行的任务组成,任务是由多个顺序步骤组成的容器化执行。
基于 Git 的工作流
我们将其深度集成到基于 git 的工作流程中,因为为了实现最佳结果和自动化,我们必须跟踪所有内容。 Git 工作流程让您可以通过 git 跟踪和控制一切。运行定义位于 git 存储库中,因此它与代码紧密相连,可以像其他所有内容一样进行审查。
如果您喜欢代码审查(我们喜欢),请使用 pull/merge 请求来执行此操作,agola 将在 PR 上执行运行并在您将更改合并到“master”分支之前提供运行状态。如果您使用功能分支,Agola 将在每次推送时执行运行并提供该提交的运行状态。
如果你想在推送掌握新的提交或标签时部署到生产环境,agola 可以做到这一点。
阿哥拉架构
Agola 很年轻,但却是一个宏大而雄心勃勃的项目。在接下来的几周内,我们将创建更多详细介绍其内部结构和架构特性的帖子。
作为一个小品味,Agola 由多个服务组成,并且可以通过在其基础服务 API 之上编写新服务来进行扩展(没有旧式插件!)。如果其服务使用两个主要组件,则要完全分布式和高可用性:
-
etcd协调多个实例(以多种方式)
-
对象存储(截至今天,共享 posix fs,如 nfs、cephfs 或 s3 等兼容存储)
现在有人可能会问:“数据库在哪里?”。如果您的意思是存储所有配置、运行数据等的关系(会说话的 sql 语言)数据库在哪里......答案是:没有。
开发新事物的好处是您可以尝试做一些不同的事情。除了尝试改善 CI/CD 体验外,我们还想尝试(并尝试创新)一些新的架构选择。
由于我们想要一个完全分布式和高可用的系统,我们只想依赖可以完全分布式和高可用的组件:etcd 和对象存储满足这些要求。因此,不要添加会增加项目要求的第三个组件,也就是说,截至今天,难以扩展和高可用性(好吧,有一些产品可以实现这一点,例如cockroachdb)并且可以自由构建根据我们的喜好,我们尝试使用 etcd 和对象存储来实现原子的、一致的、隔离的和事务性的存储。
通过这种方式,一切都在应用程序级别进行管理,无需将部分逻辑放入关系数据库(约束、外键等)或依赖仅在某些产品上可用的功能。但这是一个很大的论点(以及一个可能会改变或证明它是错误的实验),我们希望在以后的帖子中详细说明(提示:我们不会放弃关系数据库,如果您查看 agola 代码,您将找到一个使用 sqlite 的名为 readdb 的包:是的,我们正在使用 per instance/local, rebuildable, subject to a lot of schema changes 关系数据库作为用于查询的只读数据库) .
试试看
只需尝试agola demo看看我们如何使用它来构建/测试 agola
带有各种示例的 Agola 文档位于Agola 网站
取得联系
Agola 是一个由Sorint.lab创建的开源项目,但我们需要一个围绕它的社区。要联系任何事情(贡献、帮助、建议等),请加入Agola 论坛和我们的github 组织。并且不要忘记在 agola 主存储库(https://github.com/agola-io/agola)上留下一个星号,它不会花费你任何东西!
更多推荐
所有评论(0)