Repository files navigation

Build StatusGo Report CardGoDocApache licensedSlackcodecov

Gaia is an open source automation platform which makes it easy and fun to build powerful pipelines in any programming language. Based on HashiCorp's go-plugin and gRPC, gaia is efficient, fast, lightweight, and developer friendly. Gaia is currently alpha! Do not use it for mission critical jobs yet!

Develop powerful pipelines with the help of SDKs and simply check-in your code into a git repository. Gaia automatically clones your code repository, compiles your code to a binary, and executes it on-demand. All results are streamed back and formatted as a user-friendly graphical output.

Check out gaia-pipeline.io to learn more.

Motivation

Automation Engineer, DevOps, SRE, Cloud Engineer, Platform Engineer - they all have one in common: The majority of tech people are not motivated to take up this work and they are hard to recruit.

One of the main reasons for this is the abstraction and poor execution of many automation tools. They come with their own configuration (YAML syntax) specification or limit the user to one specific programming language. Testing is nearly impossible because most automation tools lack the ability to mock services and subsystems. Even tiny things, for example parsing a JSON file, are sometimes really painful because external, outdated libraries were used and not included in the standard framework.

We believe it's time to remove all those abstractions and come back to our roots. Are you tired of writing endless lines of YAML-code? Are you sick of spending days forced to write in a language that does not suit you and is not fun at all? Do you enjoy programming in a language you like? Then Gaia is for you.

How does it work?

Gaia is based on HashiCorp's go-plugin. It's a plugin system that uses gRPC to communicate over HTTP/2. Initially, HashiCorp developed this tool for Packer but now it's heavily used by Terraform, Nomad, and Vault too.

Plugins, which we named pipelines, are applications which can be written in any programming language, as long as gRPC is supported. All functions, which we call jobs, are exposed to Gaia and can form up a dependency graph which describes the order of execution.

Pipelines can be compiled locally or simply over the build system. Gaia clones the git repository and automatically builds the included pipeline. If a change (git push) happened, Gaia will automatically rebuild the pipeline for you*.

After a pipeline has been started, all log output is returned back to Gaia and displayed in a detailed overview with their final result status.

Gaia uses boltDB for storage. This makes the installation step super easy. No external database is currently required.

* This requires polling or webhook to be activated.

Screenshots

gaia login screenshotgaia overview screenshotgaia create pipeline screenshotgaia pipeline detailed screenshotgaia pipeline logs screenshotgaia Vault screenshotgaia settings screenshot

Getting Started

Installation

The installation of gaia is simple and often takes a few minutes.

Using docker

The following command starts gaia as a daemon process and mounts all data to the current folder. Afterwards, gaia will be available on the host system on port 8080. Use the standard user admin and password admin as initial login. It is recommended to change the password afterwards.

docker run -d -p 8080:8080 -v $PWD:/data gaiapipeline/gaia:latest

This uses the image with the latest tag which includes all required libraries and compilers for all supported languages. If you prefer a smaller image suited for your preferred language, have a look at the available docker image tags.

Manually

It is possible to install Gaia directly on the host system. This can be achieved by downloading the binary from the releases page.

Gaia will automatically detect the folder of the binary and will place all data next to it. You can change the data directory with the startup parameter --homepath if you want.

Using helm

If you haven't got an ingress controller pod yet, make sure that you have kube-dns or coredns enabled, run this command to set it up.

make kube-ingress

To init helm:

helm init

To deploy gaia:

make deploy-kube

Usage

Go

package main
import (
"log"
sdk "github.com/gaia-pipeline/gosdk"
)
// This is one job. Add more if you want.funcDoSomethingAwesome(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.returnnil
}
funcmain() {
jobs:= sdk.Jobs{
sdk.Job{
Handler: DoSomethingAwesome,
Title: "DoSomethingAwesome",
Description: "This job does something awesome.",
},
}
// Serveiferr:=sdk.Serve(jobs); err!=nil {
panic(err)
}
}

Python

fromgaiasdkimportsdkimportloggingdefMyAwesomeJob(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!")defmain():
logging.basicConfig(level=logging.INFO)
myjob=sdk.Job("MyAwesomeJob", "Do something awesome", MyAwesomeJob)
sdk.serve([myjob])

Java

packageio.gaiapipeline;
importio.gaiapipeline.javasdk.*;
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.logging.Logger;
publicclassPipeline
{
privatestaticfinalLoggerLOGGER = Logger.getLogger(Pipeline.class.getName());
privatestaticHandlerMyAwesomeJob = (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!");
};
publicstaticvoidmain( String[] args )
{
PipelineJobmyjob = newPipelineJob();
myjob.setTitle("MyAwesomeJob");
myjob.setDescription("Do something awesome.");
myjob.setHandler(MyAwesomeJob);
Javasdksdk = newJavasdk();
try {
sdk.Serve(newArrayList<>(Arrays.asList(myjob)));
} catch (Exceptionex) {
ex.printStackTrace();
}
}
}

C++

#include"cppsdk/sdk.h"
#include<list>
#include<iostream>voidDoSomethingAwesome(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!"
}
intmain() {
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;
}
}

Ruby

require'rubysdk'classMainAwesomeJob=lambdado |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!"enddefself.mainawesomejob=Interface::Job.new(title: "Awesome Job",handler: AwesomeJob,desc: "This job does something awesome.")beginRubySDK.Serve([awesomejob])rescue=>eputs"Error occured: #{e}"exit(false)endendend

Pipelines are defined by jobs and a function usually represents a job. You can define as many jobs in your pipeline as you want.

Every function accepts arguments. Those arguments can be requested from the pipeline itself and the values passed back in from the UI.

Some pipeline jobs need a specific order of execution. DependsOn allows you to declare dependencies for every job.

You can find real examples and more information on how to develop a pipeline in the docs.

Security

See the Documentation located here: security-docs.

Documentation and more

Please find the docs at https://docs.gaia-pipeline.io. We also have a tutorials section over there with examples and real use-case scenarios. For example, Kubernetes deployment with vault integration.

Questions and Answers (Q&A)

What problem solves Gaia?

Literally every tool which were designed for automation, continuous integration (CI), and continuous deployment (CD) like Spinnaker, Jenkins, Gitlab CI/CD, TravisCI, CircleCI, Codeship, Bamboo and many more, introduced their own configuration format. Some of them don't even support configuration/automation as code. This works well for simple tasks like running a go install or mvn clean install but in the real world there is more to do.

Gaia is the first platform which does not limit the user and provides full support for almost all common programming languages without losing the features offered by todays CI/CD tools.

What is a pipeline?

A pipeline is a real application with at least one function (we call it a Job). Every programming language can be used as long as gRPC is supported. We offer SDKs to support the development.

What is a job?

A job is a function, usually globally exposed to Gaia. Dependent on the dependency graph, Gaia will execute this function in a specific order.

Why do I need an SDK?

The SDK implements the Gaia plugin gRPC interface and offers helper functions like serving the gRPC-Server. This helps you to focus on the real problem instead of doing the boring stuff.

Which programming languages are supported?

We currently fully support Golang, Java, Python, C++ and Ruby.

When do you support programming language XYZ?

We are working hard to support as much programming languages as possible but our resources are limited and we are also mostly no experts in all programming languages. If you are willing to contribute, feel free to open an issue and start working.

Roadmap

Gaia is currently available as alpha version. We extremely recommend to not use it for mission critical jobs and for production yet. Things will change in the future and essential features may break.

One of the main issues currently is the lack of unit- and integration tests. This is on our to-do list and we are working on this topic with high priority.

It is planned that other programming languages should be supported in the next few months. It is up to the community which languages will be supported next.

Contributing

Gaia can only evolve and become a great product with the help of contributors. If you like to contribute, please have a look at our issues section. We do our best to mark issues for new contributors with the label good first issue.

If you think you found a good first issue, please consider this list as a short guide:

  • If the issue is clear and you have no questions, please leave a short comment that you started working on this. The issue will be usually blocked for two weeks for you to solve it.
  • If something is not clear or you are unsure what to do, please leave a comment so we can add more detailed description.
  • Make sure your development environment is configured and set up. You need Go installed on your machine and also nodeJS for the frontend. Clone this repository and run the make command inside the cloned folder. This will start the backend. To start the frontend you have to open a new terminal window and go into the frontend folder. There you run npm install and then npm run dev. This should automatically open a new browser window.
  • Before you start your work, you should fork this repository and push changes to your fork. Afterwards, send a merge request back to upstream.

Contact

If you have any questions feel free to contact us on slack.

About

