Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Strider 2.0 Brainstorming #667

Open
2 of 15 tasks
knownasilya opened this issue Dec 9, 2014 · 65 comments
Open
2 of 15 tasks

Strider 2.0 Brainstorming #667

knownasilya opened this issue Dec 9, 2014 · 65 comments

Comments

@knownasilya
Copy link
Member

knownasilya commented Dec 9, 2014

Just putting this out there, want to list out some of the "must have"s and "nice to have"s for 2.0.

Must Haves

  • Add support for organizations (groups)
  • On-boarding (setup) UI / Post setup Initial setup (db, email, admin, etc) #681
  • Multiple build environments
  • Simultaneous builds
  • Upgrade to latest Express (4 atm)
  • Use express.Router() throughout to decouple routes
  • Upgrade to latest Bootstrap (3 atm) / Cleanup responsive UI
  • Remove deprecated APIs
  • Update plugin API, no globals
  • Bring back strider.json as a build config strider.json support #674
  • Make into an SPA
  • Upgrade to consistent (one) view templating e.g. Handlebars Use one templating library #689

Nice To Haves

  • Refresh the website
  • Abstract database calls
  • Features behind flags / Faster release cycles

Feel free to disagree, and contribute! Discussion welcome!

@knownasilya
Copy link
Member Author

One that I wont put up there, just because it's too controversial, is to rewrite the client-side with Ember.js. Especially with how angular is going and the spaghetti code that we have (even after browserify), it would really help bring in new contributors from the Ember community, since they'll be able to jump in very easily.

@knownasilya
Copy link
Member Author

Here's a good question:

Would it be easier to start from scratch, with what we learned, and to write it from the ground up (feels like that would be better) or to refactor and hope that we don't introduce many new bugs?

Since we have some fundamental changes that have been requested, and plenty of code that is just not up to par.

@bitwit
Copy link
Member

bitwit commented Dec 9, 2014

Would certainly love to help where I can with UI/webapp tasks and any testing assistance.

So I've got to ask about this Angular vs. Ember thing:

  • What are some of the difficulties you are experiencing with UI development?
  • What would Ember accomplish that Angular can't?
  • Is the spaghetti code a result of Angular's design or the Strider application design/modularity?

@jaredly
Copy link
Member

jaredly commented Dec 9, 2014

I'd support Ember over Angular. Especially in a large app like this, Ember's conventions get you a lot of benefits.

@vsukhomlinov
Copy link

I think that build configuration should be stored along with projects instead of the DB. So I'm suggesting to make Strider build git projects having strider.yml file without making any further configurations

@knownasilya
Copy link
Member Author

Please expound on this feature request. Are you saying they can have
strider config that lets strider know how to build it? So minimal
configuration needed for setup, only adding the repo?
On Dec 9, 2014 6:01 PM, "Vitaly Sukhomlinov" [email protected]
wrote:

I think that build configuration should be stored along with projects
instead of the DB. So I'm suggesting to make Strider build git projects
having strider.yml file without making any further configurations


Reply to this email directly or view it on GitHub
#667 (comment).

@vsukhomlinov
Copy link

Correct, I'm seeing a value in doing that if you're planning to add access for organizations.

@bitwit
Copy link
Member

bitwit commented Dec 9, 2014

On the topic of a config file, there was recently a little discussion on this here #592 .

According to @niallo 's comment there is already support for a strider.json or ini file but it is completely undocumented.

@knownasilya
Copy link
Member Author

@bitwit

What are some of the difficulties you are experiencing with UI development?

Javascript in HTML, which basically is the same thing that we as the web development community have been trying to minimize since the days of the dominance of PHP. Not only is this hard to debug, read, and keep dry, but it's also hard to extend and expand.

What would Ember accomplish that Angular can't?

Ember is great for large applications that need to scale and grow. Making it an SPA is perfect for Strider, since it'll have a slightly longer load in the beginning, and then be lightning fast. Ember has nice conventions and really the best router, which is an absolute necessity for web apps. Ember Data, is amazing, and will totally fit the way strider is organized, providing nice abstractions. This will allow for making the backend a REST API that can serve multiple front ends. Also ember-cli and the build/addon system, which is super!

Is the spaghetti code a result of Angular's design or the Strider application design/modularity?

