Nothing tests a team’s mood like a pipeline that simply stops. No error anyone understands, no obvious culprit, just work frozen somewhere between the code and the customer. The good news is that these failures repeat with almost comical reliability, and The Ops Atlas — which gave this operating craft its working name, GitLabOps — organizes them into four loops with one signature failure each. Match your symptom to its loop and the fix is usually closer than the panic suggests. The loops are worth memorizing: configuration turns files into a pipeline graph, scheduling matches jobs to machines, delivery moves releases through environments, and platform keeps the whole building powered and current. Here is the triage, symptom by symptom, in the order most teams meet them.
Symptom One: The Pipeline Fires Twice, or Not at All
You push a commit and two identical builds start racing each other. Or you touch the configuration and everything refuses to start, felled by a typo. Both live in the configuration loop, where files and shared components merge into a single pipeline graph.
The fix. For doubles, write the rules that decide when a pipeline exists — one per branch or one per proposed change, not both by accident. For the silent refusals, let the platform’s linting check the file before you commit it. The doubles have a cousin: shared templates that quietly include each other, producing jobs nobody ordered. Audit what your components pull in once, and the graph becomes readable again. This loop is where nearly every fresh team bleeds time, and it is entirely preventable.
Symptom Two: Jobs Parked in Pending Forever
The build finished its coffee, and so did everyone else. Jobs sit in pending while runners stand idle, or worse, the runners are busy and the queue simply grows. This is the scheduling loop: work finds machines only when the tags on both sides agree.
The fix. Read the job’s requested tags, then check which live runners actually wear them. Nine times in ten, someone renamed a tag, paused a runner for maintenance and never resumed it, or asked for a machine type the team never owned. While you are there, look at what kind of machine each job lands on. Jobs carrying code from outside the team deserve disposable machines that exist for one run and vanish; reserving anything long-lived and privileged for trusted work is the companion habit. The diagnosis takes minutes once you know the question.
Symptom Three: A Release Nobody Can Vouch For
Production changed, and no one can say who approved it or what exactly was deployed. Of the four failures, this is the one auditors ask about first and the one that costs the most trust. This is the delivery loop failing in its characteristic way: changes reaching environments with neither the sign-off nor the cryptographic signature the process requires.
The fix. Rebuild the ladder of gates. Protected environments restrict who and what may deploy to the sensitive stages. A queue that serializes conflicting releases prevents two jobs from trampling each other. Locking the production container tag to senior roles means the visible release marker cannot be moved casually. Add the habit of signing what you ship, and “who did this” becomes a lookup instead of an investigation. Identity deserves the same tightening: short-lived tokens issued to each job retire the era of shared master credentials, and with them most of the ways an unauthorized release can happen quietly.
Symptom Four: The Platform Itself Feels Sick
Everything is slow. API calls time out, the code storage grinds, errors appear in places that never errored before. When the ailment is everywhere at once, the fault is usually the platform loop — the version, the capacity, the backups — rather than any single project.
The fix. Check the version first. An installation that has fallen behind accumulates debt, and catching up means walking an orderly path through the mandatory stopping points rather than leaping to the newest release. Then look at capacity — queues lengthen and timeouts spread when a host runs out of headroom — then verify that backups actually restore, because a backup that has never been tested is a rumor rather than a plan. A schedule of modest upgrades every month or two prevents nearly all of this.
When the GitLabOps Fix Is a Habit, Not a Command
Notice the pattern across all four loops: the durable repair is rarely a cleverer command. It is an agreement — when pipelines may exist, which machines serve which work, who may approve a release, when the platform gets patched. Commands solve tonight; agreements stop next month from repeating it. The teams that stay calm during incidents are not luckier, they simply wrote the agreements earlier. The Atlas’s GitLabOps handbook calls these playbooks, and the name is apt: the value shows up on the next occurrence, not the current one.
A Pocket Triage List for GitLabOps Incidents
- Two builds per commit → write the existence rules; duplicate pipelines are a configuration-loop wound.
- Everything pending → compare requested tags against live runner tags.
- An unexplained release → restore the approval gates, then audit how it slipped past.
- Slowness everywhere → version first, capacity second, backups third.
- After any fix → write down which loop failed, so the next person diagnoses in minutes.
One closing observation from teams who keep this list by the on-call rota: the same four loops also structure prevention, so the document does double duty on quiet days. Keep the list near the on-call rota. GitLabOps problems feel dramatic in the moment and shrink to checklists the moment someone names the loop — which is the whole trick, and now you have it.