{"id":2357,"date":"2026-05-19T10:00:00","date_gmt":"2026-05-19T07:00:00","guid":{"rendered":"https:\/\/commerce-consulting-services.com\/en\/?p=2357"},"modified":"2026-03-24T09:47:05","modified_gmt":"2026-03-24T07:47:05","slug":"sap-commerce-cloud-cicd-best-practices","status":"publish","type":"post","link":"https:\/\/commerce-consulting-services.com\/lv\/sap-commerce-cloud-cicd-best-practices\/","title":{"rendered":"SAP Commerce Cloud CI\/CD Pipeline: Setup and Best Practices"},"content":{"rendered":"<p>[et_pb_section fb_built=&#8221;1&#8243; admin_label=&#8221;Hero&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; custom_padding=&#8221;0vw||80px||false|false&#8221; locked=&#8221;off&#8221; collapsed=&#8221;on&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_row _builder_version=&#8221;4.18.0&#8243; _module_preset=&#8221;5138c454-be54-4233-bd3b-f8e6a8747976&#8243; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.18.0&#8243; _module_preset=&#8221;73121f80-a3ef-4484-8763-c3f18e3c56d2&#8243; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;SAP Commerce&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;f0c675ea-2574-4d0e-b725-30f8550a8550&#8243; title_level=&#8221;h4&#8243; title_font=&#8221;IBM Plex Sans|IBM Plex Sans Condensed_weight||on|||||&#8221; title_text_color=&#8221;#1d3557&#8243; title_font_size=&#8221;14px&#8221; title_letter_spacing=&#8221;1px&#8221; title_line_height=&#8221;1.4em&#8221; custom_margin=&#8221;||10px||false|false&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{%22#1d3557%22:%91%22title_text_color%22%93}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_heading title=&#8221;SAP Commerce Cloud CI\/CD Pipeline: Setup and Best Practices&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;ddeb8c09-9078-4424-bc15-2efb6572e28e&#8221; title_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_post_title title=&#8221;off&#8221; meta=&#8221;off&#8221; featured_image=&#8221;on&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_post_title][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<p>A team deploying SAP Commerce Cloud once a month is not being cautious. It is accumulating risk. Large, infrequent deployments carry more changes, more potential conflicts, and more pressure when something goes wrong. In contrast, teams deploying multiple times per week ship smaller changesets, catch issues earlier, and build confidence in their release process.<\/p>\n<p>Getting to frequent, reliable deployments in SAP Commerce Cloud requires a well-designed CI\/CD pipeline. This is more complex than in typical web applications because of SAP Commerce&#8217;s build system, type system migrations, and the interplay between code and data (ImpEx). This guide covers the pipeline design, tooling, and operational practices that make continuous delivery practical for SAP Commerce projects.<\/p>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;Why CI\/CD Matters More for SAP Commerce&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<p>SAP Commerce projects have characteristics that make CI\/CD both harder and more important than in typical applications.<\/p>\n<p><strong>Long build times.<\/strong> A full SAP Commerce build (compiling all extensions, running the platform build) can take 15-30 minutes. Without pipeline optimization, developers wait too long for feedback.<\/p>\n<p><strong>Type system migrations.<\/strong> Changes to <code>items.xml<\/code> files require database schema updates (system update). If two developers modify the type system in conflicting ways, the conflict is only visible at system update time, not at compile time.<\/p>\n<p><strong>Data-code coupling.<\/strong> SAP Commerce relies heavily on ImpEx for data setup, content, and configuration. Code changes often require corresponding data changes, and the two must deploy together in the right order.<\/p>\n<p><strong>Environment complexity.<\/strong> CCv2 provides multiple managed environments (dev, staging, production) with specific characteristics around scaling, data, and connectivity. The pipeline must manage builds and deployments across these environments.<\/p>\n<p>These factors mean that ad-hoc deployment processes break down faster in SAP Commerce than in simpler applications. Investing in CI\/CD infrastructure pays dividends throughout the project lifecycle.<\/p>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;SAP Commerce Cloud Build System Overview&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<p>Understanding how CCv2 builds work is prerequisite to designing a good pipeline.<\/p>\n<h3>The Build Process<\/h3>\n<p>When you trigger a build in CCv2:<\/p>\n<ol>\n<li>The platform pulls your source code from the configured repository (the <code>repository<\/code> section of <code>manifest.json<\/code>).<\/li>\n<li>It resolves and downloads the SAP Commerce platform artifact and any configured AddOns or third-party libraries.<\/li>\n<li>It runs the Ant build process, compiling all extensions declared in <code>manifest.json<\/code> (which generates <code>localextensions.xml<\/code> at build time).<\/li>\n<li>It packages the result into a Docker image that will be deployed to Kubernetes pods.<\/li>\n<\/ol>\n<p>The build configuration lives in <code>manifest.json<\/code>, which specifies the commerce version, extensions, aspects (storefront, backoffice, backgroundProcessing), AddOns, properties, and web tests.<\/p>\n<h3>Build Triggers<\/h3>\n<p>CCv2 builds can be triggered through the Cloud Portal UI, the CCv2 REST API, or the SAP Commerce Cloud CLI tool. For CI\/CD, the REST API or CLI tool is the integration point. Your CI pipeline triggers a CCv2 build, polls for completion, and then triggers a deployment to the target environment.<\/p>\n<h3>Build Limitations<\/h3>\n<p>CCv2 has build concurrency limits (typically one or two concurrent builds per subscription). This means you cannot run parallel builds for multiple branches simultaneously without queuing. Factor this into your pipeline design: feature branch builds may need to queue behind each other.<\/p>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;Source Code Management Strategy&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<h3>Branching Model<\/h3>\n<p>For SAP Commerce projects, a simplified Git Flow works well:<\/p>\n<p><strong><code>main<\/code> (or <code>master<\/code>)<\/strong> &#8211; always deployable. Represents the current production state. Protected with required reviews and passing CI checks.<\/p>\n<p><strong><code>develop<\/code><\/strong> &#8211; integration branch where feature branches merge. Represents the next release candidate. Deployed to the development environment automatically.<\/p>\n<p><strong><code>feature\/*<\/code><\/strong> &#8211; short-lived branches for individual features or stories. Branch from <code>develop<\/code>, merge back via pull request.<\/p>\n<p><strong><code>release\/*<\/code><\/strong> &#8211; created from <code>develop<\/code> when a release is being prepared. Only bug fixes and release-specific configuration changes go here. Merges to both <code>main<\/code> and <code>develop<\/code> upon release.<\/p>\n<p><strong><code>hotfix\/*<\/code><\/strong> &#8211; created from <code>main<\/code> for urgent production fixes. Merges back to both <code>main<\/code> and <code>develop<\/code>.<\/p>\n<p>The key discipline: keep feature branches short-lived (days, not weeks). Long-lived feature branches diverge from <code>develop<\/code>, and the merge becomes risky, especially when type system changes are involved.<\/p>\n<h3>Monorepo vs. Multi-repo<\/h3>\n<p>SAP Commerce projects typically work best as a monorepo containing all custom extensions, storefront code, configuration, and ImpEx scripts. A monorepo ensures that code changes and their corresponding data changes are committed atomically. Multi-repo setups (separate repos for backend and frontend, or per-extension repos) create coordination overhead that is rarely justified.<\/p>\n<p>If you are using Composable Storefront (headless), the frontend deserves its own repository with its own pipeline, since it deploys independently. The backend SAP Commerce code remains in a monorepo.<\/p>\n<h3>Type System Change Discipline<\/h3>\n<p>Changes to <code>items.xml<\/code> files are the most dangerous changes in SAP Commerce. They alter the database schema and can cause data loss if done incorrectly. Establish these rules:<\/p>\n<ul>\n<li><strong>Never remove an attribute<\/strong> from <code>items.xml<\/code> without a migration plan for existing data.<\/li>\n<li><strong>Never change an attribute type<\/strong> (e.g., from String to Integer) on an existing attribute. Create a new attribute and migrate data.<\/li>\n<li><strong>Review all <code>items.xml<\/code> changes<\/strong> with heightened scrutiny in pull requests.<\/li>\n<li><strong>Test type system changes<\/strong> by running <code>ant updatesystem<\/code> in CI against a database with realistic data.<\/li>\n<\/ul>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;Build Automation Pipeline&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<h3>Pipeline Stages<\/h3>\n<p>A well-structured SAP Commerce CI\/CD pipeline has these stages:<\/p>\n<h4>Stage 1: Code Quality (runs in CI, 2-5 minutes)<\/h4>\n<ul>\n<li><strong>Compilation check<\/strong> &#8211; <code>ant clean all<\/code> in a local CI runner (not CCv2) to verify the code compiles. This is faster than waiting for a CCv2 build.<\/li>\n<li><strong>Static analysis<\/strong> &#8211; SonarQube or similar tools scanning for code quality issues, security vulnerabilities, and coding standard violations.<\/li>\n<li><strong>Dependency check<\/strong> &#8211; verify no unauthorized or vulnerable third-party libraries have been introduced.<\/li>\n<\/ul>\n<p>This stage runs on every push to any branch and provides fast feedback to developers.<\/p>\n<h4>Stage 2: Automated Tests (runs in CI, 10-20 minutes)<\/h4>\n<ul>\n<li><strong>Unit tests<\/strong> &#8211; standard JUnit tests for service-layer logic, populators, strategies, and utility classes.<\/li>\n<li><strong>Integration tests<\/strong> &#8211; tests that require the SAP Commerce application context (Spring context, type system). These use <code>ServicelayerTest<\/code> or <code>ServicelayerTransactionalTest<\/code> as base classes.<\/li>\n<li><strong>API tests<\/strong> &#8211; tests against the OCC API endpoints, verifying request\/response contracts.<\/li>\n<\/ul>\n<p>More on testing strategy below.<\/p>\n<h4>Stage 3: CCv2 Build (triggered after merge to develop\/release\/main, 15-30 minutes)<\/h4>\n<ul>\n<li>Trigger CCv2 build via the REST API or CLI.<\/li>\n<li>Poll for build completion.<\/li>\n<li>Verify build success.<\/li>\n<li>Store build code for deployment.<\/li>\n<\/ul>\n<h4>Stage 4: Deployment (automated to dev\/staging, gated for production)<\/h4>\n<ul>\n<li>Trigger deployment of the build to the target environment.<\/li>\n<li>Run post-deployment health checks.<\/li>\n<li>Execute smoke tests.<\/li>\n<li>Notify the team of deployment status.<\/li>\n<\/ul>\n<h4>Stage 5: Post-Deployment Validation<\/h4>\n<ul>\n<li>Run end-to-end tests against the deployed environment.<\/li>\n<li>Verify critical business flows (search, browse, add to cart, checkout).<\/li>\n<li>Check monitoring dashboards for anomalies.<\/li>\n<\/ul>\n<h3>Pipeline Tooling<\/h3>\n<p>Most SAP Commerce teams use one of:<\/p>\n<ul>\n<li><strong>Jenkins<\/strong> &#8211; widely used in enterprise SAP environments, highly configurable, requires maintenance.<\/li>\n<li><strong>GitLab CI<\/strong> &#8211; good integration with GitLab repositories, YAML-based pipeline configuration.<\/li>\n<li><strong>Azure DevOps<\/strong> &#8211; natural fit if your CCv2 subscription uses Azure infrastructure.<\/li>\n<li><strong>GitHub Actions<\/strong> &#8211; increasingly popular, good for teams already on GitHub.<\/li>\n<\/ul>\n<p>The choice of CI tool matters less than the pipeline design. Any of these tools can implement the stages described above.<\/p>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;Automated Testing Layers&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<p>Testing SAP Commerce applications effectively requires a layered approach, because different types of problems are caught at different levels.<\/p>\n<h3>Unit Tests<\/h3>\n<p>Unit tests for SAP Commerce code should follow standard Java unit testing practices:<\/p>\n<ul>\n<li>Mock dependencies using Mockito or similar frameworks.<\/li>\n<li>Test service-layer classes, populators, converters, strategies, and interceptors in isolation.<\/li>\n<li>Focus on business logic, edge cases, and error handling.<\/li>\n<li>Aim for fast execution (the full unit test suite should run in under 5 minutes).<\/li>\n<\/ul>\n<p>The SAP Commerce-specific challenge: much of the business logic lives in services that depend on <code>ModelService<\/code>, <code>FlexibleSearchService<\/code>, and other platform services. Use constructor injection (not field injection with <code>@Resource<\/code>) to make these dependencies mockable.<\/p>\n<h3>Integration Tests<\/h3>\n<p>SAP Commerce integration tests run within the platform&#8217;s Spring context and can access the type system, database, and platform services. They are essential for testing:<\/p>\n<ul>\n<li><strong>Flexible Search queries<\/strong> &#8211; verify that custom queries return correct results with realistic data.<\/li>\n<li><strong>Interceptors<\/strong> &#8211; validate, prepare, and remove interceptors that fire on model lifecycle events.<\/li>\n<li><strong>Type system behavior<\/strong> &#8211; verify that custom types, relations, and enums behave as expected.<\/li>\n<li><strong>ImpEx imports<\/strong> &#8211; verify that ImpEx scripts execute without errors.<\/li>\n<\/ul>\n<p>Integration tests are slower than unit tests (they require platform bootstrap) but catch a class of bugs that unit tests cannot: Flexible Search syntax errors, missing Spring bean definitions, and type system misconfigurations.<\/p>\n<h3>API Tests<\/h3>\n<p>For headless projects, API testing is critical. We have had excellent results using the Karate framework for SAP Commerce OCC API testing. Karate&#8217;s advantages for this use case:<\/p>\n<ul>\n<li><strong>Readable syntax<\/strong> &#8211; non-developers (QA, business analysts) can understand and contribute to test scenarios.<\/li>\n<li><strong>Built-in assertions<\/strong> &#8211; JSON path matching, schema validation, and response code assertions without boilerplate.<\/li>\n<li><strong>Data-driven testing<\/strong> &#8211; parameterize tests with different products, customers, and scenarios.<\/li>\n<li><strong>Performance testing<\/strong> &#8211; Karate&#8217;s Gatling integration allows reusing functional tests as performance tests.<\/li>\n<\/ul>\n<p>Write API tests for every custom OCC endpoint and for critical standard flows (product search, cart operations, checkout). These tests serve double duty as regression tests and API documentation.<\/p>\n<h3>UI Tests<\/h3>\n<p>For projects using Composable Storefront, end-to-end UI tests using Cypress or Playwright verify the full stack. Keep these tests focused on critical paths:<\/p>\n<ul>\n<li>Search and navigation<\/li>\n<li>Product detail page rendering<\/li>\n<li>Add to cart and cart management<\/li>\n<li>Checkout flow (guest and registered)<\/li>\n<li>Account management (login, registration, order history)<\/li>\n<\/ul>\n<p>UI tests are inherently slower and more brittle than lower-level tests. Maintain a small, focused suite rather than attempting to cover every page.<\/p>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;Environment Management in CCv2&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<h3>Environment Topology<\/h3>\n<p>A standard CCv2 subscription includes:<\/p>\n<ul>\n<li><strong>Development (d1)<\/strong> &#8211; lower resources, used for development team testing. Automatically deployed from the <code>develop<\/code> branch.<\/li>\n<li><strong>Staging (s1)<\/strong> &#8211; production-like resources, used for pre-release validation. Deployed from <code>release\/*<\/code> branches.<\/li>\n<li><strong>Production (p1)<\/strong> &#8211; live environment. Deployed from <code>main<\/code> after staging validation.<\/li>\n<\/ul>\n<p>Some subscriptions include additional environments. Use them for dedicated performance testing or UAT (User Acceptance Testing).<\/p>\n<h3>Data Management Across Environments<\/h3>\n<p>One of the hardest CI\/CD challenges in SAP Commerce is managing data across environments. Production data drifts from staging data over time as business users create content, promotions, and catalog changes.<\/p>\n<p>Strategies:<\/p>\n<ul>\n<li><strong>Regular data refreshes<\/strong> &#8211; periodically copy production data to staging. CCv2 provides data backup and restore capabilities. This ensures staging reflects real-world data volumes and content.<\/li>\n<li><strong>Idempotent ImpEx<\/strong> &#8211; write ImpEx scripts that can be run multiple times without error. Use <code>UPDATE<\/code> with <code>[unique=true]<\/code> rather than <code>INSERT<\/code>. Use <code>INSERT_UPDATE<\/code> when appropriate.<\/li>\n<li><strong>Environment-specific properties<\/strong> &#8211; use <code>manifest.json<\/code> property overrides or environment-specific property files for configuration that differs between environments (API endpoints, feature flags, integration credentials).<\/li>\n<\/ul>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;Deployment Strategies&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<h3>Standard CCv2 Deployment<\/h3>\n<p>CCv2 deployments follow a rolling update pattern:<\/p>\n<ol>\n<li>New pods are started with the new build.<\/li>\n<li>Health checks verify the new pods are ready.<\/li>\n<li>Traffic is gradually shifted to new pods.<\/li>\n<li>Old pods are terminated.<\/li>\n<\/ol>\n<p>During deployment, both old and new versions handle traffic simultaneously for a brief period. Ensure your code handles this gracefully: database schema changes must be backward-compatible with the previous code version.<\/p>\n<h3>Database Migrations and System Update<\/h3>\n<p>The <code>ant updatesystem<\/code> step (which applies type system changes to the database) runs during deployment. This is a critical phase:<\/p>\n<ul>\n<li><strong>Schema changes are applied<\/strong> (new tables, new columns, altered columns).<\/li>\n<li><strong>Essential data and project data ImpEx scripts<\/strong> run.<\/li>\n<li><strong>Content and sample data<\/strong> may run depending on configuration.<\/li>\n<\/ul>\n<p>For large databases, type system changes can take significant time. Adding an index to a table with millions of rows may lock the table for minutes. Plan these changes carefully and communicate expected deployment duration to stakeholders.<\/p>\n<h3>Hotfix Procedures<\/h3>\n<p>When production issues require an urgent fix:<\/p>\n<ol>\n<li>Create a <code>hotfix\/*<\/code> branch from <code>main<\/code>.<\/li>\n<li>Implement and test the fix.<\/li>\n<li>Run the CI pipeline (abbreviated if time-critical, but never skip automated tests entirely).<\/li>\n<li>Trigger a CCv2 build and deploy to staging for verification.<\/li>\n<li>Deploy to production.<\/li>\n<li>Merge the hotfix branch back to both <code>main<\/code> and <code>develop<\/code>.<\/li>\n<\/ol>\n<p>Define the hotfix process before you need it. A documented, rehearsed procedure avoids panic-driven mistakes.<\/p>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;ImpEx Management in CI\/CD&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<p>ImpEx files are a major source of deployment failures. Establishing conventions around ImpEx management prevents many issues.<\/p>\n<h3>Categorization<\/h3>\n<p>Organize ImpEx files by their purpose and execution context:<\/p>\n<ul>\n<li><strong>Essential data<\/strong> &#8211; required for the system to function (user groups, basic configuration, workflow templates). Runs on every system update.<\/li>\n<li><strong>Project data<\/strong> &#8211; business data that is part of the codebase (site configuration, content pages, CMS components). Runs on every system update.<\/li>\n<li><strong>Sample data<\/strong> &#8211; data for development and testing only. Never runs in production.<\/li>\n<li><strong>Migration scripts<\/strong> &#8211; one-time data migrations (renaming attributes, moving data between types). Run once and then removed or disabled.<\/li>\n<\/ul>\n<h3>Idempotency<\/h3>\n<p>Every ImpEx script that runs on system update must be idempotent. Running it twice should produce the same result as running it once. This means:<\/p>\n<ul>\n<li>Use <code>INSERT_UPDATE<\/code> instead of <code>INSERT<\/code> for data that might already exist.<\/li>\n<li>Use <code>REMOVE<\/code> carefully, check that the item exists before attempting removal.<\/li>\n<li>Use conditional logic (<code>#% if:<\/code>) for environment-specific data.<\/li>\n<li>Test ImpEx scripts by running them twice in a row in your local environment.<\/li>\n<\/ul>\n<h3>Ordering<\/h3>\n<p>ImpEx execution order matters. CMS components must be created before the content slots that reference them. Products must exist before stock levels reference them. In SAP Commerce, execution order is controlled by file naming conventions: files prefixed with <code>essentialdata<\/code> run before those prefixed with <code>projectdata<\/code>, and within each category, files are processed in alphabetical order based on their names in the extension&#8217;s resources directory. Use numbered file naming (e.g., <code>essentialdata-01-sites.impex<\/code>, <code>projectdata-01-content-pages.impex<\/code>, <code>projectdata-02-cms-components.impex<\/code>) to enforce a predictable sequence.<\/p>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;Code Quality Gates&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<h3>Static Analysis<\/h3>\n<p>Configure SonarQube (or a comparable tool) with SAP Commerce-specific rules:<\/p>\n<ul>\n<li><strong>Flexible Search injection<\/strong> &#8211; detect string concatenation in Flexible Search queries (SQL injection risk).<\/li>\n<li><strong>Model service usage<\/strong> &#8211; flag direct model saves without proper interceptor context.<\/li>\n<li><strong>Hardcoded values<\/strong> &#8211; detect hardcoded catalog versions, site IDs, and other environment-specific values.<\/li>\n<li><strong>Spring bean best practices<\/strong> &#8211; detect field injection (prefer constructor injection), detect unused beans.<\/li>\n<\/ul>\n<h3>Security Scanning<\/h3>\n<p>Run dependency vulnerability scanning (OWASP Dependency Check, Snyk, or similar) on every build. SAP Commerce bundles many third-party libraries, and your custom extensions add more. A known vulnerability in a transitive dependency should block the pipeline.<\/p>\n<h3>Code Review<\/h3>\n<p>Automated checks complement but do not replace human review. Establish pull request review requirements:<\/p>\n<ul>\n<li>At least one reviewer for standard changes.<\/li>\n<li>Two reviewers for type system changes, security-sensitive code, and payment\/checkout modifications.<\/li>\n<li>Architecture review for new extensions, new integrations, or significant refactoring.<\/li>\n<\/ul>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;Monitoring Post-Deployment&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<h3>Health Checks<\/h3>\n<p>Implement health check endpoints that verify:<\/p>\n<ul>\n<li>Database connectivity<\/li>\n<li>Solr connectivity<\/li>\n<li>External service availability (payment providers, ERP integration)<\/li>\n<li>Cache warm-up status<\/li>\n<\/ul>\n<p>CCv2 uses these health checks for pod readiness. The pipeline should also query them after deployment to verify the environment is healthy.<\/p>\n<h3>Smoke Tests<\/h3>\n<p>Automated smoke tests run immediately after deployment to verify critical functionality:<\/p>\n<ul>\n<li>Homepage loads without errors<\/li>\n<li>Product search returns results<\/li>\n<li>A product can be added to cart<\/li>\n<li>Checkout page renders (even if you don&#8217;t complete a transaction)<\/li>\n<li>Backoffice login works<\/li>\n<\/ul>\n<p>Keep smoke tests fast (under 2 minutes) and reliable. A flaky smoke test that triggers false alarms erodes trust in the pipeline.<\/p>\n<h3>Rollback Procedures<\/h3>\n<p>When a deployment causes issues:<\/p>\n<ol>\n<li><strong>Identify the problem<\/strong> &#8211; check monitoring dashboards, application logs, and error rates.<\/li>\n<li><strong>Decide: rollback or fix forward<\/strong> &#8211; if the fix is trivial, fixing forward (deploying a corrected build) may be faster. If the problem is complex or data-corrupting, rollback.<\/li>\n<li><strong>Rollback mechanism<\/strong> &#8211; CCv2 supports redeploying a previous build. This handles code rollback, but does not reverse database schema changes. This is why backward-compatible schema changes are essential.<\/li>\n<\/ol>\n<p>Practice rollbacks in non-production environments. A rollback procedure that has never been tested is a rollback procedure that will not work when you need it.<\/p>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;Common CI\/CD Pitfalls&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<h3>Pitfall 1: No Local Build Verification<\/h3>\n<p>Developers pushing code without running a local build. The CI pipeline catches the compilation error 20 minutes later, blocking other team members. Enforce local build verification through pre-commit hooks or developer discipline.<\/p>\n<h3>Pitfall 2: Ignoring Flaky Tests<\/h3>\n<p>A test that fails intermittently is not a minor annoyance &#8211; it is a pipeline reliability problem. Flaky tests train the team to ignore failures, which means real failures also get ignored. Fix or quarantine flaky tests immediately.<\/p>\n<h3>Pitfall 3: Manual Steps in the Pipeline<\/h3>\n<p>Any step that requires a human to click a button, run a command, or copy a value introduces delay and error risk. Automate everything except the production deployment approval gate.<\/p>\n<h3>Pitfall 4: No Pipeline-as-Code<\/h3>\n<p>Storing pipeline configuration in the CI tool&#8217;s UI rather than in the repository. This makes the pipeline impossible to version, review, or reproduce. Store all pipeline configuration (Jenkinsfile, <code>.gitlab-ci.yml<\/code>, GitHub Actions workflows) in the repository alongside the application code.<\/p>\n<h3>Pitfall 5: Testing Only the Happy Path<\/h3>\n<p>Automated tests that only verify success scenarios miss the failures that cause production incidents. Test error handling, timeout behavior, invalid input, and concurrent access. The bugs that reach production are almost always in the paths nobody tested.<\/p>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][et_pb_row _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;Building the Pipeline Incrementally&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_text quote_border_color=&#8221;#457b9d&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;2c55a9c4-feed-423b-9edb-ae0b5b365cac&#8221; text_font=&#8221;IBM Plex Sans|IBM Plex Sans_weight|||||||&#8221; link_font=&#8221;|IBM Plex Sans_weight|||||||&#8221; link_text_color=&#8221;#1d3557&#8243; quote_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_2_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_3_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_4_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_5_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; header_6_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans Condensed_weight|||||||&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;]<\/p>\n<p>You do not need to implement everything in this guide at once. A phased approach:<\/p>\n<p><strong>Phase 1 (Week 1-2):<\/strong> Set up basic pipeline with compilation check, unit tests, and automated CCv2 build trigger on merge to <code>develop<\/code>.<\/p>\n<p><strong>Phase 2 (Week 3-4):<\/strong> Add integration tests, static analysis, and automated deployment to the development environment.<\/p>\n<p><strong>Phase 3 (Month 2):<\/strong> Add API tests, smoke tests, and automated staging deployment. Implement code quality gates as merge requirements.<\/p>\n<p><strong>Phase 4 (Month 3+):<\/strong> Add performance tests, security scanning, and production deployment automation with approval gates.<\/p>\n<p>Each phase delivers incremental value. Phase 1 alone catches the majority of &#8220;it doesn&#8217;t compile&#8221; and &#8220;the tests are broken&#8221; issues that slow teams down.<\/p>\n<p>For teams that want guidance on pipeline design and implementation, our <a href=\"https:\/\/commerce-consulting-services.com\/en\/it-consulting-services\/sap-commerce-consulting\/\">SAP Commerce consulting services<\/a> include DevOps and CI\/CD advisory. We draw on patterns from <a href=\"https:\/\/commerce-consulting-services.com\/en\/it-consulting-portfolio\/\">our portfolio<\/a> of enterprise implementations to help teams establish pipelines that balance rigor with velocity.<\/p>\n<p>[\/et_pb_text][et_pb_divider _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_divider][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>[et_pb_section fb_built=&#8221;1&#8243; admin_label=&#8221;Hero&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;default&#8221; custom_padding=&#8221;0vw||80px||false|false&#8221; locked=&#8221;off&#8221; collapsed=&#8221;on&#8221; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_row _builder_version=&#8221;4.18.0&#8243; _module_preset=&#8221;5138c454-be54-4233-bd3b-f8e6a8747976&#8243; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.18.0&#8243; _module_preset=&#8221;73121f80-a3ef-4484-8763-c3f18e3c56d2&#8243; global_colors_info=&#8221;{}&#8221; theme_builder_area=&#8221;post_content&#8221;][et_pb_heading title=&#8221;SAP Commerce&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;f0c675ea-2574-4d0e-b725-30f8550a8550&#8243; title_level=&#8221;h4&#8243; title_font=&#8221;IBM Plex Sans|IBM Plex Sans Condensed_weight||on|||||&#8221; title_text_color=&#8221;#1d3557&#8243; title_font_size=&#8221;14px&#8221; title_letter_spacing=&#8221;1px&#8221; title_line_height=&#8221;1.4em&#8221; custom_margin=&#8221;||10px||false|false&#8221; locked=&#8221;off&#8221; global_colors_info=&#8221;{%22#1d3557%22:%91%22title_text_color%22%93}&#8221; theme_builder_area=&#8221;post_content&#8221;][\/et_pb_heading][et_pb_heading title=&#8221;SAP Commerce Cloud CI\/CD Pipeline: Setup and Best Practices&#8221; _builder_version=&#8221;4.27.5&#8243; _module_preset=&#8221;ddeb8c09-9078-4424-bc15-2efb6572e28e&#8221; title_font=&#8221;IBM Plex Sans Condensed|IBM Plex Sans [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2356,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[47],"tags":[],"class_list":["post-2357","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sap-commerce"],"acf":{"cta_title":"Need SAP Commerce expertise?","cta_description":"12+ years of enterprise e-commerce consulting. Architecture reviews, migrations, performance optimization.","cta_button_text":"Schedule a Consultation","cta_button_url":"https:\/\/commerce-consulting-services.com\/en\/contact-it-consultant\/"},"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/posts\/2357","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/comments?post=2357"}],"version-history":[{"count":2,"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/posts\/2357\/revisions"}],"predecessor-version":[{"id":2419,"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/posts\/2357\/revisions\/2419"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/media\/2356"}],"wp:attachment":[{"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/media?parent=2357"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/categories?post=2357"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/commerce-consulting-services.com\/lv\/wp-json\/wp\/v2\/tags?post=2357"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}