Build powerful pipelines in any programming language.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Build StatusGo Report CardGoDocApache licensedSlackcodecov

Gaia is an open source automation platform which makes it easy and fun to build powerful pipelines in any programming language. Based on HashiCorp's go-plugin and gRPC, gaia is efficient, fast, lightweight, and developer friendly. Gaia is currently alpha! Do not use it for mission critical jobs yet!

Develop powerful pipelines with the help of SDKs and simply check-in your code into a git repository. Gaia automatically clones your code repository, compiles your code to a binary, and executes it on-demand. All results are streamed back and formatted as a user-friendly graphical output.

Check out gaia-pipeline.io to learn more.

Motivation

Automation Engineer, DevOps, SRE, Cloud Engineer, Platform Engineer - they all have one in common: The majority of tech people are not motivated to take up this work and they are hard to recruit.

One of the main reasons for this is the abstraction and poor execution of many automation tools. They come with their own configuration (YAML syntax) specification or limit the user to one specific programming language. Testing is nearly impossible because most automation tools lack the ability to mock services and subsystems. Even tiny things, for example parsing a JSON file, are sometimes really painful because external, outdated libraries were used and not included in the standard framework.

We believe it's time to remove all those abstractions and come back to our roots. Are you tired of writing endless lines of YAML-code? Are you sick of spending days forced to write in a language that does not suit you and is not fun at all? Do you enjoy programming in a language you like? Then Gaia is for you.

How does it work?

Gaia is based on HashiCorp's go-plugin. It's a plugin system that uses gRPC to communicate over HTTP/2. Initially, HashiCorp developed this tool for Packer but now it's heavily used by Terraform, Nomad, and Vault too.

Plugins, which we named pipelines, are applications which can be written in any programming language, as long as gRPC is supported. All functions, which we call jobs, are exposed to Gaia and can form up a dependency graph which describes the order of execution.

Pipelines can be compiled locally or simply over the build system. Gaia clones the git repository and automatically builds the included pipeline. If a change (git push) happened, Gaia will automatically rebuild the pipeline for you*.

After a pipeline has been started, all log output is returned back to Gaia and displayed in a detailed overview with their final result status.

Gaia uses boltDB for storage. This makes the installation step super easy. No external database is currently required.

* This requires polling or webhook to be activated.

Screenshots

gaia login screenshotgaia overview screenshotgaia create pipeline screenshotgaia pipeline detailed screenshotgaia pipeline logs screenshotgaia Vault screenshotgaia settings screenshot

Getting Started

Installation

The installation of gaia is simple and often takes a few minutes.

Using docker

The following command starts gaia as a daemon process and mounts all data to the current folder. Afterwards, gaia will be available on the host system on port 8080. Use the standard user admin and password admin as initial login. It is recommended to change the password afterwards.

docker run -d -p 8080:8080 -v $PWD:/data gaiapipeline/gaia:latest

This uses the image with the latest tag which includes all required libraries and compilers for all supported languages. If you prefer a smaller image suited for your preferred language, have a look at the available docker image tags.

Manually

It is possible to install Gaia directly on the host system. This can be achieved by downloading the binary from the releases page.

Gaia will automatically detect the folder of the binary and will place all data next to it. You can change the data directory with the startup parameter --homepath if you want.

Using helm

If you haven't got an ingress controller pod yet, make sure that you have kube-dns or coredns enabled, run this command to set it up.

make kube-ingress

To init helm:

helm init

To deploy gaia:

make deploy-kube

Usage

Go

package main
import (
"log"
sdk "github.com/gaia-pipeline/gosdk"
)
// This is one job. Add more if you want.funcDoSomethingAwesome(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.returnnil
}
funcmain() {
jobs:= sdk.Jobs{
sdk.Job{
Handler: DoSomethingAwesome,
Title: "DoSomethingAwesome",
Description: "This job does something awesome.",
},
}
// Serveiferr:=sdk.Serve(jobs); err!=nil {
panic(err)
}
}

Python

fromgaiasdkimportsdkimportloggingdefMyAwesomeJob(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!")defmain():
logging.basicConfig(level=logging.INFO)
myjob=sdk.Job("MyAwesomeJob", "Do something awesome", MyAwesomeJob)
sdk.serve([myjob])

Java

packageio.gaiapipeline;
importio.gaiapipeline.javasdk.*;
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.logging.Logger;
publicclassPipeline
{
privatestaticfinalLoggerLOGGER = Logger.getLogger(Pipeline.class.getName());
privatestaticHandlerMyAwesomeJob = (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!");
};
publicstaticvoidmain( String[] args )
{
PipelineJobmyjob = newPipelineJob();
myjob.setTitle("MyAwesomeJob");
myjob.setDescription("Do something awesome.");
myjob.setHandler(MyAwesomeJob);
Javasdksdk = newJavasdk();
try {
sdk.Serve(newArrayList<>(Arrays.asList(myjob)));
} catch (Exceptionex) {
ex.printStackTrace();
}
}
}

C++

#include"cppsdk/sdk.h"
#include<list>
#include<iostream>voidDoSomethingAwesome(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!"
}
intmain() {
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;
}
}

Ruby

require'rubysdk'classMainAwesomeJob=lambdado |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!"enddefself.mainawesomejob=Interface::Job.new(title: "Awesome Job",handler: AwesomeJob,desc: "This job does something awesome.")beginRubySDK.Serve([awesomejob])rescue=>eputs"Error occured: #{e}"exit(false)endendend

Pipelines are defined by jobs and a function usually represents a job. You can define as many jobs in your pipeline as you want.

Every function accepts arguments. Those arguments can be requested from the pipeline itself and the values passed back in from the UI.

Some pipeline jobs need a specific order of execution. DependsOn allows you to declare dependencies for every job.

You can find real examples and more information on how to develop a pipeline in the docs.

Security

See the Documentation located here: security-docs.

Documentation and more

Please find the docs at https://docs.gaia-pipeline.io. We also have a tutorials section over there with examples and real use-case scenarios. For example, Kubernetes deployment with vault integration.

Questions and Answers (Q&A)

What problem solves Gaia?

Literally every tool which were designed for automation, continuous integration (CI), and continuous deployment (CD) like Spinnaker, Jenkins, Gitlab CI/CD, TravisCI, CircleCI, Codeship, Bamboo and many more, introduced their own configuration format. Some of them don't even support configuration/automation as code. This works well for simple tasks like running a go install or mvn clean install but in the real world there is more to do.

Gaia is the first platform which does not limit the user and provides full support for almost all common programming languages without losing the features offered by todays CI/CD tools.

What is a pipeline?

A pipeline is a real application with at least one function (we call it a Job). Every programming language can be used as long as gRPC is supported. We offer SDKs to support the development.

What is a job?

A job is a function, usually globally exposed to Gaia. Dependent on the dependency graph, Gaia will execute this function in a specific order.

Why do I need an SDK?

The SDK implements the Gaia plugin gRPC interface and offers helper functions like serving the gRPC-Server. This helps you to focus on the real problem instead of doing the boring stuff.

Which programming languages are supported?

We currently fully support Golang, Java, Python, C++ and Ruby.

When do you support programming language XYZ?

We are working hard to support as much programming languages as possible but our resources are limited and we are also mostly no experts in all programming languages. If you are willing to contribute, feel free to open an issue and start working.

Roadmap

Gaia is currently available as alpha version. We extremely recommend to not use it for mission critical jobs and for production yet. Things will change in the future and essential features may break.

One of the main issues currently is the lack of unit- and integration tests. This is on our to-do list and we are working on this topic with high priority.

It is planned that other programming languages should be supported in the next few months. It is up to the community which languages will be supported next.

Contributing

Gaia can only evolve and become a great product with the help of contributors. If you like to contribute, please have a look at our issues section. We do our best to mark issues for new contributors with the label good first issue.

If you think you found a good first issue, please consider this list as a short guide:

  • If the issue is clear and you have no questions, please leave a short comment that you started working on this. The issue will be usually blocked for two weeks for you to solve it.
  • If something is not clear or you are unsure what to do, please leave a comment so we can add more detailed description.
  • Make sure your development environment is configured and set up. You need Go installed on your machine and also nodeJS for the frontend. Clone this repository and run the make command inside the cloned folder. This will start the backend. To start the frontend you have to open a new terminal window and go into the frontend folder. There you run npm install and then npm run dev. This should automatically open a new browser window.
  • Before you start your work, you should fork this repository and push changes to your fork. Afterwards, send a merge request back to upstream.

Contact

If you have any questions feel free to contact us on slack.

About

