机器翻译正文由机器翻译自项目原始文档(英文),排版经程序统一处理,可能存在偏差,请以原项目仓库为准。
存档通知:感谢大家对 Gaia 的所有美好回忆。这是一段美妙的旅程,但现在必须结束。如果你正在寻找类似的东西,https://dagger.io/ 会支持你。祝一切顺利,祝好运!
|构建状态| |Go 报告| |Go 文档| |Apache2| |聊天| |Codecov|
Gaia 是一个开源自动化平台,使在任何编程语言中构建强大管道变得轻松有趣。基于 HashiCorp 的 go-plugin 和 gRPC,Gaia 高效、快速、轻量且对开发者友好。
借助 [SDKs]( Why do I need an SDK? ) 开发强大的 [管道]( What is a pipeline? ),并将代码简单地提交到 git 仓库中。Gaia 会自动克隆你的代码仓库,将代码编译成二进制文件,并按需执行。所有结果都会被流式传回,并以用户友好的图形方式呈现。
访问 gaia-pipeline.io 了解更多信息。
动机
自动化工程师、DevOps工程师、SRE、云工程师、平台工程师——它们都有一个共同点:大多数技术人员没有动力去从事这项工作,而且招聘起来很困难。
造成这种情况的主要原因之一是许多自动化工具的抽象和执行不佳。它们自带配置(YAML 语法)规范,或者限制用户只能使用某种特定的编程语言。测试几乎是不可能的,因为大多数自动化工具缺乏模拟服务和子系统的能力。即使是一些小事情,例如解析JSON文件,有时也非常麻烦,因为使用了外部的、过时的库,并且未包括在标准框架中。
我们认为是时候去掉所有这些抽象,回归本源了。你是否厌倦了写无尽的YAML代码?你是否厌烦了被迫用一种不适合你、完全不有趣的语言花费数天时间编程?你是否喜欢用自己喜欢的语言进行编程?那么Gaia就是为你而生的。
它是如何工作的?
Gaia 基于 HashiCorp 的 go-plugin。它是一个[插件系统](https://en.wikipedia.org/wiki/Plug-in_(computing),使用 gRPC 通过 HTTP/2 进行通信。最初,HashiCorp 为 Packer 开发了这个工具,但现在它也被 Terraform、Nomad 和 Vault 广泛使用。
插件,也称为 [pipelines](What is a pipeline?_),是可以用任何编程语言编写的应用程序,只要支持 gRPC 即可。所有函数,也称为 [jobs](What is a job?),都向 Gaia 暴露,并可以形成一个描述执行顺序的依赖图。
Pipelines 可以在本地编译,或者直接通过集成构建系统进行编译。Gaia 会克隆 Git 仓库并自动构建其中包含的 pipeline。如果发生了更改(git push),Gaia 会自动为你重建 pipeline*。
在 pipeline 启动后,所有日志输出都会返回给 Gaia,并在详细概览中显示其最终结果状态。
Gaia 使用 boltDB 进行存储。这使得安装过程非常简单。目前不需要外部数据库。
- 这需要启用轮询或 webhook。
截图
|sh-登录|
|sh-概览|
|sh-创建管道|
|sh-管道详细信息|
|sh-管道日志|
|sh-保险库|
|sh-设置|
入门
安装
Gaia 的安装非常简单,通常只需几分钟。
使用 Docker
以下命令将 Gaia 以守护进程的方式启动,并将所有数据挂载到当前文件夹。之后,Gaia 将在主机系统的 8080 端口可用。初次登录请使用标准用户 admin 和密码 admin。建议之后更改密码。
docker run -d -p 8080:8080 -v $PWD:/data gaiapipeline/gaia:latest
此版本使用带有 latest 标签的镜像,其中包含所有支持语言所需的库和编译器。如果您更喜欢适合您首选语言的较小镜像,请查看可用的 Docker 镜像标签。
手动操作
可以直接在主机系统上安装 Gaia。可以通过从发布页面下载二进制文件来实现。
Gaia 将自动检测二进制文件所在的文件夹,并将在其旁边放置所有数据。如果需要,您可以使用启动参数 -home-path 更改数据目录。
使用 Helm
如果您尚未拥有 ingress 控制器 Pod,请确保已启用 kube-dns 或 coredns,然后运行此命令进行设置。
make kube-ingress
初始化 helm:
helm init
部署盖亚:
make deploy-kube
示例管道
开始
package main
import (
"log"
sdk "github.com/gaia-pipeline/gosdk"
)
// This is one job. Add more if you want.
func DoSomethingAwesome(args sdk.Arguments) error {
log.Println("This output will be streamed back to gaia and will be displayed in the pipeline logs.")
// An error occurred? Return it back so gaia knows that this job failed.
return nil
}
func main() {
jobs := sdk.Jobs{
sdk.Job{
Handler: DoSomethingAwesome,
Title: "DoSomethingAwesome",
Description: "This job does something awesome.",
},
}
// Serve
if err := sdk.Serve(jobs); err != nil {
panic(err)
}
}
Python
from gaiasdk import sdk
import logging
def MyAwesomeJob(args):
logging.info("This output will be streamed back to gaia and will be displayed in the pipeline logs.")
# Just raise an exception to tell Gaia if a job failed.
# raise Exception("Oh no, this job failed!")
def main():
logging.basicConfig(level=logging.INFO)
myjob = sdk.Job("MyAwesomeJob", "Do something awesome", MyAwesomeJob)
sdk.serve([myjob])
Java
package io.gaiapipeline;
import io.gaiapipeline.javasdk.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.logging.Logger;
public class Pipeline
{
private static final Logger LOGGER = Logger.getLogger(Pipeline.class.getName());
private static Handler MyAwesomeJob = (gaiaArgs) -> {
LOGGER.info("This output will be streamed back to gaia and will be displayed in the pipeline logs.");
// Just raise an exception to tell Gaia if a job failed.
// throw new IllegalArgumentException("Oh no, this job failed!");
};
public static void main( String[] args )
{
PipelineJob myjob = new PipelineJob();
myjob.setTitle("MyAwesomeJob");
myjob.setDescription("Do something awesome.");
myjob.setHandler(MyAwesomeJob);
Javasdk sdk = new Javasdk();
try {
sdk.Serve(new ArrayList<>(Arrays.asList(myjob)));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
C
#include "cppsdk/sdk.h"
#include <list>
#include <iostream>
void DoSomethingAwesome(std::list<gaia::argument> args) throw(std::string) {
std::cerr << "This output will be streamed back to gaia and will be displayed in the pipeline logs." << std::endl;
// An error occurred? Return it back so gaia knows that this job failed.
// throw "Uhh something badly happened!"
}
int main() {
std::list<gaia::job> jobs;
gaia::job awesomejob;
awesomejob.handler = &DoSomethingAwesome;
awesomejob.title = "DoSomethingAwesome";
awesomejob.description = "This job does something awesome.";
jobs.push_back(awesomejob);
try {
gaia::Serve(jobs);
} catch (string e) {
std::cerr << "Error: " << e << std::endl;
}
}
红宝石
require 'rubysdk'
class Main
AwesomeJob = lambda do |args|
STDERR.puts "This output will be streamed back to gaia and will be displayed in the pipeline logs."
# An error occurred? Raise an exception and gaia will fail the pipeline.
# raise "Oh gosh! Something went wrong!"
end
def self.main
awesomejob = Interface::Job.new(title: "Awesome Job",
handler: AwesomeJob,
desc: "This job does something awesome.")
begin
RubySDK.Serve([awesomejob])
rescue => e
puts "Error occured: #{e}"
exit(false)
end
end
end
Node.JS
const nodesdk = require('@gaia-pipeline/nodesdk');
function DoSomethingAwesome(args) {
console.error('This output will be streamed back to gaia and will be displayed in the pipeline logs.');
// An error occurred? Throw it back so gaia knows that this job failed.
// throw new Error('My error message');
}
// Serve
try {
nodesdk.Serve([{
handler: DoSomethingAwesome,
title: 'DoSomethingAwesome',
description: 'This job does something awesome.'
}]);
} catch (err) {
console.error(err);
}
管道由作业定义,一个函数通常表示一个作业。你可以在管道中定义任意数量的作业。
每个函数都接受参数。这些参数可以从管道本身请求,并通过用户界面传回值。
某些管道作业需要特定的执行顺序。DependsOn 允许你为每个作业声明依赖关系。
你可以在文档中找到关于如何开发管道的真实示例和更多信息。
安全
请查看位于此处的文档:security-docs。
文档及更多
请在 https://docs.gaia-pipeline.io 查找文档。我们那里还有一个教程部分,包含示例和实际使用场景。例如,带有 Vault 集成的 Kubernetes 部署。
问答 (Q&A)
Gaia 解决了什么问题?
几乎所有为自动化、持续集成 (CI) 和持续部署 (CD) 设计的工具,比如 Spinnaker、Jenkins、Gitlab CI/CD、TravisCI、CircleCI、Codeship、Bamboo 等,都引入了自己的配置格式。其中一些甚至不支持配置/自动化即代码。这在运行 go install 或 mvn clean install 这样的简单任务时效果良好,但在现实世界中还有更多需要做的事情。
Gaia 是第一个不限制用户的平台,并提供对几乎所有常用编程语言的完整支持,同时不失今天的 CI/CD 工具所提供的功能。
什么是 pipeline?
Pipeline 是一个实际的应用程序,至少包含一个函数(我们称之为 Job)。支持 gRPC 的任何编程语言都可以使用。我们提供 SDK 来支持开发。
什么是 job?
Job 是一个函数,通常在 Gaia 中全局暴露。根据依赖图,Gaia 会按特定顺序执行此函数。
为什么我需要 SDK?
SDK 实现了 Gaia 插件 gRPC 接口,并提供了诸如启动 gRPC 服务器之类的辅助功能。这可以帮助你专注于真正的问题,而不是处理繁琐的事情。
支持哪些编程语言?
我们目前完全支持 Go、Java、Python、C、Ruby 和 Node.JS。
什么时候会支持编程语言 XYZ?
我们正在努力支持尽可能多的编程语言,但我们的资源有限,并且在所有编程语言方面我们也不都是专家。如果你愿意贡献,可以随时提出问题并开始工作。
路线图
Gaia 目前提供测试版。
欢迎随时在 GitHub 上提出新功能请求。
贡献
Gaia 只有在贡献者的帮助下才能不断发展并成为优秀的产品。如果您愿意贡献,请查看我们的问题部分。我们会尽力用 good first issue 标签标记适合新贡献者的问题。
如果您认为找到了一个适合初学者的问题,请将此列表作为简短指南参考:
- 如果问题描述清楚且您没有疑问,请留下一条简短评论,说明您已经开始处理此问题。该问题通常会阻塞两周,以便您解决。
- 如果有不清楚的地方或您不确定如何操作,请留下评论,以便我们添加更详细的描述。
- 确保您的开发环境已配置完毕。您的机器上需要安装 Go,前端还需要 nodeJS。克隆此仓库并在克隆的文件夹中运行 make 命令。这将启动后端。要启动前端,您需要打开一个新的终端窗口进入前端文件夹。在那里运行 npm install,然后运行 npm run serve。这应该会自动打开一个新的浏览器窗口。
- 在开始工作之前,您应当先 fork 这个仓库,并将更改推送到您的 fork。随后,向上游发送合并请求。
联系方式
如果您有任何问题,请随时通过 slack 联系我们。
- 本文标题:gaia - 用任何编程语言构建强大的管道
- 本文链接:https://www.cn121.com/automation/gaia-pipeline-gaia.html
- 原项目:gaia-pipeline/gaia 版权归原作者 gaia-pipeline 及贡献者所有
- 收录信息:本站于 2026-10-28 收录本项目,本页所列协议与仓库指标均为收录当时的状态;该日期之后原项目的版本更新与协议变更,本页不作同步。
- 开源协议:收录时本项目采用 Apache-2.0(查看 LICENSE 原文),本站译文为其衍生内容;使用、修改、分发请以该仓库 LICENSE 原文为准。本站对原文仅作排版与图片地址适配, 并保留原项目的 NOTICE 与署名要求。
- 站点出处:本文首发于 OneTwoOne,收录自 GitHub 开源项目 gaia-pipeline/gaia。
- 翻译说明:本页正文为人工智能生成内容——由机器翻译对原项目 README 初译、经程序校验排版,可能存在错漏,请以原项目文档为准。
- 引用声明:商业转载、第三方聚合或 AI 检索训练引用时,请务必保留以上来源出处、本文永久链接,以及原项目的版权声明与许可信息。
- 下架通道:若原项目此后变更或收紧了许可协议、或作者/权利人认为本站的收录方式(译文、排版适配、简介翻译等)超出其授权范围,请通过 xyd3302001@163.com 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。