Beyond CI/CD: GitLab's DevOps Vision (2017)
about.gitlab.com
about.gitlab.com
They seem to be consistently taking right decisions at the micro level. Their CI/CD design and execution is way more usable and reliable than <name suppressed> pipelines (still no manual stages, still no re-triggering, etc). Their design and integration with Kubernetes is also a great choice.
So on the micro picture, things are quite good. On the macro picture, they are building a universe. On the Issues front, they're trying to be like Trello (and in some places, reminds of Jira). They're trying to tie Issues with customer support, getting slightly in the way of Zendesk/Freshdesk. They're building deployment. Then monitoring - they support Prometheus. Now post-deployment/post-monitoring. And of course, they are competing on core git hosting as well.
Of course, they'll do a great job. Heck, if they get into the messenger domain, they'll pick a nice strategy and just integrate deeply with Slack maybe.
But the core of the problem is: None of these are instrumentable/hookable. Want to enforce some of your own organization policies before deployment? Want to use everything _except_ with your own monitoring tool? Sorry. If you use GitLab, you use their universe and everything that comes with it. There is no graceful integration with a broader set of tools.
Maybe for a small startup, just "doing things the GitLab way" and subscribing to all their micro choices (which are good) make sense. But organizations grow, and they'll outgrow these micro choices sooner than later. Then the lack of extensibility, hooks, etc. will bubble up.
All this is assuming GitLab continues to build out a perfect application platform with all the right choices (and all the version and time matrices of those choices). Hugely laudable work so far though!
https://about.gitlab.com/2017/03/15/gitter-acquisition/
Edit: I first said "not too long ago" then realized it was just about a year ago.. Where is time going!?
Like the other guy said: If you don't like them adding exclusive extra features, pay them for what they're already offering.
I think there goal is to support you when you want to use non-GitLab tools. I guess there's probably always going to be hooks missing, but they do have things like webhooks. Might want to lodge a feature request for missing hooks, as I do think they're open to them.
Huh? Gitlab has a huge list of integrations[1] and webhooks[2]. You can use Jira for issue tracking or Jenkins for CI, for example. If something is missing, it's open source, so the plugin can be added by the community if need be. The software itself is hugely configurable for different workflows and team structures. Can you be a little more specific on what Gitlab is doing poorly here?
[1]: https://docs.gitlab.com/ce/user/project/integrations/project... [2]: https://docs.gitlab.com/ce/user/project/integrations/webhook...
> The other way to look at it is that this is pretty advanced stuff, and frankly, it doesn’t deserve to be, free, open source.
So is all the stuff that gitlab builds on, like git, or ruby, or linux, that's all pretty advanced stuff I'd say.
Just be honest and say you want to charge for advanced features, because there's little money to be made in open source and you're a business after all and want to pay your employees a living wage.
But they are being honest, they are saying what they are thinking....
One of the awesome aspects of being transparent by default: taking an internal conversation between three coworkers and making the recording and transcript public. I love being able to share our strategy publicly and talk about it openly.
While I can't change what I said, we can make the blog post more accurately reflect our beliefs as reflected on our Stewardship page[0]. There's no limit on what "deserves" to be open source. And, imho, GitLab has open sourced a ton of advanced functionality already.
But "GitLab Inc. is a for profit company that balances the need to improve GitLab Community Edition (CE) with the need to add features to GitLab Enterprise Edition (EE) exclusively in order to generate income."
Did they actually say that...? I only went to the page to confirm this and it appears true. Sounds like next time I choose self-hosted Github alternative, I should exclude Gitlab from my options - based on their approach so far, it feels like they really do mean this kind of contemptuous attitude of "only basic stuff should be free software". I used to cheer for Gitlab, but this is just way over the line.
And despite what some say, I really don't think it's that great a product - they seem to be focused on getting a million of things poorly than get their core fixed. Performance is still terrible, see what happens to your browser when you view a diff for a large merge request. Also, you there's a limit to the number of commits in the history you can browse - come on, my `git log` loads the whole history in a split second but you can't render it? And they clearly don't care - I reported many issues to them that got confirmed and most of the time those were just shrugged off. As long as you're not an EE user, you won't really get much more than the annoyance of having odd version numbers make the sidebar sticky and even ones undo that.
"free as in freedom" means that I can not only access the code, but also redistribute it and use it in any way I see fit. This doesn't mean that the developers can't sell it though - they can sell support, extra features, hosting and so on. There are ways to profit from free/open source software. I could as well imagine Gitlab Foundation and Gitlab Ltd, where one provides the core and the other non-free modules that cover enterprise use cases. I don't like their current scheme though.
[0] https://gitlab.com/gitlab-org/gitlab-ce/issues/34591#note_56...
Advancedness is not a criteria in open sourcing or not open sourcing. There are advanced features that are open source, such as Review Apps[0]. There are basic features that are proprietary, such as File Locking[1]. The criteria we use to decide which version the features go in are documented on our stewardship page[2].
[0] https://about.gitlab.com/features/review-apps/ [1] https://about.gitlab.com/features/file-locking/ [2] https://about.gitlab.com/stewardship/#what-features-are-ee-o...
Dont get me wrong, i like gitlab and use it since the beginning. I just have a problem with this "munch it all together" style of products.
Yeah I know people won't do that. But think about this for a second. It does not apply only to Gitlab but to lots of independent open source software vendors too.
Especially when things go wrong, having one contact point can be quite valuable, instead of having to go through the cat-herding that is getting someone to agree it's their component that's the problem.
Can you give some examples, and/or a link? I like using Gitlab as an easily portable, one-docker-container-and-you're-running hosting service, so it would be nice to make it more lighteweight.
In traditional deployments that may be some kind of "copy this thing over SSH and make it go!", in Kubernetes-land it's more like "lets just modify this API-state to point at the new image tag!".
Neither of those produce a consistent record of changes applied and state mutation like that is very error-prone.
We actually use Gitlab's CI at work, but we have our own deployment solutions built on it that end up making git commits into the NixOS & Kontemplate repositories which then run their own pipelines to deploy.
This way we can always answer the question "what set of applications at which versions was deployed at $time?" and also roll back consistently.
What is the fundamental difference between modifying your k8s deployment to point to a new tag and your solution?
You can easily roll back (except with database migrations) and easily see what version is deployed when.
You're also only modifying a single piece of your whole state at any given time, meaning that if you have the services A and B and their deployment pipelines independently modify state - you have nothing that declares any relationship between which versions of these should be deployed together.
There's a little piece of infrastructure wisdom I've learned over the years, I refer to it sometimes as "tazjin's law":
Any infrastructure component not controlled by a reconciliation process will eventually fail.
Versions of dependent components will get out of sync, configuration is being deployed independently of the application, and so on.
In order to reconcile your current state with your desired state you must know what your desired state is.
Does that explain it?
Our Kontemplate repository contains the state of an entire cluster, including all versions and all configuration.
A tag value is a single piece of mutable data that is in no relation to the other relevant data.
Still don't see any advantage to justify the additional complexity in your system.
I find it more complex to try and keep track of remote state modifications than to have a single source of truth, but whatever floats your boat ;-)
This predates infra-as-code.. it took years before someone wrote a clone that used Git instead of CVS
Made something stupidly similar for kubernetes: https://github.com/pieterlange/kube-backup
In addition its design (with warts like the separate versioning layer of charts) adds complexity that I don't think is necessary for most use-cases.
I look forward to the next releases of Gitlab!
Dunno whether their vision will pan out though. I do not use gitlab so I'm probably not that qualified to speak but I wouldn't like using one PaaS for all things CICD. I'd be afraid of locking myself in plus loosing a few degrees of flexibility.
For example when looking at a CI/CD deploy to an environment, you can easily access important Prometheus metrics and in the future logs, from the same console.
This also allows us to build more intelligence into the platform, as GitLab is more aware of your application and its health. One example is to incorporate Prometheus monitoring to compare the performance of a new release in an incremental deployment, and automatically pausing it if key metrics have degraded.
I'm especially interested in a pipeline with parallel executions of different kinds of tests, maybe some manual checkpoint in there, a more complex chain with execution on different kinds of hosts or containers.
For one of the software projects I'm involved in, I have more complex needs. We release binaries for multiple platforms so our Jenkins master delegates certain tasks to slaves running on specific OSes. Then at the end the Jenkins master downloads the built artifacts from all slaves and publishes everything to our artifact hosting server. As far as I can tell, Gitlab CI does not support this.
In future CI jobs I may even require user interaction, e.g. I may ask a human to sign off a report. I don't think Gitlab CI can do this.
But if your needs aren't so complex then Gitlab CI is great. It's UX-philosophically similar to Travis and setting it up is super simple, as opposed to Jenkins which is a pain to use.
Apache Groovy isn't "complete" as shipped with Jenkins. It's collections API is deliberately crippled so it doesn't work.
GitLab CI/CD can certainly run jobs on different OSes, then have a final job consolidate those artifacts and publish to an artifact server. What part can't GitLab do?
> In future CI jobs I may even require user interaction, e.g. I may ask a human to sign off a report. I don't think Gitlab CI can do this.
GitLab CI/CD has manual jobs so a pipeline can wait for human sign off before proceeding.
No manual checkpoints and different kinds of hosts or containers though.
You can do all the things you've listed. But you can't build an arbitrarily complex DAG of tasks. Instead, you must order everything into a sequential list of 'stages'. Within a stage you have a list of jobs, which are run in parallel. This might be enough for your needs, but I'd like flexibility to express dependencies for each and every task, Say `t1 -> ((t2,t3),t4 -> t5) -> t6`, etc.
And it's a pain to propagate variables from one task to another, like say setting an environment variable in one task, and getting its value in a downstream task. You end up writing scripts to write them to a file, telling gitlab to make that file an 'artifact', and then reading it downstream.
And then there's the transient errors, all of which are listed on open issues. We're using the hosted gitlab.com, and on some of our CI pipelines, we have a dozen or some stages. The chances of a transient error, .e.g. a runner getting a 503 from gitlab.com, are pretty high.
Say I want something like this:
1. Sequential: stage "build", build-type agent.
2. Sequential: stage "tests" (this is just a wrapper/container)
2.1 Parallel: stage "integration tests #1", integration #1-type agent
2.2 Parallel: stage "integration tests #2, integration #2-type agent
2.3 Parallel: stage "deploy and functional tests" (this is just a wrapper/container)
2.3.1 Sequential: stage "deploy", deploy-type agent
2.3.2 Sequential: stage "functional tests", functional-type agent
Is it doable?https://docs.gitlab.com/ee/ci/pipelines.html#pipeline-graphs
Will it be able to look at a project and compile it? For example: https://gitlab.com/postgres/postgres/-/jobs