Build powerful pipelines in any programming language.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Build StatusGo Report CardGoDocApache licensedSlackcodecov

Gaia is an open source automation platform which makes it easy and fun to build powerful pipelines in any programming language. Based on HashiCorp's go-plugin and gRPC, gaia is efficient, fast, lightweight, and developer friendly. Gaia is currently alpha! Do not use it for mission critical jobs yet!

Develop powerful pipelines with the help of SDKs and simply check-in your code into a git repository. Gaia automatically clones your code repository, compiles your code to a binary, and executes it on-demand. All results are streamed back and formatted as a user-friendly graphical output.

Check out gaia-pipeline.io to learn more.

Motivation

Automation Engineer, DevOps, SRE, Cloud Engineer, Platform Engineer - they all have one in common: The majority of tech people are not motivated to take up this work and they are hard to recruit.

One of the main reasons for this is the abstraction and poor execution of many automation tools. They come with their own configuration (YAML syntax) specification or limit the user to one specific programming language. Testing is nearly impossible because most automation tools lack the ability to mock services and subsystems. Even tiny things, for example parsing a JSON file, are sometimes really painful because external, outdated libraries were used and not included in the standard framework.

We believe it's time to remove all those abstractions and come back to our roots. Are you tired of writing endless lines of YAML-code? Are you sick of spending days forced to write in a language that does not suit you and is not fun at all? Do you enjoy programming in a language you like? Then Gaia is for you.

How does it work?

Gaia is based on HashiCorp's go-plugin. It's a plugin system that uses gRPC to communicate over HTTP/2. Initially, HashiCorp developed this tool for Packer but now it's heavily used by Terraform, Nomad, and Vault too.

Plugins, which we named pipelines, are applications which can be written in any programming language, as long as gRPC is supported. All functions, which we call jobs, are exposed to Gaia and can form up a dependency graph which describes the order of execution.

Pipelines can be compiled locally or simply over the build system. Gaia clones the git repository and automatically builds the included pipeline. If a change (git push) happened, Gaia will automatically rebuild the pipeline for you*.

After a pipeline has been started, all log output is returned back to Gaia and displayed in a detailed overview with their final result status.

Gaia uses boltDB for storage. This makes the installation step super easy. No external database is currently required.

* This requires polling or webhook to be activated.

Screenshots

gaia login screenshotgaia overview screenshotgaia create pipeline screenshotgaia pipeline detailed screenshotgaia pipeline logs screenshotgaia Vault screenshotgaia settings screenshot

Getting Started

Installation

The installation of gaia is simple and often takes a few minutes.

Using docker

The following command starts gaia as a daemon process and mounts all data to the current folder. Afterwards, gaia will be available on the host system on port 8080. Use the standard user admin and password admin as initial login. It is recommended to change the password afterwards.

docker run -d -p 8080:8080 -v $PWD:/data gaiapipeline/gaia:latest

This uses the image with the latest tag which includes all required libraries and compilers for all supported languages. If you prefer a smaller image suited for your preferred language, have a look at the available docker image tags.

Manually

It is possible to install Gaia directly on the host system. This can be achieved by downloading the binary from the releases page.

Gaia will automatically detect the folder of the binary and will place all data next to it. You can change the data directory with the startup parameter --homepath if you want.

Using helm

If you haven't got an ingress controller pod yet, make sure that you have kube-dns or coredns enabled, run this command to set it up.

make kube-ingress

To init helm:

helm init

To deploy gaia:

make deploy-kube

Usage

Go

package main
import (
"log"
sdk "github.com/gaia-pipeline/gosdk"
)
// This is one job. Add more if you want.funcDoSomethingAwesome(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.returnnil
}
funcmain() {
jobs:= sdk.Jobs{
sdk.Job{
Handler: DoSomethingAwesome,
Title: "DoSomethingAwesome",
Description: "This job does something awesome.",
},
}
// Serveiferr:=sdk.Serve(jobs); err!=nil {
panic(err)
}
}

Python

fromgaiasdkimportsdkimportloggingdefMyAwesomeJob(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!")defmain():
logging.basicConfig(level=logging.INFO)
myjob=sdk.Job("MyAwesomeJob", "Do something awesome", MyAwesomeJob)
sdk.serve([myjob])

Java

packageio.gaiapipeline;
importio.gaiapipeline.javasdk.*;
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.logging.Logger;
publicclassPipeline
{
privatestaticfinalLoggerLOGGER = Logger.getLogger(Pipeline.class.getName());
privatestaticHandlerMyAwesomeJob = (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!");
};
publicstaticvoidmain( String[] args )
{
PipelineJobmyjob = newPipelineJob();
myjob.setTitle("MyAwesomeJob");
myjob.setDescription("Do something awesome.");
myjob.setHandler(MyAwesomeJob);
Javasdksdk = newJavasdk();
try {
sdk.Serve(newArrayList<>(Arrays.asList(myjob)));
} catch (Exceptionex) {
ex.printStackTrace();
}
}
}

C++

#include"cppsdk/sdk.h"
#include<list>
#include<iostream>voidDoSomethingAwesome(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!"
}
intmain() {
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;
}
}

Ruby

require'rubysdk'classMainAwesomeJob=lambdado |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!"enddefself.mainawesomejob=Interface::Job.new(title: "Awesome Job",handler: AwesomeJob,desc: "This job does something awesome.")beginRubySDK.Serve([awesomejob])rescue=>eputs"Error occured: #{e}"exit(false)endendend

Pipelines are defined by jobs and a function usually represents a job. You can define as many jobs in your pipeline as you want.

Every function accepts arguments. Those arguments can be requested from the pipeline itself and the values passed back in from the UI.

Some pipeline jobs need a specific order of execution. DependsOn allows you to declare dependencies for every job.

You can find real examples and more information on how to develop a pipeline in the docs.

Security

See the Documentation located here: security-docs.

Documentation and more

Please find the docs at https://docs.gaia-pipeline.io. We also have a tutorials section over there with examples and real use-case scenarios. For example, Kubernetes deployment with vault integration.

Questions and Answers (Q&A)

What problem solves Gaia?

Literally every tool which were designed for automation, continuous integration (CI), and continuous deployment (CD) like Spinnaker, Jenkins, Gitlab CI/CD, TravisCI, CircleCI, Codeship, Bamboo and many more, introduced their own configuration format. Some of them don't even support configuration/automation as code. This works well for simple tasks like running a go install or mvn clean install but in the real world there is more to do.

Gaia is the first platform which does not limit the user and provides full support for almost all common programming languages without losing the features offered by todays CI/CD tools.

What is a pipeline?

A pipeline is a real application with at least one function (we call it a Job). Every programming language can be used as long as gRPC is supported. We offer SDKs to support the development.

What is a job?

A job is a function, usually globally exposed to Gaia. Dependent on the dependency graph, Gaia will execute this function in a specific order.

Why do I need an SDK?

The SDK implements the Gaia plugin gRPC interface and offers helper functions like serving the gRPC-Server. This helps you to focus on the real problem instead of doing the boring stuff.

Which programming languages are supported?

We currently fully support Golang, Java, Python, C++ and Ruby.

When do you support programming language XYZ?

We are working hard to support as much programming languages as possible but our resources are limited and we are also mostly no experts in all programming languages. If you are willing to contribute, feel free to open an issue and start working.

Roadmap

Gaia is currently available as alpha version. We extremely recommend to not use it for mission critical jobs and for production yet. Things will change in the future and essential features may break.

One of the main issues currently is the lack of unit- and integration tests. This is on our to-do list and we are working on this topic with high priority.

It is planned that other programming languages should be supported in the next few months. It is up to the community which languages will be supported next.

Contributing

Gaia can only evolve and become a great product with the help of contributors. If you like to contribute, please have a look at our issues section. We do our best to mark issues for new contributors with the label good first issue.

If you think you found a good first issue, please consider this list as a short guide:

  • If the issue is clear and you have no questions, please leave a short comment that you started working on this. The issue will be usually blocked for two weeks for you to solve it.
  • If something is not clear or you are unsure what to do, please leave a comment so we can add more detailed description.
  • Make sure your development environment is configured and set up. You need Go installed on your machine and also nodeJS for the frontend. Clone this repository and run the make command inside the cloned folder. This will start the backend. To start the frontend you have to open a new terminal window and go into the frontend folder. There you run npm install and then npm run dev. This should automatically open a new browser window.
  • Before you start your work, you should fork this repository and push changes to your fork. Afterwards, send a merge request back to upstream.

Contact

If you have any questions feel free to contact us on slack.

About

