{"id":297,"date":"2026-10-13T10:31:53","date_gmt":"2026-10-13T10:31:53","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2011\/02\/22\/scm-process-and-smartbuild\/"},"modified":"2026-10-13T10:31:53","modified_gmt":"2026-10-13T10:31:53","slug":"scm-process-and-smartbuild","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/scm-process-and-smartbuild\/","title":{"rendered":"SCM Process in DevOps: Practical Workflow and a Change-Aware smartBuild Pattern"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">This updated guide explains the <strong>SCM (Software Configuration Management) process<\/strong> and how to apply a practical <strong>smart build<\/strong> pattern in modern DevOps pipelines. It is for teams that want traceable code changes, safer merges, and faster builds by running only what matters.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2011-02-22; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Source attribution: <a href='https:\/\/www.devopsschool.com\/blog\/scm-process-and-smartbuild\/'>original DevOpsSchool post<\/a>, <a href='https:\/\/www.slideshare.net\/rajeshatbuzz\/scm-process-and-smartbuild' target='_blank' rel='noopener'>SCM Process and smartBuild<\/a> by <a href='https:\/\/www.slideshare.net\/rajeshatbuzz' target='_blank' rel='noopener'>Rajesh Kumar<\/a>.<\/p>\n\n\n\n<figure class='wp-block-image size-full'><img src='https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2011\/02\/scm-process-and-smartbuild.png' alt='SCM process and smartBuild diagram'\/><\/figure>\n\n\n\n<iframe src='https:\/\/www.slideshare.net\/slideshow\/embed_code\/key\/3Xz7hdL0HbXDQH' width='595' height='485' frameborder='0' marginwidth='0' marginheight='0' scrolling='no' allowfullscreen='allowfullscreen'><\/iframe>\n\n\n\n<h2 class=\"wp-block-heading\">SCM and smart build in a DevOps context<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">SCM is the discipline of controlling changes to source code, configuration, and release artifacts. In practice, teams combine SCM with CI\/CD so every change is versioned, reviewed, built, tested, and auditable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Because the original post is a slide-based overview, this revision uses a practical interpretation of <em>smartBuild<\/em>: a <strong>change-aware build approach<\/strong> that triggers only the builds and tests impacted by a commit.<\/p>\n\n\n\n<ul class='wp-block-list'><li>Track every change with commit history and tags.<\/li><li>Enforce quality gates through review and CI checks.<\/li><li>Reduce pipeline time with selective build\/test execution.<\/li><li>Publish immutable artifacts for reliable releases and rollback.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Reference SCM-to-build workflow<\/h2>\n\n\n\n<pre class='mermaid'>\nflowchart LR\n    A[Plan change] --> B[Create branch]\n    B --> C[Commit and push]\n    C --> D[Pull request review]\n    D --> E[Merge to main]\n    E --> F[CI detect changed paths]\n    F --> G[Run impacted builds and tests]\n    G --> H{Checks pass}\n    H -- no --> I[Fix and recommit]\n    H -- yes --> J[Publish artifact]\n    J --> K[Deploy and tag release]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">SCM process stages and control points<\/h2>\n\n\n\n<figure class='wp-block-table'><table class='has-fixed-layout'><thead><tr><th>Stage<\/th><th>Main activity<\/th><th>Primary output<\/th><th>Typical control point<\/th><\/tr><\/thead><tbody><tr><td>Baseline and planning<\/td><td>Define scope, branch strategy, naming rules<\/td><td>Working agreement<\/td><td>Team approval of workflow<\/td><\/tr><tr><td>Development<\/td><td>Implement changes in short-lived branches<\/td><td>Commits linked to work items<\/td><td>Pre-commit checks\/linting<\/td><\/tr><tr><td>Integration<\/td><td>Open pull request and review<\/td><td>Reviewed merge<\/td><td>Required reviewers and status checks<\/td><\/tr><tr><td>Verification<\/td><td>Run CI builds and tests<\/td><td>Test reports and logs<\/td><td>Pass\/fail quality gate<\/td><\/tr><tr><td>Release<\/td><td>Tag version and publish artifact<\/td><td>Versioned artifact<\/td><td>Release approval policy<\/td><\/tr><tr><td>Audit and recovery<\/td><td>Track provenance and rollback path<\/td><td>Traceability records<\/td><td>Retention and backup policy<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Choosing a collaboration model<\/h2>\n\n\n\n<figure class='wp-block-table'><table class='has-fixed-layout'><thead><tr><th>Model<\/th><th>Best for<\/th><th>Strength<\/th><th>Trade-off<\/th><\/tr><\/thead><tbody><tr><td>Trunk-based development<\/td><td>High deployment frequency teams<\/td><td>Fast integration, fewer long-lived branches<\/td><td>Requires strong automated testing discipline<\/td><\/tr><tr><td>Feature branches with pull requests<\/td><td>Most product teams<\/td><td>Clear review flow and isolation per change<\/td><td>Can accumulate merge conflict risk if branches live too long<\/td><\/tr><tr><td>Release branches<\/td><td>Products with staged release windows<\/td><td>Stabilization before production cut<\/td><td>More branch management overhead<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Example implementation: Git plus change-aware build logic<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Basic SCM flow with Git<\/h3>\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\" class='language-bash'>git checkout -b feature\/login-rate-limit\ngit add .\ngit commit -m <span class=\"hljs-string\">'Add rate limit middleware'<\/span>\ngit push -u origin feature\/login-rate-limit\n\n<span class=\"hljs-comment\"># after review and merge<\/span>\ngit tag -a v1<span class=\"hljs-number\">.4<\/span><span class=\"hljs-number\">.0<\/span> -m <span class=\"hljs-string\">'Release v1.4.0'<\/span>\ngit push origin v1<span class=\"hljs-number\">.4<\/span><span class=\"hljs-number\">.0<\/span><\/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\n<h3 class=\"wp-block-heading\">Smart build script example (monorepo)<\/h3>\n\n\n<pre class='wp-block-code' aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\" class='language-bash'>changed_paths=$(git diff --name-only origin\/main...HEAD)\n\nrun_service_a=<span class=\"hljs-literal\">false<\/span>\nrun_service_b=<span class=\"hljs-literal\">false<\/span>\n\n<span class=\"hljs-keyword\">while<\/span> IFS= read -r path; <span class=\"hljs-keyword\">do<\/span>\n  <span class=\"hljs-keyword\">case<\/span> $path <span class=\"hljs-keyword\">in<\/span>\n    service-a<span class=\"hljs-comment\">\/*) run_service_a=true ;;\n    service-b\/*) run_service_b=true ;;\n    shared\/*) run_service_a=true; run_service_b=true ;;\n  esac\ndone &lt;&lt;&lt; $changed_paths\n\n$run_service_a &amp;&amp; .\/gradlew :service-a:test\n$run_service_b &amp;&amp; .\/gradlew :service-b:test<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><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<h3 class=\"wp-block-heading\">Pipeline step that calls the smart build script<\/h3>\n\n\n<pre class='wp-block-code'><span><code class=\"hljs\" class='language-yaml'>stages:\n  - test\n\nsmart_build_test:\n  stage: test\n  script:\n    - git fetch origin main\n    - .\/ci\/smart-build.sh\n  only:\n    - merge_requests<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Adapt the pipeline syntax to your CI system, but keep the pattern: <strong>detect changes, map impact, run only required jobs, and enforce a quality gate before merge<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices<\/h2>\n\n\n\n<ul class='wp-block-list'><li>Keep branches short-lived and merge frequently to reduce conflict cost.<\/li><li>Protect main branches with required reviews and CI checks.<\/li><li>Version artifacts with tags so each deployment maps back to source.<\/li><li>Start smart build rules simple (path-based), then evolve toward dependency-aware mapping.<\/li><li>Log why a job was skipped or triggered so selective builds stay auditable.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>This revised guide explains how to run an effective SCM process and apply a smart build approach that only builds and tests impacted components. It also preserves the original slide and attribution while adding practical DevOps implementation guidance.<\/p>\n","protected":false},"author":1,"featured_media":3909,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[1517,593,397,2776,2782,2784,2786,2780,2777,2783,2785,2787,2781,2435,2778,2779,2788],"class_list":["post-297","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorised","tag-configuration-management","tag-process","tag-scm","tag-scm-process","tag-scm-process-concept","tag-scm-process-guide","tag-scm-process-introduction","tag-scm-process-overview","tag-smartbuild","tag-smartbuild-concept","tag-smartbuild-guide","tag-smartbuild-introduction","tag-smartbuild-overview","tag-software-configuration-management","tag-software-development-process","tag-what-is-scm","tag-what-is-smartbuild"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/297","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=297"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/297\/revisions"}],"predecessor-version":[{"id":79135,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/297\/revisions\/79135"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3909"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=297"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=297"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=297"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}