
A Magento release pipeline should build an immutable artifact once, run the Hyvä Tailwind compile before static content deploy, import configuration from version control rather than the admin, and switch traffic with a symlink. Everything else, including approvals, rollback, and audit evidence, hangs off those four decisions.
Enterprise IT modernization architects ask a different question about ecommerce platforms than merchants do. Not “how fast is the storefront” but “how does change reach production, who approved it, and what happens when it goes wrong at 4pm on the last business day of the quarter.” Magento and Adobe Commerce answer that question well, and the answer is rarely written down in one place. This is that document, including the parts a Hyvä frontend changes.
The three phases, and why teams collapse them
Adobe Commerce Cloud formalizes what every self-hosted Magento team should also do: separate the pipeline into build, deploy, and post-deploy. In Adobe’s model, the build phase compiles code and prepares static files while the site stays up, the deploy phase puts the application in maintenance mode to install or upgrade and settle configuration, and post-deploy restores routing and warms caches.
The mistake that produces long maintenance windows is doing build work during deploy. Composer install, dependency injection compilation, Tailwind compilation, and static content generation are all build work. If they happen while the site is in maintenance mode, your outage is as long as your build. Move them left, and the deploy step becomes a small number of database and filesystem operations.
| Phase | What belongs here | Site status | Typical duration |
|---|---|---|---|
| Build | composer install, setup:di:compile, Tailwind compile, static content deploy, unit tests, static analysis |
Live, unaffected | 6 to 20 minutes |
| Deploy | setup:upgrade for schema and data, app:config:import, symlink switch, cache flush |
Maintenance mode, or brief | 30 seconds to 5 minutes |
| Post deploy | Cache warming, smoke tests, queue consumers restart, monitoring check | Live | 2 to 10 minutes |
The one item that resists this split is setup:upgrade, because schema and data patches touch the database and cannot run against a live application safely in every case. The practical rule: if a release has no schema or data patch, it should require no maintenance mode at all. Detect that in the pipeline rather than assuming it.
Where Hyvä changes the pipeline
A Hyvä frontend adds one genuinely new step and several sharp edges. The step is a Node build that compiles Tailwind into a single stylesheet, and it has to run before Magento’s static content deploy, because static content deploy is what copies the compiled CSS into pub/static.
From Hyvä’s production deployment documentation, the sequence is: run npm run build in the theme’s web/tailwind directory, which writes a minified web/css/styles.css, then run setup:static-content:deploy, then ship pub/static to the servers. The documentation is explicit that you should not install Node and build tooling on production, and that pipelines should use npm ci --ignore-scripts rather than npm install for reproducible builds and a smaller supply chain surface. Node 20 or newer is required for the compiler.
Practical pipeline notes that save teams a bad afternoon:
- Compile with
npm --prefix app/design/frontend/Vendor/theme/web/tailwind run buildfrom the Magento root so the step works the same in CI and locally. - Narrow static content deploy to what you actually ship. Restricting to the frontend area, your theme, and your locales, with parallel jobs, is the difference between a two minute and a twelve minute build.
- Cache
node_modulesand the Composer cache between runs, keyed on the lock files. Reproducibility comes fromnpm ciandcomposer.lock, not from a cold cache. - On Adobe Commerce Cloud, Node is not preinstalled and the build hook runs before Magento is fully initialized. Hyvä’s Adobe Commerce Cloud deployment guide covers declaring Node as a platform dependency in
.magento.app.yaml, running the Tailwind compile inside the build hook before static content deploy, and committing bothapp/etc/hyva-themes.jsonandapp/etc/config.php, since the former cannot be generated during a Cloud build. - If you are on Tailwind v4, check the Cloud
.gitignore. The default allow-list pattern can block the vendor paths that Tailwind’s@sourcedirective needs to read parent theme files, which produces a stylesheet that is missing classes rather than a build that fails loudly.
That last category, a build that succeeds while producing wrong output, is the one worth adding a test for. A simple check that the compiled styles.css exceeds a known byte floor catches most of it.
Configuration: version control is the source of truth
The single largest source of “it worked in staging” incidents in Magento is configuration set in the admin panel on one environment and never on another. The pipeline deployment model exists to fix this, and enterprise teams should adopt it strictly.
| Setting type | Source of truth | Mechanism |
|---|---|---|
| Websites, stores, store views, themes | app/etc/config.php, in git |
app:config:import during deploy |
| Module enable and disable state | app/etc/config.php, in git |
Committed, reviewed as code |
| Non-sensitive system configuration | app/etc/config.php, in git |
Locked, so the admin field is read only |
| Environment specific values, for example base URLs | Environment variables or env.php |
Set per environment, never in git |
| Secrets: API keys, payment credentials, ERP passwords | Secret manager or environment variables | Injected at deploy, rotated on a schedule, never in git |
| Merchandising: prices, CMS content, promotions | Database | Owned by the business, not the pipeline |
Two rules make this hold. Configuration that appears in config.php becomes read only in the admin, which is the behavior you want, because it converts a silent drift problem into a visible pull request. And nothing sensitive goes into config.php, because it is committed. When an architect asks how you prevent an operator from changing payment configuration in production without review, this table is the answer.
Zero downtime, honestly
Marketing calls it zero downtime. What is achievable is a release where the request path never sees a broken state, and that comes from three mechanics.
Immutable artifacts. The pipeline builds a release directory once, complete with vendor, generated code, and static content. Nothing is compiled on the target host. The same artifact promotes from staging to production, so what you tested is what runs.
Symlink switching. Deploy into a new directory, then move a symlink to point at it. The switch is atomic. Rollback is the same operation in reverse, which means your rollback path is exercised by every deploy rather than being a document nobody has tested.
Avoiding the database in the hot path. Releases without schema or data changes can skip setup:upgrade entirely and land with no maintenance mode. Detect this by comparing module versions and patch lists in the pipeline, and gate maintenance mode on the result. Static content generated during build and symlinked in avoids the other classic cause of a slow, visibly broken release.
Two related cautions. Do not use on-demand static content generation in production, because the first visitor to each page pays the compile cost. And warm the cache after the site is accepting traffic, not during the window, so warming competes with real users rather than delaying their access.
Environment topology and parity
Four environments is the usual enterprise answer, and each has a job:
| Environment | Purpose | Data | Who approves promotion |
|---|---|---|---|
| Local or dev | Feature work | Sanitized subset | Developer, via pull request |
| Integration or CI | Automated tests on every commit | Fixtures, no production data | Automatic on green |
| Staging or UAT | Business acceptance, integration testing against sandbox ERP and payment | Sanitized production clone, refreshed on a schedule | Product owner and merchant |
| Production | Revenue | Production | Change advisory or release manager |
Parity is what makes staging useful. Same Magento version, same PHP version, same search engine version, same extension set, same Hyvä version. A staging environment running different PHP than production does not test your release, it tests a different application. That principle is why version alignment work, such as the move to Magento 2.4.8 and PHP 8.4, belongs on the roadmap as its own project rather than riding along with a feature release.
Sanitize production data before it lands anywhere else. Customer names, emails, addresses, and order history in a staging database are a privacy exposure with no upside. Anonymize on restore, automatically, as part of the refresh job.
The audit evidence enterprise IT asks for
An architect signing off on an ecommerce platform needs to see specific artifacts. Build the pipeline so producing them is automatic rather than archaeological.
- Traceability. Every production release maps to a git commit, a build number, and a ticket. The running artifact reports its version at a health endpoint.
- Approval record. Branch protection with required reviews, plus a recorded approval for production promotion. The tool matters less than the fact that it cannot be bypassed.
- Immutability. The artifact deployed to production is byte identical to the one tested in staging, verified by checksum.
- Rollback proof. A documented and periodically rehearsed rollback, with the time it takes. “We would restore from backup” is not a rollback plan.
- Dependency inventory.
composer.lockand the npm lock file, retained per release, so a disclosed vulnerability can be answered with a version rather than an investigation. - Patch cadence. A defined window for security patches, separate from the feature release train, because a critical Magento patch cannot wait for the next quarterly release. What that covers in practice is set out in our breakdown of what a real Magento support and maintenance plan should include.
- Access control. Who can deploy, who can read secrets, who can change configuration in production, reviewed on a schedule.
- Evidence of testing. Automated test results attached to the build, plus the smoke test that runs post deploy against production.
If you are inheriting a Magento estate and do not know which of these exist, an inventory is the first project. The 47-point Magento technical audit checklist covers the code and infrastructure half of that assessment.
Release day checklist
- Build is green, including static analysis and unit tests, on the exact commit being released.
- Tailwind stylesheet compiled in CI, size checked against the expected floor.
- Static content built into the artifact, not generated on the host.
- Schema and data patch presence detected, maintenance mode gated on it.
- Configuration diff between the artifact and production reviewed, with no unexpected entries.
- Secrets injected from the secret store, not present in the artifact.
- Queue consumers and cron stopped before the switch, restarted after.
- Smoke test runs post deploy: homepage, category, product, add to cart, checkout to payment step, one API call.
- Monitoring watched for one hour: error rate, response time, order volume against the same weekday last week.
- Rollback command written down before the deploy starts, not after something breaks.
Frequently asked questions
Does a Hyvä frontend make Magento deployments harder?
It adds one build step, the Tailwind compile, and removes a category of problems, because the frontend is a compiled stylesheet plus small Alpine components rather than a RequireJS bundle assembled at runtime. Teams that already run a CI pipeline absorb it in an afternoon. Teams deploying by uploading files over SFTP will find the Node step forces a real pipeline, which is a benefit disguised as friction.
Can we deploy Magento without maintenance mode?
Yes, for releases with no schema or data patches, provided static content is built in the artifact and traffic switches by symlink. Releases that include setup:upgrade work need a window, though it is measured in seconds to a few minutes when the build work has already happened. Detect which kind of release you have in the pipeline rather than defaulting to a window every time.
Should configuration live in config.php or the admin panel?
Structural configuration belongs in config.php under version control, which makes the corresponding admin fields read only and turns configuration drift into a reviewable change. Environment specific values and every secret belong in environment variables or a secret manager. Merchandising content stays in the database where the business owns it.
How do we keep staging useful over time?
Refresh it from production on a schedule with automatic sanitization, keep platform versions identical to production, and point it at vendor sandbox accounts for payment and ERP rather than production endpoints. A staging environment that has drifted is worse than none, because it produces confident sign-offs on tests that did not represent production.
Getting this in place
Most Magento estates already have most of these pieces and no single owner for the whole path. Assembling them is usually a two to four week project, not a replatform, and it pays for itself the first time a bad release rolls back in ninety seconds.
We do this work as part of Magento and Adobe Commerce engagements and alongside Hyvä theme builds and migrations as the first US-based Hyvä partner. Where clients run more than one platform, we keep the same release discipline across Shopify and Shopify Plus, Shopware, and BigCommerce work, and our technology partner network covers the hosting, monitoring, and integration vendors that sit around the pipeline.
More on how our team operates, or start at Bemeir. We build it, you sell it.