Build powerful pipelines in any programming language.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Build StatusGo Report CardGoDocApache licensedSlackcodecov

Gaia is an open source automation platform which makes it easy and fun to build powerful pipelines in any programming language. Based on HashiCorp's go-plugin and gRPC, gaia is efficient, fast, lightweight, and developer friendly. Gaia is currently alpha! Do not use it for mission critical jobs yet!

Develop powerful pipelines with the help of SDKs and simply check-in your code into a git repository. Gaia automatically clones your code repository, compiles your code to a binary, and executes it on-demand. All results are streamed back and formatted as a user-friendly graphical output.

Check out gaia-pipeline.io to learn more.

Motivation

Automation Engineer, DevOps, SRE, Cloud Engineer, Platform Engineer - they all have one in common: The majority of tech people are not motivated to take up this work and they are hard to recruit.

One of the main reasons for this is the abstraction and poor execution of many automation tools. They come with their own configuration (YAML syntax) specification or limit the user to one specific programming language. Testing is nearly impossible because most automation tools lack the ability to mock services and subsystems. Even tiny things, for example parsing a JSON file, are sometimes really painful because external, outdated libraries were used and not included in the standard framework.

We believe it's time to remove all those abstractions and come back to our roots. Are you tired of writing endless lines of YAML-code? Are you sick of spending days forced to write in a language that does not suit you and is not fun at all? Do you enjoy programming in a language you like? Then Gaia is for you.

How does it work?

Gaia is based on HashiCorp's go-plugin. It's a plugin system that uses gRPC to communicate over HTTP/2. Initially, HashiCorp developed this tool for Packer but now it's heavily used by Terraform, Nomad, and Vault too.

Plugins, which we named pipelines, are applications which can be written in any programming language, as long as gRPC is supported. All functions, which we call jobs, are exposed to Gaia and can form up a dependency graph which describes the order of execution.

Pipelines can be compiled locally or simply over the build system. Gaia clones the git repository and automatically builds the included pipeline. If a change (git push) happened, Gaia will automatically rebuild the pipeline for you*.

After a pipeline has been started, all log output is returned back to Gaia and displayed in a detailed overview with their final result status.

Gaia uses boltDB for storage. This makes the installation step super easy. No external database is currently required.

* This requires polling or webhook to be activated.

Screenshots

gaia login screenshotgaia overview screenshotgaia create pipeline screenshotgaia pipeline detailed screenshotgaia pipeline logs screenshotgaia Vault screenshotgaia settings screenshot

Getting Started

Installation

The installation of gaia is simple and often takes a few minutes.

Using docker

The following command starts gaia as a daemon process and mounts all data to the current folder. Afterwards, gaia will be available on the host system on port 8080. Use the standard user admin and password admin as initial login. It is recommended to change the password afterwards.

docker run -d -p 8080:8080 -v $PWD:/data gaiapipeline/gaia:latest

This uses the image with the latest tag which includes all required libraries and compilers for all supported languages. If you prefer a smaller image suited for your preferred language, have a look at the available docker image tags.

Manually

It is possible to install Gaia directly on the host system. This can be achieved by downloading the binary from the releases page.

Gaia will automatically detect the folder of the binary and will place all data next to it. You can change the data directory with the startup parameter --homepath if you want.

Using helm

If you haven't got an ingress controller pod yet, make sure that you have kube-dns or coredns enabled, run this command to set it up.

make kube-ingress

To init helm:

helm init

To deploy gaia:

make deploy-kube

Usage

Go

package main
import (
"log"
sdk "github.com/gaia-pipeline/gosdk"
)
// This is one job. Add more if you want.funcDoSomethingAwesome(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.returnnil
}
funcmain() {
jobs:= sdk.Jobs{
sdk.Job{
Handler: DoSomethingAwesome,
Title: "DoSomethingAwesome",
Description: "This job does something awesome.",
},
}
// Serveiferr:=sdk.Serve(jobs); err!=nil {
panic(err)
}
}

Python

fromgaiasdkimportsdkimportloggingdefMyAwesomeJob(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!")defmain():
logging.basicConfig(level=logging.INFO)
myjob=sdk.Job("MyAwesomeJob", "Do something awesome", MyAwesomeJob)
sdk.serve([myjob])

Java

packageio.gaiapipeline;
importio.gaiapipeline.javasdk.*;
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.logging.Logger;
publicclassPipeline
{
privatestaticfinalLoggerLOGGER = Logger.getLogger(Pipeline.class.getName());
privatestaticHandlerMyAwesomeJob = (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!");
};
publicstaticvoidmain( String[] args )
{
PipelineJobmyjob = newPipelineJob();
myjob.setTitle("MyAwesomeJob");
myjob.setDescription("Do something awesome.");
myjob.setHandler(MyAwesomeJob);
Javasdksdk = newJavasdk();
try {
sdk.Serve(newArrayList<>(Arrays.asList(myjob)));
} catch (Exceptionex) {
ex.printStackTrace();
}
}
}

C++

#include"cppsdk/sdk.h"
#include<list>
#include<iostream>voidDoSomethingAwesome(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!"
}
intmain() {
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;
}
}

Ruby

require'rubysdk'classMainAwesomeJob=lambdado |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!"enddefself.mainawesomejob=Interface::Job.new(title: "Awesome Job",handler: AwesomeJob,desc: "This job does something awesome.")beginRubySDK.Serve([awesomejob])rescue=>eputs"Error occured: #{e}"exit(false)endendend

Pipelines are defined by jobs and a function usually represents a job. You can define as many jobs in your pipeline as you want.

Every function accepts arguments. Those arguments can be requested from the pipeline itself and the values passed back in from the UI.

Some pipeline jobs need a specific order of execution. DependsOn allows you to declare dependencies for every job.

You can find real examples and more information on how to develop a pipeline in the docs.

Security

See the Documentation located here: security-docs.

Documentation and more

Please find the docs at https://docs.gaia-pipeline.io. We also have a tutorials section over there with examples and real use-case scenarios. For example, Kubernetes deployment with vault integration.

Questions and Answers (Q&A)

What problem solves Gaia?

Literally every tool which were designed for automation, continuous integration (CI), and continuous deployment (CD) like Spinnaker, Jenkins, Gitlab CI/CD, TravisCI, CircleCI, Codeship, Bamboo and many more, introduced their own configuration format. Some of them don't even support configuration/automation as code. This works well for simple tasks like running a go install or mvn clean install but in the real world there is more to do.

Gaia is the first platform which does not limit the user and provides full support for almost all common programming languages without losing the features offered by todays CI/CD tools.

What is a pipeline?

A pipeline is a real application with at least one function (we call it a Job). Every programming language can be used as long as gRPC is supported. We offer SDKs to support the development.

What is a job?

A job is a function, usually globally exposed to Gaia. Dependent on the dependency graph, Gaia will execute this function in a specific order.

Why do I need an SDK?

The SDK implements the Gaia plugin gRPC interface and offers helper functions like serving the gRPC-Server. This helps you to focus on the real problem instead of doing the boring stuff.

Which programming languages are supported?

We currently fully support Golang, Java, Python, C++ and Ruby.

When do you support programming language XYZ?

We are working hard to support as much programming languages as possible but our resources are limited and we are also mostly no experts in all programming languages. If you are willing to contribute, feel free to open an issue and start working.

Roadmap

Gaia is currently available as alpha version. We extremely recommend to not use it for mission critical jobs and for production yet. Things will change in the future and essential features may break.

One of the main issues currently is the lack of unit- and integration tests. This is on our to-do list and we are working on this topic with high priority.

It is planned that other programming languages should be supported in the next few months. It is up to the community which languages will be supported next.

Contributing

Gaia can only evolve and become a great product with the help of contributors. If you like to contribute, please have a look at our issues section. We do our best to mark issues for new contributors with the label good first issue.

If you think you found a good first issue, please consider this list as a short guide:

  • If the issue is clear and you have no questions, please leave a short comment that you started working on this. The issue will be usually blocked for two weeks for you to solve it.
  • If something is not clear or you are unsure what to do, please leave a comment so we can add more detailed description.
  • Make sure your development environment is configured and set up. You need Go installed on your machine and also nodeJS for the frontend. Clone this repository and run the make command inside the cloned folder. This will start the backend. To start the frontend you have to open a new terminal window and go into the frontend folder. There you run npm install and then npm run dev. This should automatically open a new browser window.
  • Before you start your work, you should fork this repository and push changes to your fork. Afterwards, send a merge request back to upstream.

Contact

If you have any questions feel free to contact us on slack.

About