Both, since Angular doesn't portray any conventions that everyone should follow, it lends itself to being used poorly.

@knownasilya
Copy link
Member Author

@vsukhomlinov added that to must haves.

@bitwit
Copy link
Member

bitwit commented Dec 10, 2014

@knownasilya Great answer! That gives some interesting food for thought on why Ember is possibly a better MVW framework for open source projects -> Conventions! It's also probably the best anti-Angular argument I've heard lately among all the FUD that seems to be trending lately :)

I'll admit I've seen some lack of convention in Strider's plugin controller implementations. When working on the plugin template, I had to review a lot of plugins to try and extract what seemed like the ideal standard to build upon. The dependence on the plugin controller's $scope already having object's like config attached via a parent $scope also seemed a bit counterintuitive.

A few debatable pros and cons of switching:

big pro - Conventions. Great for getting all open source contributors working in better alignment.
pro - Other abstractions that are part of Ember that are not in core Angular e.g. Ember Data
con - I believe Angular is a more widely known framework, which is also useful for open source. Currently Strider is a pure MEAN stack application. MEEN is phonetically the same though :D
con - Guaranteed there would be no backward compatibility with 1.x plugins

Could probably flesh this out more

@bitwit
Copy link
Member

bitwit commented Dec 10, 2014

On another subject - I think community support for Strider needs improvement too, i.e. a better place than IRC to tell people where to direct questions. Possibly creating a forum or using Stack Overflow with a #strider tag to follow. I think in IRC sometimes no one is really around and questions get lost.

There was a great discussion recently about improving the docs and linking directly to them from within the webapp ui - I think this is a great direction too

@knownasilya
Copy link
Member Author

What about using gitter? https://gitter.im/ along with an SO bot for IRC
Also we could use discourse as a forum, so something like discuss.strider.com

And yes, the wiki docs are a good idea!

@niallo
Copy link
Member

niallo commented Dec 10, 2014

Stack overflow would be great. It's not something I've ever gotten into as
a contributor but there is a urge amout of valuable content there - agree
that irc doesn't seem to be very useful.

On Tuesday, December 9, 2014, Ilya Radchenko [email protected]
wrote:

What about using gitter? https://gitter.im/


Reply to this email directly or view it on GitHub
#667 (comment).

Niall O'Higgins
W: http://niallohiggins.com
E: [email protected]
T: @niallohiggins

@kfatehi
Copy link
Member

kfatehi commented Dec 10, 2014

There was a great discussion recently about improving the docs and linking directly to them from within the webapp ui - I think this is a great direction too
~bitwit

Right, @shaunc made some great suggestions, see here #208 (comment)


Regarding client-side JS frameworks... I like the React stuff. I don't know anything about Ember. I like Meteor too. I also like Angular. cries

@jaredly
Copy link
Member

jaredly commented Dec 10, 2014

:D I would order things React > Ember > Angular fwiw

On Wed Dec 10 2014 at 12:21:16 PM Keyvan Fatehi [email protected]
wrote:

There was a great discussion recently about improving the docs and linking
directly to them from within the webapp ui - I think this is a great
direction too

~bitwit

Right, @shaunc https://github.com/shaunc made some great suggestions,
see here #208 (comment)

#208 (comment)

Regarding client-side JS frameworks... I like the React stuff. I don't
know anything about Ember. I like Meteor too. I also like Angular. cries


Reply to this email directly or view it on GitHub
#667 (comment).

@knownasilya
Copy link
Member Author

React is only the V in MV*, so there's plenty missing, and it's just too low-level with an extra language (jsx) to learn. They do have nice ideas, and many of those have already landed in Ember behind feature flags.

React and Angular are nice for custom brewed frameworks, like within a company, but not so nice for an opensource app where you're trying to get everyone on the same page.

Meteor is a whole different story, but also has very loose conventions, and plenty of ways to get lost. Plus you have to buy into the whole stack, package management, server, client, db.

@kfatehi
Copy link
Member

kfatehi commented Dec 10, 2014

