自动化工具 已归档

gaia

gaia-pipeline/gaia

用任何编程语言构建强大的管道。

5213
Stars 标星
236
Forks 分支
101
Watchers 关注
55
Open Issues
Go
主要语言
Apache-2.0
开源协议
11.9 MB
仓库大小
9 个月前
最后推送
一键安装扩展 / 插件指令
dsh plugin --profile web add github:gaia-pipeline/gaia
git clone https://github.com/gaia-pipeline/gaia.git
git clone git@github.com:gaia-pipeline/gaia.git
README.md master

机器翻译正文由机器翻译自项目原始文档(英文),排版经程序统一处理,可能存在偏差,请以原项目仓库为准。

存档通知:感谢大家对 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 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。