Build powerful pipelines in any programming language.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Build StatusGo Report CardGoDocApache licensedSlackcodecov

Gaia is an open source automation platform which makes it easy and fun to build powerful pipelines in any programming language. Based on HashiCorp's go-plugin and gRPC, gaia is efficient, fast, lightweight, and developer friendly. Gaia is currently alpha! Do not use it for mission critical jobs yet!

Develop powerful pipelines with the help of SDKs and simply check-in your code into a git repository. Gaia automatically clones your code repository, compiles your code to a binary, and executes it on-demand. All results are streamed back and formatted as a user-friendly graphical output.

Check out gaia-pipeline.io to learn more.

Motivation

Automation Engineer, DevOps, SRE, Cloud Engineer, Platform Engineer - they all have one in common: The majority of tech people are not motivated to take up this work and they are hard to recruit.

One of the main reasons for this is the abstraction and poor execution of many automation tools. They come with their own configuration (YAML syntax) specification or limit the user to one specific programming language. Testing is nearly impossible because most automation tools lack the ability to mock services and subsystems. Even tiny things, for example parsing a JSON file, are sometimes really painful because external, outdated libraries were used and not included in the standard framework.

We believe it's time to remove all those abstractions and come back to our roots. Are you tired of writing endless lines of YAML-code? Are you sick of spending days forced to write in a language that does not suit you and is not fun at all? Do you enjoy programming in a language you like? Then Gaia is for you.

How does it work?

Gaia is based on HashiCorp's go-plugin. It's a plugin system that uses gRPC to communicate over HTTP/2. Initially, HashiCorp developed this tool for Packer but now it's heavily used by Terraform, Nomad, and Vault too.

Plugins, which we named pipelines, are applications which can be written in any programming language, as long as gRPC is supported. All functions, which we call jobs, are exposed to Gaia and can form up a dependency graph which describes the order of execution.

Pipelines can be compiled locally or simply over the build system. Gaia clones the git repository and automatically builds the included pipeline. If a change (git push) happened, Gaia will automatically rebuild the pipeline for you*.

After a pipeline has been started, all log output is returned back to Gaia and displayed in a detailed overview with their final result status.

Gaia uses boltDB for storage. This makes the installation step super easy. No external database is currently required.

* This requires polling or webhook to be activated.

Screenshots

gaia login screenshotgaia overview screenshotgaia create pipeline screenshotgaia pipeline detailed screenshotgaia pipeline logs screenshotgaia Vault screenshotgaia settings screenshot

Getting Started

Installation

The installation of gaia is simple and often takes a few minutes.

Using docker

The following command starts gaia as a daemon process and mounts all data to the current folder. Afterwards, gaia will be available on the host system on port 8080. Use the standard user admin and password admin as initial login. It is recommended to change the password afterwards.

docker run -d -p 8080:8080 -v $PWD:/data gaiapipeline/gaia:latest

This uses the image with the latest tag which includes all required libraries and compilers for all supported languages. If you prefer a smaller image suited for your preferred language, have a look at the available docker image tags.

Manually

It is possible to install Gaia directly on the host system. This can be achieved by downloading the binary from the releases page.

Gaia will automatically detect the folder of the binary and will place all data next to it. You can change the data directory with the startup parameter --homepath if you want.

Using helm

If you haven't got an ingress controller pod yet, make sure that you have kube-dns or coredns enabled, run this command to set it up.

make kube-ingress

To init helm:

helm init

To deploy gaia:

make deploy-kube

Usage

Go

package main
import (
"log"
sdk "github.com/gaia-pipeline/gosdk"
)
// This is one job. Add more if you want.funcDoSomethingAwesome(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.returnnil
}
funcmain() {
jobs:= sdk.Jobs{
sdk.Job{
Handler: DoSomethingAwesome,
Title: "DoSomethingAwesome",
Description: "This job does something awesome.",
},
}
// Serveiferr:=sdk.Serve(jobs); err!=nil {
panic(err)
}
}

Python

fromgaiasdkimportsdkimportloggingdefMyAwesomeJob(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!")defmain():
logging.basicConfig(level=logging.INFO)
myjob=sdk.Job("MyAwesomeJob", "Do something awesome", MyAwesomeJob)
sdk.serve([myjob])

Java

packageio.gaiapipeline;
importio.gaiapipeline.javasdk.*;
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.logging.Logger;
publicclassPipeline
{
privatestaticfinalLoggerLOGGER = Logger.getLogger(Pipeline.class.getName());
privatestaticHandlerMyAwesomeJob = (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!");
};
publicstaticvoidmain( String[] args )
{
PipelineJobmyjob = newPipelineJob();
myjob.setTitle("MyAwesomeJob");
myjob.setDescription("Do something awesome.");
myjob.setHandler(MyAwesomeJob);
Javasdksdk = newJavasdk();
try {
sdk.Serve(newArrayList<>(Arrays.asList(myjob)));
} catch (Exceptionex) {
ex.printStackTrace();
}
}
}

C++

#include"cppsdk/sdk.h"
#include<list>
#include<iostream>voidDoSomethingAwesome(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!"
}
intmain() {
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;
}
}

Ruby

require'rubysdk'classMainAwesomeJob=lambdado |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!"enddefself.mainawesomejob=Interface::Job.new(title: "Awesome Job",handler: AwesomeJob,desc: "This job does something awesome.")beginRubySDK.Serve([awesomejob])rescue=>eputs"Error occured: #{e}"exit(false)endendend

Pipelines are defined by jobs and a function usually represents a job. You can define as many jobs in your pipeline as you want.

Every function accepts arguments. Those arguments can be requested from the pipeline itself and the values passed back in from the UI.

Some pipeline jobs need a specific order of execution. DependsOn allows you to declare dependencies for every job.

You can find real examples and more information on how to develop a pipeline in the docs.

Security

See the Documentation located here: security-docs.

Documentation and more

Please find the docs at https://docs.gaia-pipeline.io. We also have a tutorials section over there with examples and real use-case scenarios. For example, Kubernetes deployment with vault integration.

Questions and Answers (Q&A)

What problem solves Gaia?

Literally every tool which were designed for automation, continuous integration (CI), and continuous deployment (CD) like Spinnaker, Jenkins, Gitlab CI/CD, TravisCI, CircleCI, Codeship, Bamboo and many more, introduced their own configuration format. Some of them don't even support configuration/automation as code. This works well for simple tasks like running a go install or mvn clean install but in the real world there is more to do.

Gaia is the first platform which does not limit the user and provides full support for almost all common programming languages without losing the features offered by todays CI/CD tools.

What is a pipeline?

A pipeline is a real application with at least one function (we call it a Job). Every programming language can be used as long as gRPC is supported. We offer SDKs to support the development.

What is a job?

A job is a function, usually globally exposed to Gaia. Dependent on the dependency graph, Gaia will execute this function in a specific order.

Why do I need an SDK?

The SDK implements the Gaia plugin gRPC interface and offers helper functions like serving the gRPC-Server. This helps you to focus on the real problem instead of doing the boring stuff.

Which programming languages are supported?

We currently fully support Golang, Java, Python, C++ and Ruby.

When do you support programming language XYZ?

We are working hard to support as much programming languages as possible but our resources are limited and we are also mostly no experts in all programming languages. If you are willing to contribute, feel free to open an issue and start working.

Roadmap

Gaia is currently available as alpha version. We extremely recommend to not use it for mission critical jobs and for production yet. Things will change in the future and essential features may break.

One of the main issues currently is the lack of unit- and integration tests. This is on our to-do list and we are working on this topic with high priority.

It is planned that other programming languages should be supported in the next few months. It is up to the community which languages will be supported next.

Contributing

Gaia can only evolve and become a great product with the help of contributors. If you like to contribute, please have a look at our issues section. We do our best to mark issues for new contributors with the label good first issue.

If you think you found a good first issue, please consider this list as a short guide:

  • If the issue is clear and you have no questions, please leave a short comment that you started working on this. The issue will be usually blocked for two weeks for you to solve it.
  • If something is not clear or you are unsure what to do, please leave a comment so we can add more detailed description.
  • Make sure your development environment is configured and set up. You need Go installed on your machine and also nodeJS for the frontend. Clone this repository and run the make command inside the cloned folder. This will start the backend. To start the frontend you have to open a new terminal window and go into the frontend folder. There you run npm install and then npm run dev. This should automatically open a new browser window.
  • Before you start your work, you should fork this repository and push changes to your fork. Afterwards, send a merge request back to upstream.

Contact

If you have any questions feel free to contact us on slack.

About

