{
  "id": 5193188,
  "title": "Your CI is green and your pipeline produced nothing",
  "url": "https://urgent.news/2026/09/02/your-ci-is-green-and-your-pipeline-produced-nothing",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-09-02T22:43:33.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/provedone/your-ci-is-green-and-your-pipeline-produced-nothing-213o"
  },
  "original_language": "en",
  "account": "Two failures occurred in a pipeline that ran for several months, and neither appeared to be an error. Failure number one involved an exit code of 0, with no files created on the disk. A blog post was successfully published, and then it was checked by rebuilding the URL from parts, including a hardcoded month. On September 1st, every publish reported a 404 error. The check was incorrect because it was inside the same script and swallowed its own error, causing the job to still exit with 0. For a week, the dashboard showed green and the blog remained empty.\n\nFailure number two was when the work finished, but the cleanup process failed. The job produced 43 out of 45 files, then threw an EPERM error while deleting its own temporary directory. The 43 finished images were discarded, and no fallback path was executed because everything downstream relied on the exit code. Re-running the job cost forty minutes of compute time to undo an rm -rf . Both failures had one commonality: an exit code provided only one bit of information, and the real question had two parts: missing artifacts and present artifacts. An exit code of 0 did not differentiate between different situations, and it only knew the row, not the column that determined whether the shipment had occurred.",
  "summary": "Two failures broke an unattended pipeline I ran for a few months, and neither of them looked like an error. I want to describe them precisely, because I spent a long time debugging the wrong thing both times. Failure one: exit 0, nothing on disk A publisher posted a blog entry successfully. It then verified the post by rebuilding the URL from parts — including a hardcoded month: const check = `…",
  "key_points": [],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}