I think was kidding with meteor w/ regards to Strider (although I use Meteor currently for rapid prototyping... kinda like how I still sometimes use ruby on rails) -- but I'm not kidding about the way it (and React) manage to give you two-way data binding without encouraging obtrusive javascript and cryptic new html tags like the way angular does it. You must admit, though, that angular is powerful and our plugin development has been made super easy as a result of how angular slots right into it. @bitwit makes some good points regarding that as well. In the case of plugins the solution is more docs for sure, not changing toolchains, not more coding.

That said,

I see React being just V as an advantage, not a disadvantage, and fitting of the super-modular style of strider. Maybe Ember is great but this has never been shown to me and I don't know how great the cost of transition is, I don't know how big it is and how modular it is. If it's a kitchen-sink framework (like Rails is when compared to Sinatra or Rack), then I'd wager the cost is high. I'd wager it's not very fitting of our modular style and that we'd be excluding more people from the project.

I'd wager that the cost of sticking a jsx transform in our browserify and rewriting some (new) views in a React style is minimal in comparison to a switch to Ember or putting effort towards removal of existing Angular stuff. I know for a fact React will allow us to step-by-step move from Angular to React, over time. Can the same be said about Ember? Hell, even backbone seems safer / more realistic. I am not saying let's switch to React! I'm saying this: I'd rather focus on fixing, maintaining, documenting, cleaning up the current stuff than changing toolsets or technologies unless it really makes sense to do so.

The one main pain point I heard was routing. The only client-side routing I know about in Strider was written by me really quickly because I got sick of clicking the tab I was working on ... we can totally write that properly, modularly, or find one that is well written and independent of these giant frameworks (angular, ember, etc). e.g. I think this might be good? https://github.com/RubaXa/Pilot

As far as single-page apps, I think they're overrated and suck when added as an afterthought. Strider works well as a multi-page app and should be sticking to this (and very minimal javascript).

That said,

I am totally into the idea of creating a separate Strider Ember/SPA repository that consumes Strider as an API endpoint. In my opinion, this takes Strider in a good direction.

@bitwit
Copy link
Member

bitwit commented Dec 10, 2014

Well said @keyvanfatehi,

At the core, I think Strider's attractiveness is its ease of adoption. Being MEAN stack has lent really well to that. Having been someone who tried CI before and never understood where the benefit was given the time required to get it up and running, Strider was this amazing breath of fresh air that made it so simple. There was little argument NOT to do CI anymore.
So I think that when it comes to Strider direction and decision making the bottomline question should always be "Does this adhere to Strider's core competency - simplicity and approachability?"
That principle should be applicable both to interface as well as open source contribution considerations.

@shaunc
Copy link

shaunc commented Dec 10, 2014

I'm busy porting my application from ember to ember-cli. I like Ember but it definitely requires that you "drink the cool-aid", so can see why it might not be the best choice here.

I would think that an important consideration would be trying to decouple as much as possible, whatever the choice. I think its a great idea to split the client (or clients?) into another repo, and make interactions between components REST based as far as possible.... Maybe there should be a spec for how a client -- eg -- accepts a plugin.

@vsukhomlinov
Copy link

Getting back to the templating discussion, the usage of angular templating on top of swig is a big issue since they are using the same control structures. We should definitely pick either single page app approach or the clean express way. Or replace everything with something else haha.

@shaunc
Copy link

shaunc commented Dec 12, 2014

+1 for "single-page-app" in separated project (or projects) as that way you could connect various different clients or types of clients, all talking to a clear REST interface.

@vsukhomlinov
Copy link

And one more thing, I'd avoid using Bootstrap and Angular in plugins. That will extremely complicate upgrade of these libraries from both plugin maintainer and project owner perspective in case of any major API change (like Angular 2.0). It might be a part of an initiative to redesign plugins API

@knownasilya
Copy link
Member Author

@vsukhomlinov that is a good point. We would have to write an API that plugin authors would have to use, but at the same time keep it as flexible as it is now, and to prevent ugly plugins. This is complex enough that it would need it's own brainstorming thread 😄

ugly plugins = bad spaghetti code, bringing in libraries that are too fat, etc..

@bitwit
Copy link
Member

bitwit commented Dec 15, 2014