Build powerful pipelines in any programming language.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Build StatusGo Report CardGoDocApache licensedSlackcodecov

Gaia is an open source automation platform which makes it easy and fun to build powerful pipelines in any programming language. Based on HashiCorp's go-plugin and gRPC, gaia is efficient, fast, lightweight, and developer friendly. Gaia is currently alpha! Do not use it for mission critical jobs yet!

Develop powerful pipelines with the help of SDKs and simply check-in your code into a git repository. Gaia automatically clones your code repository, compiles your code to a binary, and executes it on-demand. All results are streamed back and formatted as a user-friendly graphical output.

Check out gaia-pipeline.io to learn more.

Motivation

Automation Engineer, DevOps, SRE, Cloud Engineer, Platform Engineer - they all have one in common: The majority of tech people are not motivated to take up this work and they are hard to recruit.

One of the main reasons for this is the abstraction and poor execution of many automation tools. They come with their own configuration (YAML syntax) specification or limit the user to one specific programming language. Testing is nearly impossible because most automation tools lack the ability to mock services and subsystems. Even tiny things, for example parsing a JSON file, are sometimes really painful because external, outdated libraries were used and not included in the standard framework.

We believe it's time to remove all those abstractions and come back to our roots. Are you tired of writing endless lines of YAML-code? Are you sick of spending days forced to write in a language that does not suit you and is not fun at all? Do you enjoy programming in a language you like? Then Gaia is for you.

How does it work?

Gaia is based on HashiCorp's go-plugin. It's a plugin system that uses gRPC to communicate over HTTP/2. Initially, HashiCorp developed this tool for Packer but now it's heavily used by Terraform, Nomad, and Vault too.

Plugins, which we named pipelines, are applications which can be written in any programming language, as long as gRPC is supported. All functions, which we call jobs, are exposed to Gaia and can form up a dependency graph which describes the order of execution.

Pipelines can be compiled locally or simply over the build system. Gaia clones the git repository and automatically builds the included pipeline. If a change (git push) happened, Gaia will automatically rebuild the pipeline for you*.

After a pipeline has been started, all log output is returned back to Gaia and displayed in a detailed overview with their final result status.

Gaia uses boltDB for storage. This makes the installation step super easy. No external database is currently required.

* This requires polling or webhook to be activated.

Screenshots

gaia login screenshotgaia overview screenshotgaia create pipeline screenshotgaia pipeline detailed screenshotgaia pipeline logs screenshotgaia Vault screenshotgaia settings screenshot

Getting Started

Installation

The installation of gaia is simple and often takes a few minutes.

Using docker

The following command starts gaia as a daemon process and mounts all data to the current folder. Afterwards, gaia will be available on the host system on port 8080. Use the standard user admin and password admin as initial login. It is recommended to change the password afterwards.

docker run -d -p 8080:8080 -v $PWD:/data gaiapipeline/gaia:latest

This uses the image with the latest tag which includes all required libraries and compilers for all supported languages. If you prefer a smaller image suited for your preferred language, have a look at the available docker image tags.

Manually

It is possible to install Gaia directly on the host system. This can be achieved by downloading the binary from the releases page.

Gaia will automatically detect the folder of the binary and will place all data next to it. You can change the data directory with the startup parameter --homepath if you want.

Using helm

If you haven't got an ingress controller pod yet, make sure that you have kube-dns or coredns enabled, run this command to set it up.

make kube-ingress

To init helm:

helm init

To deploy gaia:

make deploy-kube

Usage

Go

package main
import (
"log"
sdk "github.com/gaia-pipeline/gosdk"
)
// This is one job. Add more if you want.funcDoSomethingAwesome(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.returnnil
}
funcmain() {
jobs:= sdk.Jobs{
sdk.Job{
Handler: DoSomethingAwesome,
Title: "DoSomethingAwesome",
Description: "This job does something awesome.",
},
}
// Serveiferr:=sdk.Serve(jobs); err!=nil {
panic(err)
}
}

Python

fromgaiasdkimportsdkimportloggingdefMyAwesomeJob(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!")defmain():
logging.basicConfig(level=logging.INFO)
myjob=sdk.Job("MyAwesomeJob", "Do something awesome", MyAwesomeJob)
sdk.serve([myjob])

Java

packageio.gaiapipeline;
importio.gaiapipeline.javasdk.*;
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.logging.Logger;
publicclassPipeline
{
privatestaticfinalLoggerLOGGER = Logger.getLogger(Pipeline.class.getName());
privatestaticHandlerMyAwesomeJob = (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!");
};
publicstaticvoidmain( String[] args )
{
PipelineJobmyjob = newPipelineJob();
myjob.setTitle("MyAwesomeJob");
myjob.setDescription("Do something awesome.");
myjob.setHandler(MyAwesomeJob);
Javasdksdk = newJavasdk();
try {
sdk.Serve(newArrayList<>(Arrays.asList(myjob)));
} catch (Exceptionex) {
ex.printStackTrace();
}
}
}

C++

#include"cppsdk/sdk.h"
#include<list>
#include<iostream>voidDoSomethingAwesome(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!"
}
intmain() {
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;
}
}

Ruby

require'rubysdk'classMainAwesomeJob=lambdado |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!"enddefself.mainawesomejob=Interface::Job.new(title: "Awesome Job",handler: AwesomeJob,desc: "This job does something awesome.")beginRubySDK.Serve([awesomejob])rescue=>eputs"Error occured: #{e}"exit(false)endendend

Pipelines are defined by jobs and a function usually represents a job. You can define as many jobs in your pipeline as you want.

Every function accepts arguments. Those arguments can be requested from the pipeline itself and the values passed back in from the UI.

Some pipeline jobs need a specific order of execution. DependsOn allows you to declare dependencies for every job.

You can find real examples and more information on how to develop a pipeline in the docs.

Security

See the Documentation located here: security-docs.

Documentation and more

Please find the docs at https://docs.gaia-pipeline.io. We also have a tutorials section over there with examples and real use-case scenarios. For example, Kubernetes deployment with vault integration.

Questions and Answers (Q&A)

What problem solves Gaia?

Literally every tool which were designed for automation, continuous integration (CI), and continuous deployment (CD) like Spinnaker, Jenkins, Gitlab CI/CD, TravisCI, CircleCI, Codeship, Bamboo and many more, introduced their own configuration format. Some of them don't even support configuration/automation as code. This works well for simple tasks like running a go install or mvn clean install but in the real world there is more to do.

Gaia is the first platform which does not limit the user and provides full support for almost all common programming languages without losing the features offered by todays CI/CD tools.

What is a pipeline?

A pipeline is a real application with at least one function (we call it a Job). Every programming language can be used as long as gRPC is supported. We offer SDKs to support the development.

What is a job?

A job is a function, usually globally exposed to Gaia. Dependent on the dependency graph, Gaia will execute this function in a specific order.

Why do I need an SDK?

The SDK implements the Gaia plugin gRPC interface and offers helper functions like serving the gRPC-Server. This helps you to focus on the real problem instead of doing the boring stuff.

Which programming languages are supported?

We currently fully support Golang, Java, Python, C++ and Ruby.

When do you support programming language XYZ?

We are working hard to support as much programming languages as possible but our resources are limited and we are also mostly no experts in all programming languages. If you are willing to contribute, feel free to open an issue and start working.

Roadmap

Gaia is currently available as alpha version. We extremely recommend to not use it for mission critical jobs and for production yet. Things will change in the future and essential features may break.

One of the main issues currently is the lack of unit- and integration tests. This is on our to-do list and we are working on this topic with high priority.

It is planned that other programming languages should be supported in the next few months. It is up to the community which languages will be supported next.

Contributing

Gaia can only evolve and become a great product with the help of contributors. If you like to contribute, please have a look at our issues section. We do our best to mark issues for new contributors with the label good first issue.

If you think you found a good first issue, please consider this list as a short guide:

  • If the issue is clear and you have no questions, please leave a short comment that you started working on this. The issue will be usually blocked for two weeks for you to solve it.
  • If something is not clear or you are unsure what to do, please leave a comment so we can add more detailed description.
  • Make sure your development environment is configured and set up. You need Go installed on your machine and also nodeJS for the frontend. Clone this repository and run the make command inside the cloned folder. This will start the backend. To start the frontend you have to open a new terminal window and go into the frontend folder. There you run npm install and then npm run dev. This should automatically open a new browser window.
  • Before you start your work, you should fork this repository and push changes to your fork. Afterwards, send a merge request back to upstream.

Contact

If you have any questions feel free to contact us on slack.

About

