Regular column where I complain about how things work. I had to set up CI on GitLab and I dove into it quite deeply in recent weeks. Thoughts.
If we discard the fact that I don't really like programming in yaml, on average it even evokes positive feelings, the docs are pleasant. They advertise it like this: here are stages, here are jobs within stages. Jobs can run in different containers and on different runners. Wow, great, if my projects were even bigger (and there aren't that many of those in the scale of the universe), I would be delighted by the flexibility and how I can distribute all this.
But in the overwhelming majority of cases, you'll run your projects on one runner and know no troubles. Or at most one pipeline - one runner. Distributing more atomically is dooming yourself to new problems. The example in the official documentation shows the classic stages build - test - deploy.
Let's say we're talking about Android. Build compiles the code, huge build folders appear in all modules. Test runs tests on the compiled code (not on the artifact). Deploy, let's say, assembles a bundle from the compiled code, or publishes it somewhere. Let's also remember that Gradle must download itself and before configuration download all its dependencies. (RIP people who pull half the world from npm)
And now again, each job can run on different computers physically, meaning from job to job all that cache built up on previous ones needs to be transferred. That is, literally pushing somewhere tens-hundreds of megabytes of dependencies at the end of each one, and pulling them again. Can you imagine how much traffic and time that is? Moreover, this is only achieved with so-called "artifacts", which are also displayed in GitLab with a "download" button. Great artifact the build folder or .gradle/wrapper, right? Useful.
And I don't need all this at all, I need the simplest possible scenario, when I run 2 commands in a row and expect them to have the same context. And you know what's even more interesting? They simply don't have such a capability (without potential problems). Here's the issue, it's 6 years old, almost went to school already.
Overengineering for the minority of users, which makes impossible what the majority of users expect. Choose your defaults correctly.