Giter Site home page Giter Site logo

gaia-pipeline / gaia Goto Github PK

View Code? Open in Web Editor NEW
5.2K 107.0 242.0 14.45 MB

Build powerful pipelines in any programming language.

License: Apache License 2.0

JavaScript 1.31% Vue 16.57% HTML 0.06% Makefile 0.18% Go 79.02% Shell 0.01% Dockerfile 2.56% Java 0.07% C++ 0.15% Ruby 0.07%
go pipeline automation java python cplusplus build deployment kubernetes continuous-integration

gaia's Introduction

Build Status Go Report Card GoDoc Apache licensed Slack codecov

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.

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 Engineer, 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, also called pipelines, are applications which can be written in any programming language, as long as gRPC is supported. All functions, also called jobs, are exposed to Gaia and can form up a dependency graph that describes the order of execution.

Pipelines can be compiled locally or simply over the integrated 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 process super easy. No external database is currently required.

* This requires polling or webhook to be activated.

Screenshots

gaia login screenshot gaia overview screenshot gaia create pipeline screenshot gaia pipeline detailed screenshot gaia pipeline logs screenshot gaia Vault screenshot gaia 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 -home-path 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

Example Pipelines -----

Go

package main

import (
    "log"

sdk "github.com/gaia-pipeline/gosdk"
)

// This is one job. Add more if you want.
func DoSomethingAwesome(args sdk.Arguments) error {
    log.Println("This output will be streamed back to gaia and will be displayed in the pipeline logs.")

// An error occurred? Return it back so gaia knows that this job failed.
return nil
}

func main() {
    jobs := sdk.Jobs{
        sdk.Job{
            Handler:     DoSomethingAwesome,
        Title:       "DoSomethingAwesome",
    Description: "This job does something awesome.",
    },
}

// Serve
if err := sdk.Serve(jobs); err != nil {
    panic(err)
}

}

Python

from gaiasdk import sdk
import logging

def MyAwesomeJob(args):
    logging.info("This output will be streamed back to gaia and will be displayed in the pipeline logs.")
    # Just raise an exception to tell Gaia if a job failed.
    # raise Exception("Oh no, this job failed!")

def main():
    logging.basicConfig(level=logging.INFO)
    myjob = sdk.Job("MyAwesomeJob", "Do something awesome", MyAwesomeJob)
    sdk.serve([myjob])

Java

package io.gaiapipeline;

import io.gaiapipeline.javasdk.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.logging.Logger;

public class Pipeline
{
    private static final Logger LOGGER = Logger.getLogger(Pipeline.class.getName());

    private static Handler MyAwesomeJob = (gaiaArgs) -> {
        LOGGER.info("This output will be streamed back to gaia and will be displayed in the pipeline logs.");
    // Just raise an exception to tell Gaia if a job failed.
        // throw new IllegalArgumentException("Oh no, this job failed!");
    };