Lots of cool ideas here, I definitely like the direction of a Single Page/REST API style design.
A few thoughts I had over the weekend that relate to this and beyond:

  1. I think 2.0 should consider more 'types' of plugins; particularly Project, and Webapp plugin levels. Some plugins such as the strider-github-status plugin are probably better suited at a higher level than on a branch by branch basis. The status plugin even behaves like it is on all branches when you add it to master. Pretty much everything is a 'job' plugin unless you are making your own provider (not likely) and I think that is narrowing the possibility and flexibility of plugins. Some plugins should be powerful enough to have both project level settings as well as show up in the drag-drop interface on a branch by branch basis. e.g. a scheduler plugin that is mostly configured at a high level, but registers individuals branches using the current interface.
    Obviously you don't want to make this too complicated for users, but I'm sure others who have written strider plugins have experienced making a job plugin that is mostly webapp logic.
  2. If moving toward a REST API where the front end framework is not necessarily known, then plugins would need to store their display mechanisms as part of their API response. i.e. If my plugin needs a timepicker and I can't be certain that Bootstrap UI is being used, then I need to indicate that the configuration value should display as a timepicker. Currently plugins have too much UI dependency to go pure API. As @knownasilya suggested, this probably is it's own discussion entirely.
  3. I see @keyvanfatehi is already looking into supporting .strider.json asap. I think supporting a JSON format for configuration makes a lot of sense since it most closely reflects how config data is stored in MongoDB. Also glad to see the idea of making the JSON easy to export from any project is being considered :)

@knownasilya
Copy link
Member Author

If my plugin needs a timepicker and I can't be certain that Bootstrap UI is being used

I think we can allow the plugins to depend on styling, because we don't want the plugins to clash, or the authors to bring in bootstrap just for their plugin (overkill). The only issue is backwards compatibility, but that can be solved with a minimum/maximum semver version, e.g.

"strider": {
  "compatible": ">= 1.5"
}

@shaunc
Copy link

shaunc commented Dec 15, 2014

On Dec 15, 2014, at 2:18 PM, Kyle Newsome [email protected] wrote:
I think 2.0 should consider more 'types' of plugins; particularly Project, and Webapp plugin levels. Some plugins such as the strider-github-status plugin are probably better suited at a higher level than on a branch by branch basis. The status plugin even behaves like it is on all branches when you add it to master. Pretty much everything is a 'job' plugin unless you are making your own provider (not likely) and I think that is narrowing the possibility and flexibility of plugins. Some plugins should be powerful enough to have both project level settings as well as show up in the drag-drop interface on a branch by branch basis. e.g. a scheduler plugin that is mostly configured at a high level, but registers individuals branches using the current interface.
Obviously you don't want to make this too complicated for users, but I'm sure others who have written strider plugins have experienced making a job plugin that is mostly webapp logic.

We are designing a plugin interface for our own application. We decided to go with a two-level structure: and “app” which contains several “plugins”. Perhaps that would be applicable here. A plugin means you are connecting to a particular interface. Sometimes you want to connect to more than one interface at once; other times you explicitly don’t want to provide one interface while plugging into another.

With this structure, the “app” repo would contain a “strider.json” in the root that specifies where the app plugs in and any other configuration to use those plugs.

@shaunc
Copy link

shaunc commented Jul 9, 2015

How about just cleaning up and publishing a REST api for a start. Then various clients would work.

@sebas5384
Copy link

👍 for React and their friends:

  • React Router.
  • Reflux or Redux for Flux stack.
  • Webpack.

And for backend Meteor or Sails (which I like it more) and they have realtime features.

@knownasilya
Copy link
Member Author

I'm on your side @shaunc, that's priority number one.

@bitwit
Copy link
Member

bitwit commented Jul 10, 2015

I'm also very pro API-first. The JS framework discussion will continue endlessly and the better Strider can support whatever you want to interface with sounds best to me. 2 new MV* JS frameworks were published by the time you finish reading this.

On the subject of REST API features I would really like to see the job logs accessible via an endpoint. Maybe with a call that has a ?since=101 param to get only the log from line 101 onward. Then this could support polling to fill the log out on the job pages. I'm finding the socket.io setup quite finicky and am sure it's what churns CPU when you leave job tabs open. On my 2012 MBA I get tab crashes in chrome if I watch a job thats putting out a lot of text quickly.

@niallo
Copy link
Member

niallo commented Jul 10, 2015

the parsing of live text streams for ANSI control characters is
surprisingly slow unfortunately:-/