Build powerful pipelines in any programming language.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Build StatusGo Report CardGoDocApache licensedSlackcodecov

Gaia is an open source automation platform which makes it easy and fun to build powerful pipelines in any programming language. Based on HashiCorp's go-plugin and gRPC, gaia is efficient, fast, lightweight, and developer friendly. Gaia is currently alpha! Do not use it for mission critical jobs yet!

Develop powerful pipelines with the help of SDKs and simply check-in your code into a git repository. Gaia automatically clones your code repository, compiles your code to a binary, and executes it on-demand. All results are streamed back and formatted as a user-friendly graphical output.

Check out gaia-pipeline.io to learn more.

Motivation

Automation Engineer, DevOps, SRE, Cloud Engineer, Platform Engineer - they all have one in common: The majority of tech people are not motivated to take up this work and they are hard to recruit.

One of the main reasons for this is the abstraction and poor execution of many automation tools. They come with their own configuration (YAML syntax) specification or limit the user to one specific programming language. Testing is nearly impossible because most automation tools lack the ability to mock services and subsystems. Even tiny things, for example parsing a JSON file, are sometimes really painful because external, outdated libraries were used and not included in the standard framework.

We believe it's time to remove all those abstractions and come back to our roots. Are you tired of writing endless lines of YAML-code? Are you sick of spending days forced to write in a language that does not suit you and is not fun at all? Do you enjoy programming in a language you like? Then Gaia is for you.

How does it work?

Gaia is based on HashiCorp's go-plugin. It's a plugin system that uses gRPC to communicate over HTTP/2. Initially, HashiCorp developed this tool for Packer but now it's heavily used by Terraform, Nomad, and Vault too.

Plugins, which we named pipelines, are applications which can be written in any programming language, as long as gRPC is supported. All functions, which we call jobs, are exposed to Gaia and can form up a dependency graph which describes the order of execution.

Pipelines can be compiled locally or simply over the build system. Gaia clones the git repository and automatically builds the included pipeline. If a change (git push) happened, Gaia will automatically rebuild the pipeline for you*.

After a pipeline has been started, all log output is returned back to Gaia and displayed in a detailed overview with their final result status.

Gaia uses boltDB for storage. This makes the installation step super easy. No external database is currently required.

* This requires polling or webhook to be activated.

Screenshots

gaia login screenshotgaia overview screenshotgaia create pipeline screenshotgaia pipeline detailed screenshotgaia pipeline logs screenshotgaia Vault screenshotgaia settings screenshot

Getting Started

Installation

The installation of gaia is simple and often takes a few minutes.

Using docker

The following command starts gaia as a daemon process and mounts all data to the current folder. Afterwards, gaia will be available on the host system on port 8080. Use the standard user admin and password admin as initial login. It is recommended to change the password afterwards.

docker run -d -p 8080:8080 -v $PWD:/data gaiapipeline/gaia:latest

This uses the image with the latest tag which includes all required libraries and compilers for all supported languages. If you prefer a smaller image suited for your preferred language, have a look at the available docker image tags.

Manually

It is possible to install Gaia directly on the host system. This can be achieved by downloading the binary from the releases page.

Gaia will automatically detect the folder of the binary and will place all data next to it. You can change the data directory with the startup parameter --homepath if you want.

Using helm

If you haven't got an ingress controller pod yet, make sure that you have kube-dns or coredns enabled, run this command to set it up.

make kube-ingress

To init helm:

helm init

To deploy gaia:

make deploy-kube

Usage

Go

package main
import (
"log"
sdk "github.com/gaia-pipeline/gosdk"
)
// This is one job. Add more if you want.funcDoSomethingAwesome(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.returnnil
}
funcmain() {
jobs:= sdk.Jobs{
sdk.Job{
Handler: DoSomethingAwesome,
Title: "DoSomethingAwesome",
Description: "This job does something awesome.",
},
}
// Serveiferr:=sdk.Serve(jobs); err!=nil {
panic(err)
}
}

Python

fromgaiasdkimportsdkimportloggingdefMyAwesomeJob(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!")defmain():
logging.basicConfig(level=logging.INFO)
myjob=sdk.Job("MyAwesomeJob", "Do something awesome", MyAwesomeJob)
sdk.serve([myjob])

Java

packageio.gaiapipeline;
importio.gaiapipeline.javasdk.*;
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.logging.Logger;
publicclassPipeline
{
privatestaticfinalLoggerLOGGER = Logger.getLogger(Pipeline.class.getName());
privatestaticHandlerMyAwesomeJob = (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!");
};
publicstaticvoidmain( String[] args )
{
PipelineJobmyjob = newPipelineJob();
myjob.setTitle("MyAwesomeJob");
myjob.setDescription("Do something awesome.");
myjob.setHandler(MyAwesomeJob);
Javasdksdk = newJavasdk();
try {
sdk.Serve(newArrayList<>(Arrays.asList(myjob)));
} catch (Exceptionex) {
ex.printStackTrace();
}
}
}

C++

#include"cppsdk/sdk.h"
#include<list>
#include<iostream>voidDoSomethingAwesome(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!"
}
intmain() {
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;
}
}

Ruby

require'rubysdk'classMainAwesomeJob=lambdado |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!"enddefself.mainawesomejob=Interface::Job.new(title: "Awesome Job",handler: AwesomeJob,desc: "This job does something awesome.")beginRubySDK.Serve([awesomejob])rescue=>eputs"Error occured: #{e}"exit(false)endendend

Pipelines are defined by jobs and a function usually represents a job. You can define as many jobs in your pipeline as you want.

Every function accepts arguments. Those arguments can be requested from the pipeline itself and the values passed back in from the UI.

Some pipeline jobs need a specific order of execution. DependsOn allows you to declare dependencies for every job.

You can find real examples and more information on how to develop a pipeline in the docs.

Security

See the Documentation located here: security-docs.

Documentation and more

Please find the docs at https://docs.gaia-pipeline.io. We also have a tutorials section over there with examples and real use-case scenarios. For example, Kubernetes deployment with vault integration.

Questions and Answers (Q&A)

What problem solves Gaia?

Literally every tool which were designed for automation, continuous integration (CI), and continuous deployment (CD) like Spinnaker, Jenkins, Gitlab CI/CD, TravisCI, CircleCI, Codeship, Bamboo and many more, introduced their own configuration format. Some of them don't even support configuration/automation as code. This works well for simple tasks like running a go install or mvn clean install but in the real world there is more to do.

Gaia is the first platform which does not limit the user and provides full support for almost all common programming languages without losing the features offered by todays CI/CD tools.

What is a pipeline?

A pipeline is a real application with at least one function (we call it a Job). Every programming language can be used as long as gRPC is supported. We offer SDKs to support the development.

What is a job?

A job is a function, usually globally exposed to Gaia. Dependent on the dependency graph, Gaia will execute this function in a specific order.

Why do I need an SDK?

The SDK implements the Gaia plugin gRPC interface and offers helper functions like serving the gRPC-Server. This helps you to focus on the real problem instead of doing the boring stuff.

Which programming languages are supported?

We currently fully support Golang, Java, Python, C++ and Ruby.

When do you support programming language XYZ?

We are working hard to support as much programming languages as possible but our resources are limited and we are also mostly no experts in all programming languages. If you are willing to contribute, feel free to open an issue and start working.

Roadmap

Gaia is currently available as alpha version. We extremely recommend to not use it for mission critical jobs and for production yet. Things will change in the future and essential features may break.

One of the main issues currently is the lack of unit- and integration tests. This is on our to-do list and we are working on this topic with high priority.

It is planned that other programming languages should be supported in the next few months. It is up to the community which languages will be supported next.

Contributing

Gaia can only evolve and become a great product with the help of contributors. If you like to contribute, please have a look at our issues section. We do our best to mark issues for new contributors with the label good first issue.

If you think you found a good first issue, please consider this list as a short guide:

  • If the issue is clear and you have no questions, please leave a short comment that you started working on this. The issue will be usually blocked for two weeks for you to solve it.
  • If something is not clear or you are unsure what to do, please leave a comment so we can add more detailed description.
  • Make sure your development environment is configured and set up. You need Go installed on your machine and also nodeJS for the frontend. Clone this repository and run the make command inside the cloned folder. This will start the backend. To start the frontend you have to open a new terminal window and go into the frontend folder. There you run npm install and then npm run dev. This should automatically open a new browser window.
  • Before you start your work, you should fork this repository and push changes to your fork. Afterwards, send a merge request back to upstream.

Contact

If you have any questions feel free to contact us on slack.

About