    public static void main( String[] args )
    {
        PipelineJob myjob = new PipelineJob();
        myjob.setTitle("MyAwesomeJob");
        myjob.setDescription("Do something awesome.");
        myjob.setHandler(MyAwesomeJob);

        Javasdk sdk = new Javasdk();
        try {
            sdk.Serve(new ArrayList<>(Arrays.asList(myjob)));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

C++

#include "cppsdk/sdk.h"
#include <list>
#include <iostream>

void DoSomethingAwesome(std::list<gaia::argument> args) throw(std::string) {
   std::cerr << "This output will be streamed back to gaia and will be displayed in the pipeline logs." << std::endl;

   // An error occurred? Return it back so gaia knows that this job failed.
   // throw "Uhh something badly happened!"
}

int main() {
   std::list<gaia::job> jobs;
   gaia::job awesomejob;
   awesomejob.handler = &DoSomethingAwesome;
   awesomejob.title = "DoSomethingAwesome";
   awesomejob.description = "This job does something awesome.";
   jobs.push_back(awesomejob);

   try {
      gaia::Serve(jobs);
   } catch (string e) {
      std::cerr << "Error: " << e << std::endl;
   }
}

Ruby

require 'rubysdk'

class Main
    AwesomeJob = lambda do |args|
        STDERR.puts "This output will be streamed back to gaia and will be displayed in the pipeline logs."

        # An error occurred? Raise an exception and gaia will fail the pipeline.
        # raise "Oh gosh! Something went wrong!"
    end

    def self.main
        awesomejob = Interface::Job.new(title: "Awesome Job",
                                        handler: AwesomeJob,
                                        desc: "This job does something awesome.")

        begin
            RubySDK.Serve([awesomejob])
        rescue => e
            puts "Error occured: #{e}"
            exit(false)
        end
    end
end

Node.JS ~~~~

const nodesdk = require('@gaia-pipeline/nodesdk');

function DoSomethingAwesome(args) {
    console.error('This output will be streamed back to gaia and will be displayed in the pipeline logs.');

    // An error occurred? Throw it back so gaia knows that this job failed.
    // throw new Error('My error message');
}

// Serve
try {
    nodesdk.Serve([{
        handler: DoSomethingAwesome,
        title: 'DoSomethingAwesome',
        description: 'This job does something awesome.'
    }]);
} catch (err) {
    console.error(err);
}

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 are 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 that was 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 that 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 Go, Java, Python, C++, Ruby and Node.JS.

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 beta version.

Feel free to open a new GitHub issue to request a new feature.

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 serve. 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.

gaia's People

Contributors

0xflotus avatar appleboy avatar bidhan-a avatar c0bra avatar czekaj avatar dependabot[bot] avatar gsokol avatar kthornley avatar mavimo avatar michelvocks avatar rmb938 avatar shivakishore14 avatar skarlso avatar speza avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gaia's Issues

Consider not committing in the vendor folder

Hi.

I'm trying to start contributing to this project and committing the vendor folder isn't a great way to start things off because they collide most of the time.

That's why the dep Lock file is there. When you start developing, you basically check out the project and go dep ensure. The lock file will make sure that all the right versions of the packages are used.

I can understand the committing vendor seems like a good idea because then you'll have the right code always with you, but makes for a poor developer experience.

Feel free to ignore this if you think otherwise, it's fine. :)

Refactor Git module to use a Storer

Right now, the git module can only be tested via actually cloning stuff.

I would like to avoid that, but my current PR is convoluted enough. :) I'm going to do that refactoring with in the confines of this ticket.

Create a PR checker binding.

I can see that there is a circleci integration but consider adding that to the PR as a hook so it can't be merged before everything is passing.

Delete pipeline needs manual restart

The only way to delete a pipeline is to manually remove the binary in the pipeline folder.
Then a manual restart of gaia is required since the pipeline is not automatically removed from the active global pipeline list.

What we have to do:
During the pipeline check we should check if a pipeline has been removed. If so, we should remove it from the active pipeline list.

Request for PHP support

I would officially like to request support for PHP.

I understand this won't come for some time, but I want the maintainers to be aware of my interest in it.

Failing test on OSX

~/golang/src/github.com/gaia-pipeline/gaia makefile_refactor 6s
❯ go test ./...
?   	github.com/gaia-pipeline/gaia	[no test files]
?   	github.com/gaia-pipeline/gaia/cmd/gaia	[no test files]
?   	github.com/gaia-pipeline/gaia/handlers	[no test files]
ok  	github.com/gaia-pipeline/gaia/pipeline	8.290s
?   	github.com/gaia-pipeline/gaia/plugin	[no test files]
ok  	github.com/gaia-pipeline/gaia/scheduler	0.016s
--- FAIL: TestUserAuth (0.01s)
	store_test.go:153: crypto/bcrypt: hashedPassword is not the hash of the given password
FAIL
cannot remove data folder: remove data: directory not empty
FAIL	github.com/gaia-pipeline/gaia/store	0.026s

This is a pin for later investigation. Osx, just doing go test ./....

[Proposal] remove strings.Builder in test cases

The use of strings.Builder requires Go 1.10+. Since this is only used in the test cases, it leaves an interesting situation where I'm able to run Gaia on Go 1.9, but while developing the tests fail. I think replacing the strings.Builder, which only serves as an io.Writer for the logging would normalize the dev/test/prod environments.

Alternatively an update to the README under the Contributing section could clear this up.

Thoughts?

Java pipelines support

After all the feedback, Java was the most wished one.
Let's develop an SDK for it and support it in Gaia.

The tests aren't cleaning up after themselves

When I run go test a bunch of things are left under pipeline that pollute the work tree.

~/golang/src/github.com/gaia-pipeline/gaia makefile_refactor* 10s
❯ git status
On branch makefile_refactor
Your branch is up-to-date with 'skarlso/makefile_refactor'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	pipeline/.circleci/
	pipeline/.gitignore
	pipeline/.goreleaser.yml
	pipeline/Gopkg.lock
	pipeline/Gopkg.toml
	pipeline/LICENSE
	pipeline/Makefile
	pipeline/README.rst
	pipeline/cmd/
	pipeline/docker/
	pipeline/frontend/
	pipeline/gaia.go
	pipeline/handlers/
	pipeline/pipeline/
	pipeline/plugin/
	pipeline/scheduler/
	pipeline/store/
	pipeline/vendor/

Pipeline parameters

When triggering a pipeline it would be nice to be able to specify input parameters. This would allow users to have dynamic configuration for their pipelines.

An example would be a pipeline that runs database migrations and it needs an input of the database name.

global state is magic → no package level storeService var [test, decoupling]

Don't use package level storeService var

If all of our constructors and functions take their dependencies explicitly, then we no longer have any use for globals. Instead, we can construct all of our database connections, our loggers, our resource pools, in our func main, so that future readers can very clearly map out a component graph.

https://peter.bourgon.org/blog/2017/06/09/theory-of-modern-go.html

instead we could use something like in a simpler manner:

// main.go
package main

import (
	"os"

	"github.com/boltdb/bolt"
	"github.com/gorilla/mux"
)

type BoltDBInstance interface {
	Open(path string, mode os.FileMode, options *bolt.Options) (*bolt.DB, error)
}

type server struct {
	storeDB BoltDBInstance
	router       *mux.Router
}

func main() {
	server := server{}
	storeDB, err := bolt.Open("store.db", 0600, nil)
	if err != nil {
		// do something
	}
	server.storeDB = storeDB
	server.routes()
}
// routes.go
func (s *server) routes() {
 // define routes
}

if you @michelvocks argue with this I can make this happen then testing handlers would be much easier.

Plans to support Mercurial?

... or other VCSes? Gaia doesn't actually do any version control; does it need to do anything more than what Go is capable of in the core toolset, of downloading source trees from multiple VCS sources? And if Gaia does need more capabilities, why not use something more flexible than go-git, such as SourceGraph's go-vcs?

Modify, Delete Pipeline feature

We already have a Settings subpage. We need a new tab-pane for managing pipelines.
Maybe a table with all currently active pipelines and every entry has buttons/icons to modify (renaming) and removing this pipeline.

What needs to be done:

  1. Create the functionality in the backend.
  2. Create a new tab-pane in the settings view with the required functionality.

Scheduler test can run into a data race error.

Details:

2018-08-15T21:47:24.501+0200 [DEBUG] Gaia: error during job execution: error="job failed" job="{2296842551 Job1  [] running}"
panic: send on closed channel

goroutine 13 [running]:
github.com/gaia-pipeline/gaia/scheduler.(*Scheduler).resolveDependencies(0xc420020f00, 0x89e70aca, 0x11e6932, 0x4, 0x0, 0x0, 0xc42000e2d0, 0x1, 0x1, 0x11ea8ba, ...)
        .../golang/src/github.com/gaia-pipeline/gaia/scheduler/scheduler.go:376 +0x2f0
github.com/gaia-pipeline/gaia/scheduler.(*Scheduler).resolveDependencies(0xc420020f00, 0x8ae70c5d, 0x11e6936, 0x4, 0x0, 0x0, 0xc42000e2d8, 0x1, 0x1, 0x11ea8ba, ...)
        .../golang/src/github.com/gaia-pipeline/gaia/scheduler/scheduler.go:358 +0x223
created by github.com/gaia-pipeline/gaia/scheduler.(*Scheduler).executeScheduler
        ...golang/src/github.com/gaia-pipeline/gaia/scheduler/scheduler.go:429 +0x2c9

Circle CI link: https://circleci.com/gh/gaia-pipeline/gaia/457?utm_campaign=vcs-integration-link&utm_medium=referral&utm_source=github-build-link

Refactor the scheduler test because it's flaky

Smells:

scheduler_test.go:144:146

	// Wait some time to pickup work and finish.
	// We have to wait at least 3 seconds for scheduler tick interval.
	time.Sleep(5 * time.Second)

This just failed with the error that the job is in an invalid status. I think this should be fortified or it will cause problems in the future. The scheduler needs to be tested in a different way, or manually kicked off at this stage, or somehow signal on a channel that it's done with its round.

JWT not valid afteer restart

Restarting the gaia process invalidates all JWT tokens. It seems like the jwt key is auto generated on startup instead of being passed in via a flag.

Plugin connection -> from unix sockets to port

Currently, Gaia uses unix sockets as communication channel for Gaia <-> Pipeline (Plugin) communication.

It has the following disadvantages:

  • Gaia only runs on Unix (Mac/Linux) systems.
  • Adding new SDKs is hard due to new/poor implementation and support of unix sockets.

It has the following advantages:

  • It's secure. You can only hijack the communication when you have access to the filesystem.

We need to change to real port communication. It also means that we have to generate certificates for the communication between Gaia and the Plugin.

Priority

At the moment the priority is just a ordering.

Other than that I really like this approach.

You could solve all this by just embeding NATS and using choreography over the NATS pub sub.

Then a job can be subscribed to another job ending.
You can also get sharing etc between components I side pipelines easily.
NATS over grpc is a well trodden path.

If you need some links to show what I mean just ask . I can really see me using this for iOS but also for applications

Anyway hope you don't mind me making suggestions

Better description in README file

I heard from a lot of people that the description (README file) is not very clear. Especially the term "pipeline" led to confusion. We should improve this soon to make clear what Gaia is and maybe how is it comparable to other projects (competitors).

Secret store for passwords, tokens, api keys and more

We need a secure way to store passwords, tokens, api keys and everything that should be kept secret.
For example when the user wants to access vault via a pipeline. Usually a token is required to get access to vault and this token should be stored in the secret store.

After a secret has been stored, it must be possible to automatically inject this password during runtime in the pipeline as a job argument. This is not a problem at all, we just have to decide how the user can setup the relationship between a secret and a pipeline. That means, which secret should be available in which pipeline.

First option: In the details page create a new view to configure the pipeline. Add a subview to manage secrets.

Second and preferred option: Create a new view below settings. This view is for managing secrets. When a view is created or modified it can be linked to multiple pipelines. This has the advantage that one secret can be shared with multiple pipelines.

What do you think?

stdin and stdout support with virtual console

Not sure if this is considered or is part of the featureset that you want to support.
In my experience, in real systems, it's often unrealistic to except existing software to be modified or rewritten to be made compatible with a pipeline.

Perhaps such support can be added as a plugin or a pipeline wrapper.

Overall, it is just an idle query since it is still alpha software.

Inform user when pipeline is broken

When a new pipeline has been created and detected by Gaia, it usually tries to start the pipeline and get all jobs for the detailed overview: https://github.com/gaia-pipeline/gaia/blob/master/pipeline/ticker.go#L114

Sometimes this can fail when:

  • The pipeline throws runtime exceptions (e.g. dependencies are not correctly declared).
  • The binary cannot be started because a dependency is missing.
  • Memory limit exceeded.
  • Many more reasons what can actually go wrong... 😄

We should make this more resilient and inform the user when something goes wrong.

Fix go example on readme file

The go example is actually broken. When executed, the following error will occur:

2018-08-22T19:39:12.930Z [WARN ] Gaia: using auto-generated key to sign jwt tokens, do not use in production
2018-08-22T19:39:13.327Z [INFO ] Gaia: vault file doesn't exist. creating...
⇨ http server started on [::]:8080
2018-08-22T19:42:03.714Z [DEBUG] plugin: starting plugin: path=/data/pipelines/TestPipeline_golang args=[]
2018-08-22T19:42:03.719Z [DEBUG] plugin: waiting for RPC address: path=/data/pipelines/TestPipeline_golang
2018-08-22T19:42:03.746Z [DEBUG] plugin.TestPipeline_golang: panic: job 'DoSomethingAwesome' has dependency '' which is not declared
2018-08-22T19:42:03.746Z [DEBUG] plugin.TestPipeline_golang:
2018-08-22T19:42:03.747Z [DEBUG] plugin.TestPipeline_golang: goroutine 1 [running]:
2018-08-22T19:42:03.747Z [DEBUG] plugin.TestPipeline_golang: main.main()
2018-08-22T19:42:03.747Z [DEBUG] plugin.TestPipeline_golang:  /data/tmp/golang/src/6a8ecca2-cdf8-4d3a-81de-28f28072d195/test.go:31 +0x104
2018-08-22T19:42:03.747Z [DEBUG] plugin: plugin process exited: path=/data/pipelines/TestPipeline_golang
2018-08-22T19:42:03.747Z [DEBUG] Gaia: cannot connect to pipeline: error="plugin exited before we could connect" pipeline="&{1 TestPipeline {https://[email protected]/scm/doc/gaia-pipelines.git bneil nope {  } refs/heads/master [] /data/tmp/golang/src/6a8ecca2-cdf8-4d3a-81de-28f28072d195} golang /data/pipelines/TestPipeline_golang [95 153 137 156 178 5 50 123 168 0 59 4 149 100 40 11 139 61 107 19 123 141 63 200 234 82 0 252 50 241 90 190] [] 2018-08-22 19:42:00.8241888 +0000 UTC 6a8ecca2-cdf8-4d3a-81de-28f28072d195}"
2018-08-22T19:42:03.748Z [DEBUG] Gaia: cannot get jobs from pipeline: error="plugin exited before we could connect" pipeline="&{1 TestPipeline {https://[email protected]/scm/doc/gaia-pipelines.git bneil nope {  } refs/heads/master [] /data/tmp/golang/src/6a8ecca2-cdf8-4d3a-81de-28f28072d195} golang /data/pipelines/TestPipeline_golang [95 153 137 156 178 5 50 123 168 0 59 4 149 100 40 11 139 61 107 19 123 141 63 200 234 82 0 252 50 241 90 190] [] 2018-08-22 19:42:00.8241888 +0000 UTC 6a8ecca2-cdf8-4d3a-81de-28f28072d195}"

User/Pipeline Permissions

In a multi-user environment it would be nice to have user permissions.

i.e only the admin can add/remove users.

It would also be useful to have pipeline permissions so the viewing/modification/triggering of a pipeline can be limited to a specific user or group of users.

This would also allow easy integration into SSO (single sign on) systems like OpenID Connect.

Small JS error on pipeline with no jobs in Chrome

Currently using the latest via
docker run -d -p 8080:8080 -v $PWD:/data gaiapipeline/gaia:latest

After generating a pipeline (no jobs yet run), i went to the dashboard and got the following error when trying to start pipeline.

index.vue?258e:110 Uncaught TypeError: Cannot read property 'length' of undefined
    at s.checkPipelineArgs (index.vue?258e:110)
    at s.n [as checkPipelineArgs] (vue.runtime.esm.js:190)
    at click (index.vue?7896:65)
    at t (vue.runtime.esm.js:2000)
    at HTMLAnchorElement.e._withTask.e._withTask (vue.runtime.esm.js:1798)
    checkPipelineArgs () {
      // check if this pipeline has args
      for (let x = 0, y = this.pipeline.jobs.length; x < y; x++) { <--
        if (this.pipeline.jobs[x].args && this.pipeline.jobs[x].args.type !== 'vault') {
          // we found args. Redirect user to params view.
          this.$router.push({path: '/pipeline/params', query: { pipelineid: this.pipeline.id }})
          return
        }
      }

      // No args. Just start pipeline.
      this.startPipeline()
    },

this.pipeline.jobs - jobs is currently null which is causing the issue

New docker image with Java/Maven integrated

Currently, we have one docker image with golang integrated. With the integraten of #15 we now have to support Java too. Soon, we will also support Python (#68).

My proposal is to create one big docker image with the "latest"-Tag where all languages are included. This means when someone runs docker run gaiapipeline/gaia without a specific tag, the latest tag will be pulled which can be huge (probably gigabytes).

To provide a workaround, I would like to offer other docker images like "gaia:go", "gaia:java", "gaia:python" where only this specific language is included.

Would like to hear you opinions. 🤗

Architecture documentation

I was wanting to know more about how Gaia runs, is there anything that explains where state is saved, or if it is HA or has plans to be. I didn't see any links to some more info on where credentials for checking out git repos are saved and such. I like all the readme links that do exist but if there is link to further operation instructions I guess I missed it.

Thanks, sounds like a promising project.

Convert from make to mage

I understand there's not much to gain from this, but in the spirit of going native, I propose this project moves from Make to Mage.

Mage is a native Go-based replacement where you can actually write real code for your make functions rather than scripting a series of shell commands.

More at https://github.com/magefile/mage

I would be prepared to produce most (if not all) of this work if you're interested.

One pipeline process per pipeline run

When a pipeline is triggered, every job will execute it's own pipeline process. This brings several disadvantages with it:

  • It's waste of resources. gRPC uses HTTP/2 and therefore it's simply not needed to run several processes for one pipeline run.
  • It's currently not possible to share memory/data between jobs. For example, one job collects/formats/processes data and this should be used for the next job in the same pipeline run.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.