On Thursday, July 9, 2015, Kyle Newsome [email protected] wrote:

I'm also very pro API-first. The JS framework discussion will continue
endlessly and the better Strider can support whatever you want to interface
with sounds best to me. 2 new MV* JS frameworks were published by the time
you finish reading this.

On the subject of REST API features I would really like to see the job
logs accessible via an endpoint. Maybe with a call that has a ?since=101
param to get only the log from line 101 onward. Then this could support
polling to fill the log out on the job pages. I'm finding the socket.io
setup quite finicky and am sure it's what churns CPU when you leave job
tabs open. On my 2012 MBA I get tab crashes in chrome if I watch a job
thats putting out a lot of text quickly.


Reply to this email directly or view it on GitHub
#667 (comment).

Niall O'Higgins
W: http://niallohiggins.com
E: [email protected]
T: @niallohiggins

@knownasilya
Copy link
Member Author

Would love to see if there are better parsers, or if iojs has moved forward in this regard. Maybe even splitting out the phases some how so that the number of DOM elements isn't a big issue.

@oliversalzburg
Copy link
Member

Talks about rewriting certain aspects of Strider, just to arrive at the same point with a different technology, seem misplaced.

Not being able to write a plugin for Strider, because you don't know Angular, is not a reason to rewrite Strider; it's a reason to learn Angular.

If you want to rewrite part of an application, you should have a better reason than "It's written in X and I don't like X, we should use Y, because I like Y".

Every framework sucks. If you don't think that the framework/tollkit/library/… you're using sucks, then you haven't been using it long enough.

@vmadman
Copy link
Contributor

vmadman commented Jul 10, 2015

@shaunc

How about just cleaning up and publishing a REST api for a start.

I agree completely, its hard to overstate this. If there's anything that practically every person in this thread shares, its knowledge on using REST.

@oliversalzburg

Not being able to write a plugin for Strider, because you don't know Angular, is not a reason to rewrite Strider; it's a reason to learn Angular.

Agreed. I only posted this because a "rewrite" was already on the table, seemingly, from the comments above mine. I would not suggest that Strider should begin refactoring to ease my personal pain, but if someone is going to rewrite it, then please consider not using Angular on the next round.

If you want to rewrite part of an application, you should have a better reason than "It's written in X and I don't like X, we should use Y, because I like Y".

Again, I agree, mostly, and I tried to make that point (from a different angle). To reconcile my statements with yours, all we need to do is agree that HTML, CSS, and JS are, in themselves, neither X, nor Y, nor any other letter. Angular might be X, React is Y, and Polymer is Z.. and I think Strider should use "none of the above" and make a plugin system that uses the fundamental technologies that everyone already knows how to use.

Also, my critique in this regard is limited to only the plugins. Strider can use a mixture of every client library out there for all I care, I just want to be able to write plugins without needing to add things to the already conflated "qualification requirements" we use to hire people. Strider plugins are, at their core, very simple devices.. and it seems inefficient to "invent" complexity by layering on alien technologies. Just do <form action="/config/myplugin" method="POST"> and walk away.....

Strider is precisely on the right track when it emphasizes plugins as a way to extend the product without requiring direct effort by its core team. This is one of the golden ideas of our age, in some ways. However, that is, at minimum, weakened by opinionated libraries like Angular.

I think its much worse than the minimum and if the Angular requirement can be removed, I expect Strider to take off to the levels of the other major CI/CD solutions on the market. I can at least be certain that we could (and would) share our ~10 or so unique Strider plugins with the world if we could ditch Angular. We only avoid sharing because we do not follow the community practices and guidelines.

@knownasilya
Copy link
Member Author

I can at least be certain that we could (and would) share our ~10 or so unique Strider plugins with the world if we could ditch Angular. We only avoid sharing because we do not follow the community practices and guidelines.

Share them anyway, and the community will come through, otherwise everyone misses out.

@vmadman
Copy link
Contributor

vmadman commented Jul 10, 2015

Sure, we have them bundled as a single plugin.. the reason why will be a little more clear when you see it. As I said, we "circumvent" Strider in a particular way. I'll mirror the plugin to GitHub as soon as I can.

@knownasilya
Copy link
Member Author

Easy to talk, but if anyone wants to start doing something, I have just the thing. Documenting the existing API. I've setup apidoc in this commit f3c0ad2 and would love all the help to document our existing API.