Build powerful pipelines in any programming language.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Build StatusGo Report CardGoDocApache licensedSlackcodecov

Gaia is an open source automation platform which makes it easy and fun to build powerful pipelines in any programming language. Based on HashiCorp's go-plugin and gRPC, gaia is efficient, fast, lightweight, and developer friendly. Gaia is currently alpha! Do not use it for mission critical jobs yet!

Develop powerful pipelines with the help of SDKs and simply check-in your code into a git repository. Gaia automatically clones your code repository, compiles your code to a binary, and executes it on-demand. All results are streamed back and formatted as a user-friendly graphical output.

Check out gaia-pipeline.io to learn more.

Motivation

Automation Engineer, DevOps, SRE, Cloud Engineer, Platform Engineer - they all have one in common: The majority of tech people are not motivated to take up this work and they are hard to recruit.

One of the main reasons for this is the abstraction and poor execution of many automation tools. They come with their own configuration (YAML syntax) specification or limit the user to one specific programming language. Testing is nearly impossible because most automation tools lack the ability to mock services and subsystems. Even tiny things, for example parsing a JSON file, are sometimes really painful because external, outdated libraries were used and not included in the standard framework.

We believe it's time to remove all those abstractions and come back to our roots. Are you tired of writing endless lines of YAML-code? Are you sick of spending days forced to write in a language that does not suit you and is not fun at all? Do you enjoy programming in a language you like? Then Gaia is for you.

How does it work?

Gaia is based on HashiCorp's go-plugin. It's a plugin system that uses gRPC to communicate over HTTP/2. Initially, HashiCorp developed this tool for Packer but now it's heavily used by Terraform, Nomad, and Vault too.

Plugins, which we named pipelines, are applications which can be written in any programming language, as long as gRPC is supported. All functions, which we call jobs, are exposed to Gaia and can form up a dependency graph which describes the order of execution.

Pipelines can be compiled locally or simply over the build system. Gaia clones the git repository and automatically builds the included pipeline. If a change (git push) happened, Gaia will automatically rebuild the pipeline for you*.

After a pipeline has been started, all log output is returned back to Gaia and displayed in a detailed overview with their final result status.

Gaia uses boltDB for storage. This makes the installation step super easy. No external database is currently required.

* This requires polling or webhook to be activated.

Screenshots

gaia login screenshotgaia overview screenshotgaia create pipeline screenshotgaia pipeline detailed screenshotgaia pipeline logs screenshotgaia Vault screenshotgaia settings screenshot

Getting Started

Installation

The installation of gaia is simple and often takes a few minutes.

Using docker

The following command starts gaia as a daemon process and mounts all data to the current folder. Afterwards, gaia will be available on the host system on port 8080. Use the standard user admin and password admin as initial login. It is recommended to change the password afterwards.

docker run -d -p 8080:8080 -v $PWD:/data gaiapipeline/gaia:latest

This uses the image with the latest tag which includes all required libraries and compilers for all supported languages. If you prefer a smaller image suited for your preferred language, have a look at the available docker image tags.

Manually

It is possible to install Gaia directly on the host system. This can be achieved by downloading the binary from the releases page.

Gaia will automatically detect the folder of the binary and will place all data next to it. You can change the data directory with the startup parameter --homepath if you want.

Using helm

If you haven't got an ingress controller pod yet, make sure that you have kube-dns or coredns enabled, run this command to set it up.

make kube-ingress

To init helm:

helm init

To deploy gaia:

make deploy-kube

Usage

Go

package main
import (
"log"
sdk "github.com/gaia-pipeline/gosdk"
)
// This is one job. Add more if you want.funcDoSomethingAwesome(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.returnnil
}
funcmain() {
jobs:= sdk.Jobs{
sdk.Job{
Handler: DoSomethingAwesome,
Title: "DoSomethingAwesome",
Description: "This job does something awesome.",
},
}
// Serveiferr:=sdk.Serve(jobs); err!=nil {
panic(err)
}
}

Python

fromgaiasdkimportsdkimportloggingdefMyAwesomeJob(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!")defmain():
logging.basicConfig(level=logging.INFO)
myjob=sdk.Job("MyAwesomeJob", "Do something awesome", MyAwesomeJob)
sdk.serve([myjob])

Java

packageio.gaiapipeline;
importio.gaiapipeline.javasdk.*;
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.logging.Logger;
publicclassPipeline
{
privatestaticfinalLoggerLOGGER = Logger.getLogger(Pipeline.class.getName());
privatestaticHandlerMyAwesomeJob = (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!");
};
publicstaticvoidmain( String[] args )
{
PipelineJobmyjob = newPipelineJob();
myjob.setTitle("MyAwesomeJob");
myjob.setDescription("Do something awesome.");
myjob.setHandler(MyAwesomeJob);
Javasdksdk = newJavasdk();
try {
sdk.Serve(newArrayList<>(Arrays.asList(myjob)));
} catch (Exceptionex) {
ex.printStackTrace();
}
}
}

C++

#include"cppsdk/sdk.h"
#include<list>
#include<iostream>voidDoSomethingAwesome(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!"
}
intmain() {
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;
}
}

Ruby

require'rubysdk'classMainAwesomeJob=lambdado |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!"enddefself.mainawesomejob=Interface::Job.new(title: "Awesome Job",handler: AwesomeJob,desc: "This job does something awesome.")beginRubySDK.Serve([awesomejob])rescue=>eputs"Error occured: #{e}"exit(false)endendend

Pipelines are defined by jobs and a function usually represents a job. You can define as many jobs in your pipeline as you want.

Every function accepts arguments. Those arguments can be requested from the pipeline itself and the values passed back in from the UI.

Some pipeline jobs need a specific order of execution. DependsOn allows you to declare dependencies for every job.

You can find real examples and more information on how to develop a pipeline in the docs.

Security

See the Documentation located here: security-docs.

Documentation and more

Please find the docs at https://docs.gaia-pipeline.io. We also have a tutorials section over there with examples and real use-case scenarios. For example, Kubernetes deployment with vault integration.

Questions and Answers (Q&A)

What problem solves Gaia?

Literally every tool which were designed for automation, continuous integration (CI), and continuous deployment (CD) like Spinnaker, Jenkins, Gitlab CI/CD, TravisCI, CircleCI, Codeship, Bamboo and many more, introduced their own configuration format. Some of them don't even support configuration/automation as code. This works well for simple tasks like running a go install or mvn clean install but in the real world there is more to do.

Gaia is the first platform which does not limit the user and provides full support for almost all common programming languages without losing the features offered by todays CI/CD tools.

What is a pipeline?

A pipeline is a real application with at least one function (we call it a Job). Every programming language can be used as long as gRPC is supported. We offer SDKs to support the development.

What is a job?

A job is a function, usually globally exposed to Gaia. Dependent on the dependency graph, Gaia will execute this function in a specific order.

Why do I need an SDK?

The SDK implements the Gaia plugin gRPC interface and offers helper functions like serving the gRPC-Server. This helps you to focus on the real problem instead of doing the boring stuff.

Which programming languages are supported?

We currently fully support Golang, Java, Python, C++ and Ruby.

When do you support programming language XYZ?

We are working hard to support as much programming languages as possible but our resources are limited and we are also mostly no experts in all programming languages. If you are willing to contribute, feel free to open an issue and start working.

Roadmap

Gaia is currently available as alpha version. We extremely recommend to not use it for mission critical jobs and for production yet. Things will change in the future and essential features may break.

One of the main issues currently is the lack of unit- and integration tests. This is on our to-do list and we are working on this topic with high priority.

It is planned that other programming languages should be supported in the next few months. It is up to the community which languages will be supported next.

Contributing

Gaia can only evolve and become a great product with the help of contributors. If you like to contribute, please have a look at our issues section. We do our best to mark issues for new contributors with the label good first issue.

If you think you found a good first issue, please consider this list as a short guide:

  • If the issue is clear and you have no questions, please leave a short comment that you started working on this. The issue will be usually blocked for two weeks for you to solve it.
  • If something is not clear or you are unsure what to do, please leave a comment so we can add more detailed description.
  • Make sure your development environment is configured and set up. You need Go installed on your machine and also nodeJS for the frontend. Clone this repository and run the make command inside the cloned folder. This will start the backend. To start the frontend you have to open a new terminal window and go into the frontend folder. There you run npm install and then npm run dev. This should automatically open a new browser window.
  • Before you start your work, you should fork this repository and push changes to your fork. Afterwards, send a merge request back to upstream.

Contact

If you have any questions feel free to contact us on slack.

About

Build powerful pipelines in any programming language.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages