{"id":325,"date":"2026-10-13T14:51:13","date_gmt":"2026-10-13T14:51:13","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2012\/05\/23\/more-important-build-definitions\/"},"modified":"2026-10-13T14:51:13","modified_gmt":"2026-10-13T14:51:13","slug":"more-important-build-definitions","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/more-important-build-definitions\/","title":{"rendered":"Essential Build Definitions for DevOps Teams: Clean, Incremental, CI, and LKG Explained"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In build engineering, terms like <strong>clean build<\/strong>, <strong>incremental build<\/strong>, and <strong>build break<\/strong> sound obvious but are often interpreted differently by different teams. This guide standardizes those definitions, explains where each fits in a modern delivery pipeline, and provides practical examples you can adapt to your CI setup.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on May 23, 2012; fully revised and updated.<\/em><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2012\/05\/build-definitions.png\" alt=\"Build definitions terminology\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>Reference:<\/strong> <em>The Build Master: Microsoft\u2019s Software Configuration Management Best Practices<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why shared build terminology matters<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When teams use the same words differently, handoffs fail: QA tests the wrong artifact, release engineering promotes unstable builds, or developers assume quality gates already ran. Defining build terms at a project level creates predictable expectations for what a build includes and how trustworthy it is.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Reduces ambiguity between development, QA, security, and operations.<\/li><li>Makes release criteria explicit (for example, what qualifies as &#8220;last known good&#8221;).<\/li><li>Improves incident triage by distinguishing build-system failures from runtime defects.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Core build definitions<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Term<\/th><th>Definition<\/th><th>Why it matters<\/th><\/tr><\/thead><tbody><tr><td>Pre-build<\/td><td>Checks and preparation before compilation (for example environment readiness, dependency restore, available disk space).<\/td><td>Prevents avoidable failures early.<\/td><\/tr><tr><td>Post-build<\/td><td>Validation after build output is produced, such as build verification tests and integrity checks.<\/td><td>Confirms the artifact is testable and trustworthy.<\/td><\/tr><tr><td>Clean build<\/td><td>Removes generated byproducts and rebuilds everything from scratch.<\/td><td>Finds hidden dependency and caching issues.<\/td><\/tr><tr><td>Incremental build<\/td><td>Builds only what changed since the last successful build.<\/td><td>Delivers faster feedback and shorter cycle time.<\/td><\/tr><tr><td>Continuous integration build<\/td><td>Automated build and test runs multiple times per day, commonly on each commit.<\/td><td>Detects integration issues quickly.<\/td><\/tr><tr><td>Build break<\/td><td>A compile\/link\/tooling error caused by source changes.<\/td><td>Stops pipeline progress and needs immediate fix.<\/td><\/tr><tr><td>Build defect<\/td><td>The build succeeds, but a checked-in change breaks behavior at runtime or integration time.<\/td><td>Requires test coverage and triage beyond compiler success.<\/td><\/tr><tr><td>LKG or IDW build<\/td><td>A build marker indicating a known acceptable quality state with important fixes included.<\/td><td>Provides a safe baseline for further testing or release progression.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Clean vs incremental vs continuous integration builds<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Build type<\/th><th>Typical trigger<\/th><th>Scope<\/th><th>Speed<\/th><th>Best use<\/th><\/tr><\/thead><tbody><tr><td>Clean build<\/td><td>Scheduled, release candidate, or troubleshooting<\/td><td>Full rebuild of all components<\/td><td>Slowest<\/td><td>Verification of reproducibility and dependency correctness<\/td><\/tr><tr><td>Incremental build<\/td><td>Frequent developer or CI runs<\/td><td>Only changed components and dependencies<\/td><td>Fastest<\/td><td>Rapid feedback during normal development<\/td><\/tr><tr><td>Continuous integration build<\/td><td>On every merge or commit<\/td><td>Usually incremental plus automated tests<\/td><td>Fast to moderate<\/td><td>Early integration validation across the team<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Typical build workflow with quality gates<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Code commit] --> B[Pre build checks]\n    B --> C{Checks pass}\n    C -- No --> D[Fail fast and notify]\n    C -- Yes --> E[Build]\n    E --> F[Post build tests]\n    F --> G{Tests pass}\n    G -- No --> H[Mark build defect]\n    G -- Yes --> I[Tag last known good]\n    I --> J[Publish artifacts]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Example implementation: pre-build, build, and post-build<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The following examples are generic patterns you can adapt to your own build system.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\">#!\/usr\/bin\/env bash<\/span>\nset -euo pipefail\n\nMIN_MB=<span class=\"hljs-number\">5120<\/span>\nFREE_MB=$(df -Pm . | awk <span class=\"hljs-string\">'NR==2 {print $4}'<\/span>)\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Free disk: ${FREE_MB} MB\"<\/span>\n<span class=\"hljs-keyword\">if<\/span> &#91; <span class=\"hljs-string\">\"$FREE_MB\"<\/span> -lt <span class=\"hljs-string\">\"$MIN_MB\"<\/span> ]; then\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Not enough disk space for build\"<\/span>\n  <span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">1<\/span>\nfi\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Restoring dependencies\"<\/span>\nnpm ci<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\"># Clean build<\/span>\nmake clean\nmake all\n\n<span class=\"hljs-comment\"># Incremental build<\/span>\nmake all\n\n<span class=\"hljs-comment\"># Post-build verification<\/span>\nmake test<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-yaml\">name: ci\n<span class=\"hljs-attr\">on<\/span>:\n  push:\n    branches: &#91; main ]\n  <span class=\"hljs-attr\">schedule<\/span>:\n    - cron: <span class=\"hljs-string\">\"0 2 * * *\"<\/span>\n\n<span class=\"hljs-attr\">jobs<\/span>:\n  incremental:\n    <span class=\"hljs-keyword\">if<\/span>: github.event_name == <span class=\"hljs-string\">'push'<\/span>\n    runs-on: ubuntu-latest\n    <span class=\"hljs-attr\">steps<\/span>:\n      - uses: actions\/checkout@v4\n      - run: make all\n      - run: make test\n\n  <span class=\"hljs-attr\">nightly_clean<\/span>:\n    <span class=\"hljs-keyword\">if<\/span>: github.event_name == <span class=\"hljs-string\">'schedule'<\/span>\n    runs-on: ubuntu-latest\n    <span class=\"hljs-attr\">steps<\/span>:\n      - uses: actions\/checkout@v4\n      - run: make clean\n      - run: make all\n      - run: make test<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best practices for build definitions<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Document build terms in a shared engineering handbook and keep definitions versioned.<\/li><li>Require every pipeline stage to declare inputs, outputs, and pass\/fail criteria.<\/li><li>Run fast incremental CI on each commit, and schedule periodic clean builds to catch drift.<\/li><li>Treat build breaks as urgent and assign ownership immediately.<\/li><li>Use a clearly defined LKG policy before promoting artifacts to wider testing or release.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Shared build terminology prevents confusion between developers, QA, and release teams. This guide clarifies core build terms and shows how to apply them in a practical CI workflow.<\/p>\n","protected":false},"author":1,"featured_media":3805,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[91,2467,2468,2456,2461,2464,2466,2453,2460,2454,2459,2465,2470,2458,2469,2455,2463,2462,2457],"class_list":["post-325","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorised","tag-build","tag-build-break","tag-build-defect","tag-build-definitions","tag-build-terminologies","tag-clean-build","tag-continuous-integration-build","tag-definitions","tag-different-build-definitions","tag-important","tag-important-build-definitions","tag-incremental-build","tag-internal-developers-workstation-idw-builds","tag-know-about-different-builds","tag-last-known-good-build","tag-must","tag-post-build","tag-pre-build","tag-understand-build-definitions"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/325","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=325"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/325\/revisions"}],"predecessor-version":[{"id":79193,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/325\/revisions\/79193"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3805"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=325"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=325"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=325"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}