The CI system needs to handle a few basic elements:
- Obtain source code from source repository
- Monitor source repository for changes
- Execute programs
Jenkins provides a framework for plugins to add functionality to the CI system. It provides concepts such as:
- Build machine
- Build artifacts
This are also important concepts to have for a CI system. It also provides a Web UI where plugins can add UI elements to specific organized sections. It doesn't do a very good job of pipelining, they through out all this UI configuration work and force you to use the Groovy scripting language to define out all the stuff already provided by the UI configuration scheme.
So I'd like to see a system that it structured more like a library then a framework. Provide a way to stand up a web server, provide resources for show builds and their status, provide the algorithms for managing build machines, jobs, and their relationships. Expose those relationships for UI visuals to be created. Make these concepts a core part of the library:
- Job relation
- Product relation
- Product tests
- Product release
- Environment management
I'm having a hard time identifying the best way to put this list into words. Jenkins appears to have been fairly close to what I'm describing, but it lacked these concepts so the pipeline plugin came along and through out the UI for the groovy script. Maybe had I instead learn the groovy script for Jenkins I wouldn't be so annoyed with Jenkins now.
I've also done some work with the GitLab CI system and don't believe it would be any better for what I'm trying to achieve.