@phiros
Copy link

phiros commented Jul 11, 2015

Even though I might repeat what other people already mentioned: I think strider should increase its modularity. What I mean by this specifically is:

  • Currently, Strider-CD/strider contains way to much functionality. In my opinion it would be good if
    strider itself would just be a central communication hub for plugins.
  • Plugins itself should be cleanly decoupled from each other (a syntax error in a plugin or an exception must not be able to crash the rest of the system). This can be achieved by some kind of networked API and with a well defined data exchange format (I'd like to see something like ProtoBuf instead of JSON here). This would also:
    • increase scalability (computing heavy plugins could run on a dedicated machine etc.)
    • allow plugins to be written in arbitrary languages
  • Frontend components should get no special treatment. They should also be plugins.

Additionally:

  • I saw a lot of discussions about the frontend in this issue. I think it is way more important to have a
    stable and scalable backend first before we even talk about frontend stuff.
  • By looking at the test coverage I'd say strider 2.0 should be architecturally designed in a way which makes it easier to test. What I mean by this is that people tend to write tests for stuff that is easy to test. If some architectural decision makes it hard to test certain functionality developers will typically not write tests for this functionality. BTW: using a networked plugin API with a well defined data exchange format would help a lot in this regard (IMHO).
  • The cleanest way to do all this would be probably to write strider 2.0 from scratch (reusing code from current strider wherever possible).

@knownasilya
Copy link
Member Author

I agree about everything, but not sure about ProtoBuf. I feel like that would hinder community involvement since JSON is well understood but not so much for ProtoBuf. Although I totally see the benefits of using that format.

@knownasilya
Copy link
Member Author

The other concern is man-power. We don't have too many active contributors, but maybe a rewrite will solve that (developers love new things).

@knownasilya
Copy link
Member Author

I would love to do a combination of json api and ProtoBuf. I think it will make it simple to have a nice convention and have the speed of ProtoBuf. In the end any kind of client could consume, since implementations are being written for many clients for JSON API.

If anyone is interesting in starting writing the API from scratch, let me know, and we can start a specific brain-storming issue (or a repo right off e.g. strider/api and discuss there).

@kfatehi
Copy link
Member

kfatehi commented Jul 13, 2015

I've really enjoyed reading this thread! Thanks all!

Ilya, I am very much for the idea of writing a new API from scratch.

As an aside, I currently use Buildkite for CI and I love that by design it does very little. There is an agent (open source and cross platform) that you must install on your workers, and then point them at the orchestrator (buildkite's closed-source cloud software). For example I have two types of workers... A digital ocean amd64 instance tests, builds, deploys my web code. An ARM beaglebone tests, builds, and uploads binary artifacts of my 'embedded' code.

As far as tools... I have been on a meteor stint for some time now. I have delivered several projects in meteor, and used it for a startup I'm currently working engaged in. However as my application grew more complex, the thing became slower and slower and the pub/sub stuff was getting in the way more often than helping. I scrapped it and rewrote...

I used hapi and sequelize with a postgres adapter. It has been so nice and such a breath of fresh air. I really enjoy hapi's simplicity and I missed SQL's predictability, maintainability, and enforcement of documented integrity of the underlying schema.

I have been using RabbitMQ (via CloudAMQP) and it's been just great for delivery work to downstream IoT devices. It's a good technology for delivering work. Redis and others are good too, but it was just interesting to me that I had been using Redis for pub sub so long (since I learned Rails) but that AMQP was what I was really after most of the time... I would keep that in my arsenal when designing a new CI...

As for frontend, my post-meteor development has been pretty much using AngularJS with proper usage of angular-ui ui-router and then calling back to Hapi with $http. Angular itself has been OK, but it is complicated and relatively hard to explain to people. I don't even fully understand ui-router and try to use it very minimally.

What I do agree with very much is that the core should not include UI -- if a new design can pull this off well I think it could be very special. I can imagine having a plugin that provides a base UI for those that want it. That plugin could easily be forked and have features added to it or use a totally different frontend framework or whatever.

That said, React seems quite interesting and I do believe (like we sorta have now in strider) in the idea of providing an easy way to generate plugin scaffolding. In it we can pre-bake some React boilerplate or Angular boilerplate, etc.

Also, would these plugins run on the orchestrator or on the worker? Strider currently does not have a super clear separation between orchestrator and worker and I think that was both a strength and a weakness. It was a strength because you got up and running quickly, but it was a weakness because it was difficult to figure out how to set up strider to actually deliver jobs down, to say, a beaglebone to produce ARM builds.

@knownasilya
Copy link
Member Author

That said, React seems quite interesting and I do believe (like we sorta have now in strider) in the idea of providing an easy way to generate plugin scaffolding.

Sounds like a good plan. Write them as they come. I think that Yeoman is still a good option in this regard for writing something like that. It will allow for shared knowledge and a good platform for that exact use-case.

I used hapi and sequelize with a postgres adapter. It has been so nice and such a breath of fresh air. I really enjoy hapi's simplicity and I missed SQL's predictability, maintainability, and enforcement of documented integrity of the underlying schema.

I've yet to use Hapi. What does it bring to the table that Express doesn't? Same in regards to sequelize vs knexjs (which is what I've used in the past). I agree on postgres, and if we need json storage for plugin data, that can be done with the json column.

I know you like new things Keyvan 😉 Have you looked at rethinkdb (nosql)? It supports push notifications for an arbitrary query.

Also, would these plugins run on the orchestrator or on the worker? Strider currently does not have a super clear separation between orchestrator and worker and I think that was both a strength and a weakness. It was a strength because you got up and running quickly, but it was a weakness because it was difficult to figure out how to set up strider to actually deliver jobs down, to say, a beaglebone to produce ARM builds.

Plugins might have to be two faceted, a core portion and a drone portion. I can see some plugins implementing one or both, it would depend what the plugin needs to do I think. The drones can communicate back to core and report on what plugins they have, and those could be configured through core (or locally on the drone). Drone plugins could be simple node modules with a basic API, so that users can reuse the plethora of build/testing tools already out there.


I think we can start on a rough design on how this new system should work, and lay down the non-negotiables, and we can talk technology stack after.

@knownasilya knownasilya mentioned this issue Jul 13, 2015
12 tasks
@kfatehi
Copy link
Member

kfatehi commented Jul 13, 2015

I haven't looked at rethinkdb enough to comment on it.

The main thing that I like so far about hapi versus express has been the way you define routes. Routes are just objects that get passed into the server.route method. The method can take an object or an array of objects (routes), and the route object can contain keys that are used by other plugins or parts of hapi (e.g. using Joi to validate incoming data). This way you find yourself writing configuration objects most of the time, not so much functions that call other functions.

I also like the way 'auth strategies' work in Hapi -- it just makes sense to me. With express I vaguely remember doing some things with passportjs or something. On the other hand I might just be improving as a coder in general -- but I am pretty sure hapi has been a better toolset overall and it's not just me.

I don't know anything about knexjs, but I can say that sequelize has been well-documented and easy to use. I like how it has a tool for generating migration files and running them, I've been using it in production and doing migrations with it without any issues.

But anyway I agree with you about determining the non-negotiables, having an overall design we would like to achieve, and then looking at tools later. I'm pretty swamped with my current engagements but I will keep an eye on the new stuff :)

@jpic
Copy link

jpic commented Jul 17, 2015

Multiple build environments and Simultaneous builds are a must-have for devops. If it's as easy to test that a whole infra on a superior version of as it is to test with another version of a dependency then we have a sane test system imho. Simultaneous builds is a must for devops and blue green deployment too because devop projects (ie. codebases using saltstack, ansible, chef ...) would typically take time as the test would generally be "instanciate a set of containers, provision them (which is mostly self-tested) and then run functional tests".

@kfatehi
Copy link
Member

kfatehi commented Jul 18, 2015

100% agree that we need true multiple build environments (this cannot be simply based on branches, it just doesn't work to tie the VCS into this).

I'd like more info about what blue green deployment is @jpic if you don't mind

@jpic
Copy link

jpic commented Jul 18, 2015

Sure, is it good enough if I cite Fowler's article about BlueGreen ?

One of the challenges with automating deployment is the cut-over itself, taking
software from the final stage of testing to live production. You usually need
to do this quickly in order to minimize downtime. The blue-green deployment
approach does this by ensuring you have two production environments, as
identical as possible. At any time one of them, let's say blue for the example,
is live. As you prepare a new release of your software you do your final stage
of testing in the green environment. Once the software is working in the green
environment, you switch the router so that all incoming requests go to the
green environment - the blue one is now idle.

Blue-green deployment also gives you a rapid way to rollback - if anything goes
wrong you switch the router back to your blue environment.

@macropin
Copy link
Contributor

Guys, our 2c... Over at Panubo we are using Strider solely for deployments to CoreOS (Docker / Fleet) clusters. We chose Strider because it seems like a good lightweight, flexible tool that is focused on CD, rather than CI duties...

To get Strider to handle CD tasks we've needed to write a bunch of different tools and even a Docker container to host it all.

With all this we get an atomic (rolling) deployment capability. And our customers get visibility via a nice web UI.

But right now it's tricky to configure as everything must be configured manually. We are using the GitHub / BitBucket plugins (depending on customer), Custom Script runner, and Meta data plugins along with our tools above. Some of our customers have over 100 projects. So we envisage that we might need to write our own plugin to make this easier.

Given our usage, our wish list for Strider 2.0 would be:

  • Rollbacks: We'd love to see the ability to replay a deployment for the purposes deployment workflow and recovery. For this I think the Strider core needs a concept of deployment artefacts and associated metadata that can be replayed verbatim, or reapplied with variables overridden.
  • Focus on 'Continual Deployment'. (For most of our projects the deployment is the key, and the testing phase is not even required). By the time the code hits the appropriate branches in Git, it's already tested. And any secondary testing is done at the container level. I guess for this requirement, we'd love to see Strider take a more generic approach to 'CD', and not make steps mandatory. Ideally we'd be able to define the steps in a generic fashion, so we could adjust things to suite our customer's workflow.
  • Ease of adding large numbers of new projects. As above, some of our customers have a lot of projects.
  • Multithreading. It should be possible to build and deploy multiple projects at the same time.

Cheers, Andrew

@mnaughto
Copy link

After manually running deployment scripts for far too long, I started looking into CI applications and decided on Strider, largely because it runs on Node and seems a lot less complex to set up than Jenkins or whatever.

Since it's an easily-accessible portal to our private cloud, I've toyed with the idea of using it for more than just CI - like running database backups or running grunt tasks in arbitrary directories.

That being said, I like @bitwit's suggestion of supporting more plugin types. If things were set up correctly, that functionality could be accomplished via plugin.

I also think it makes a lot of sense to strip things down to just a REST API, and maybe have a separate repo for the "stock" UI, which, itself, could be a plugin orchestrator.

Given @macropin's comments about continual deployment, and my personal goal of using this for things other than CI, I think it would be good to get away from the idea of "builds" and think about generic, nestable "tasks". (Something like this is also mentioned in #233) So from what exists now, the "deploy" task would contain a "test" task and a final task to actually push files and such. The "test" task would contain a task to copy code, install code, and run the tests. Plugins could then publish their own tasks that could be "dragged" into other tasks to add them to the workflow. Other plugins could consume these tasks as well, paving the way for a generic task scheduler, etc. Is this idea too crazy?

@knownasilya
Copy link
Member Author

Is this idea too crazy?

No, I think this is really the way we want to go.

Feel free to leave ideas in the core repo.

@niallo
Copy link
Member

niallo commented Aug 19, 2015

definitely. the data model is structured around jobs not builds per se. at
least that was my goal :)

jobs can do more than just build and push code and can be triggered by
different events - not just VCS events.

On Wednesday, August 19, 2015, Ilya Radchenko [email protected]
wrote:

Is this idea too crazy?

No, I think this is really the way we want to go.


Reply to this email directly or view it on GitHub
#667 (comment).

Niall O'Higgins
W: http://niallohiggins.com
E: [email protected]
T: @niallohiggins

@Justinidlerz
Copy link
Contributor

Hello @knownasilya ,Is the 2.0 development plan still going on?
I use strider inside the enterprise, it is very good, but it seems that it is very necessary to upgrade, because it frequently appears BUG after the frequency is increased. I originally planned to submit support for the corresponding Tag push event for it, but found that there were more changes.
If this plan is still going on, I am willing to participate.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests