{"id":145,"date":"2026-10-12T13:11:09","date_gmt":"2026-10-12T13:11:09","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2009\/10\/06\/what-is-build-versioning\/"},"modified":"2026-10-12T13:11:09","modified_gmt":"2026-10-12T13:11:09","slug":"what-is-build-versioning","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/what-is-build-versioning\/","title":{"rendered":"Build Versioning Explained: Version Numbers, Build Numbers, and Release Traceability"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Build versioning is the practice of assigning identifiers to software artifacts so teams can track code changes, test the correct package, and safely roll forward or backward during releases.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2009-10-06; fully revised and updated.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2009\/10\/build-versioning.png\" alt=\"Build versioning illustration\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Build versioning in plain terms<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In day-to-day delivery, teams often use both a <strong>version number<\/strong> and a <strong>build number<\/strong>. The version usually represents the release line (for example, major\/minor\/patch), while the build number identifies a specific packaged instance produced during CI or release preparation.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Identifier<\/th><th>What it usually represents<\/th><th>Typical audience<\/th><\/tr><\/thead><tbody><tr><td>Version number<\/td><td>Functional release level (for example: feature, minor, patch progression)<\/td><td>Product, support, customers, release teams<\/td><\/tr><tr><td>Build number<\/td><td>Specific compiled\/package instance tied to a CI run or release milestone<\/td><td>Developers, QA, DevOps, release engineering<\/td><\/tr><tr><td>Release label (RC\/GA)<\/td><td>Readiness state of a candidate build<\/td><td>QA, release managers, stakeholders<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Why build versioning matters<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Supports rollback to a known working executable.<\/li><li>Links bug fixes and enhancements to a specific shipped artifact.<\/li><li>Improves traceability across development, QA, and release handoff.<\/li><li>Makes milestone tracking clearer (internal build, release candidate, general availability).<\/li><li>Preserves release history so teams can retrieve and redeploy prior packages quickly.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Typical workflow from development to release<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A common process is: create a build, assign identifiers, test in QA, fix defects if needed, then promote the validated build for release while recording all metadata in release history.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Developer commits changes] --> B[CI creates build artifact]\n    B --> C[Assign version and build number]\n    C --> D[Deliver build to QA]\n    D --> E{QA pass?}\n    E -- no --> F[Fix defects and rebuild]\n    F --> A\n    E -- yes --> G[Promote as RC or GA]\n    G --> H[Record release details and archive artifact]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Common numbering patterns<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You will commonly see three-part or four-part identifiers. The original post used a four-part style example (<strong>3.8.0.139<\/strong>): the left segments represent the main release number, and the last segment acts as a build identifier linked to that release line.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example: Windows resource version fields<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For Windows binaries, version metadata is often stored in resource fields such as <strong>FILEVERSION<\/strong> and <strong>PRODUCTVERSION<\/strong>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-ini\"><span class=\"hljs-selector-tag\">FILEVERSION<\/span> 1,0,0,57\n<span class=\"hljs-selector-tag\">PRODUCTVERSION<\/span> 1,0,0,57\n\n<span class=\"hljs-selector-tag\">VALUE<\/span> \"<span class=\"hljs-selector-tag\">FileVersion<\/span>\", \"1<span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.57<\/span>\"\n<span class=\"hljs-selector-tag\">VALUE<\/span> \"<span class=\"hljs-selector-tag\">ProductVersion<\/span>\", \"1<span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.57<\/span>\"<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Example: composing a package version in CI<\/h3>\n\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\">APP_VERSION=<span class=\"hljs-string\">\"1.4.2\"<\/span>\nBUILD_NUMBER=<span class=\"hljs-string\">\"57\"<\/span>\nPACKAGE_VERSION=<span class=\"hljs-string\">\"$APP_VERSION.$BUILD_NUMBER\"<\/span>\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$PACKAGE_VERSION\"<\/span><\/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\n<h2 class=\"wp-block-heading\">Ownership and release records<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In many organizations, release engineering, configuration management, or application packaging teams maintain build\/version records (module changes, release notes, artifact locations, and promotion status). Some teams keep this responsibility within development. The key requirement is a single, searchable history of what was built, tested, and released.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Define one versioning policy and apply it consistently across repos and artifacts.<\/li><li>Never reuse build numbers for different binaries.<\/li><li>Store build metadata with commit SHA, changelog, and environment details.<\/li><li>Tag releases in source control and map tags to artifact repository entries.<\/li><li>Automate version\/build assignment in CI to reduce manual errors.<\/li><li>Document when and why version segments are incremented (major, minor, patch, build).<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Build versioning gives every software package a traceable identity so QA, release, and operations teams know exactly what was tested and deployed. This guide clarifies version vs build numbers, shows a practical workflow, and provides implementation examples.<\/p>\n","protected":false},"author":1,"featured_media":4082,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[3279,91,146,3277,3272,3280,3275,3276,3282,3274,3281,381,3283,2434,3278,670,3273],"class_list":["post-145","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorised","tag-about-build-versioning","tag-build","tag-build-and-release","tag-build-overview","tag-build-versioning","tag-build-versioning-guide","tag-build-versioning-introduction","tag-build-versioning-overview","tag-numbering","tag-software-versioning","tag-understand-build-versioning","tag-version","tag-version-number","tag-versioning","tag-versioning-overview","tag-what","tag-what-is-build-versioning"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/145","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=145"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/145\/revisions"}],"predecessor-version":[{"id":78993,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/145\/revisions\/78993"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/4082"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=145"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=145"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=145"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}