{"record":{"id":"c5c6043eef522bc9","repo":"quarkusio/quarkus","slug":"build-report-file-cannot-be-written-to","errorCode":null,"errorMessage":"Build report file cannot be written to: ","messagePattern":"Build report file cannot be written to: ","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"devtools/cli/src/main/java/io/quarkus/cli/BuildReport.java","lineNumber":69,"sourceCode":"            JsonNode produced = record.get(\"producedItems\");\n            if (produced != null && !(produced instanceof NullNode)) {\n                producedItems = new ArrayList<>();\n                for (JsonNode item : produced) {\n                    producedItems.add(new BuildItem(item.get(\"item\").asText(), item.get(\"count\").asInt()));\n                }\n            }\n            records.add(new BuildStepRecord(record.get(\"stepId\").asText(), record.get(\"started\").asText(),\n                    record.get(\"duration\").asLong(), thread, producedItems));\n        }\n\n        for (JsonNode item : root.get(\"items\")) {\n            items.add(new BuildItem(item.get(\"class\").asText(), item.get(\"count\").asInt()));\n        }\n\n        File output = runner.getProjectRoot().resolve(runner.getBuildTool().getBuildDirectory())\n                .resolve(\"build-report.html\").toFile();\n        if (output.exists() && !output.canWrite()) {\n            throw new IllegalStateException(\"Build report file cannot be written to: \" + output);\n        }\n        try {\n            Files.writeString(output.toPath(),\n                    BuildReport.buildReport(buildTarget, duration, threads, records, items, itemsCount).render());\n            return output;\n        } catch (IOException e) {\n            throw new IllegalArgumentException(e);\n        }\n    }\n\n    public static class BuildStepRecord {\n\n        public final String stepId;\n        public final String started;\n        public final long duration;\n        public final String thread;\n        public final List<BuildItem> producedItems;\n","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/devtools/cli/src/main/java/io/quarkus/cli/BuildReport.java#L51-L87","documentation":"BuildReport.generate writes build-report.html into the build tool's build directory; if the file already exists but is not writable it throws IllegalStateException 'Build report file cannot be written to: <path>'. A subsequent IOException while writing is also surfaced from this method.","triggerScenarios":"Regenerating the report where build-report.html exists but the current user lacks write permission, the file is owned by another user (e.g. root-built output), or the filesystem is read-only.","commonSituations":"Previous build ran as root/in a container, leaving read-only output; CI workspace permissions changed; running on a mounted read-only target directory.","solutions":["Fix permissions on the existing build-report.html (chmod u+w) or delete it before regenerating","Run the command as the user who owns the build directory (or chown the directory)","Ensure the build/target directory is on a writable filesystem","If in a container, avoid building as root or adjust volume mount permissions"],"exampleFix":"# before: permission denied on stale report\nsudo chown -R $USER target/\nrm -f target/build-report.html\n./quarkus build --report","handlingStrategy":"validation","validationCode":"File out = new File(buildDir, \"build-report.html\");\nif (out.exists() && !out.canWrite()) throw new IllegalStateException(\"Fix permissions on \" + out);","typeGuard":null,"tryCatchPattern":"try { report.generate(); } catch (IllegalStateException e) { if (e.getMessage().startsWith(\"Build report file cannot be written\")) { new File(e.getMessage().substring(e.getMessage().lastIndexOf(':')+1).trim()).delete(); report.generate(); } else throw e; }","preventionTips":["Avoid building/reports as root in containers","Ensure CI workspace build directories are user-writable","Delete stale build-report.html before regeneration"],"tags":["cli","build-report","permissions","io"],"backgroundTag":"file-not-writable","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}