Deploying Your Code deploy-your-code

Learn how to deploy your code to Production using Cloud Manager pipelines in AEM as a Cloud Service.

Production pipeline diagram

Deploying code seamlessly to Stage and then through to Production is done via a Production pipeline. The Production pipeline execution is broken into two logical phases.

  1. Deployment to Stage environment
    • The code is built and deployed to the Stage environment for automated functional testing, UI testing, experience audit, and user acceptance testing (UAT).
  2. Deployment to Production environment
    • Once the build is validated on Stage, and approved for promotion to Production, the same build artifact is deployed to the Production environment.

Only the Full Stack Code pipeline type supports code scanning, function testing, UI testing, and experience audit.

Deploying Your Code with Cloud Manager in AEM as a Cloud Service deploying-code-with-cloud-manager

Once you have configured your production Pipeline including repository, environment, and testing environment, you are ready to deploy your code.

  1. Log into Cloud Manager at and select the appropriate organization.

  2. On the My Programs console, tap or click the program for which you want to deploy code.

  3. Click Deploy from the call-to-action on the Overview screen to start the deployment process.


  4. The Pipeline Execution screen displays. Click Build to start the process.

    Pipeline Execution screen

The build process deploys your code through three phases.

You can review the steps from various deployment processes by viewing logs, or reviewing results, for the testing criteria.

Stage Deployment Phase stage-deployment

The Stage Deployment phase. involves these steps.

  • Validation - This step ensures that the pipeline is configured to use the currently available resources. for example, testing that the configured branch exists and that the environments are available.
  • Build & Unit Testing - This step runs a containerized build process.
  • Code Scanning - This step evaluates the quality of your application code.
  • Build Images - This process is responsible for transforming the content and dispatcher packages produced by the build step into Docker images and Kubernetes configurations.
  • Deploy to Stage - The image is deployed to the staging environment in preparation for the Stage testing stage.

Stage Deployment

Stage Testing Phase stage-testing

The Stage testing phase involves these steps.

  • Product Functional Testing - Cloud Manager pipeline executes tests that run against the stage environment.

  • Custom Functional Testing - This step in the pipeline is always executed and cannot be skipped. If no test JAR is produced by the build, the test passes by default.

  • Custom UI Testing - This step is an optional feature that automatically run UI tests created for custom applications.

    • UI tests are Selenium-based tests packaged in a Docker image to allow a wide choice in language and frameworks (such as Java and Maven, Node and, or any other framework and technology built upon Selenium).
    • See Custom UI Testing for more details.
  • Experience Audit - This step in the pipeline is always executed and cannot be skipped. As a production pipeline is executed, an experience audit step is included after custom functional testing that will run the checks.

    • The pages that are configured are submitted to the service and evaluated.
    • The results are informational and show the scores and the change between the current and previous scores.
    • This insight is valuable to determine if there is a regression that is introduced with the current deployment.
    • See Understanding Experience Audit results for more details.

Stage Testing

Production Deployment Phase deployment-production

The process for deploying to production topologies differs slightly to minimize impact visitors to an AEM site.

Production deployments generally follow the same steps as previously described, but in a rolling manner.

  1. Deploy AEM packages to author.
  2. Detach dispatcher1 from the load balancer.
  3. Deploy AEM packages to publish1 and the dispatcher package to dispatcher1, flush dispatcher cache.
  4. Put dispatcher1 back into the load balancer.
  5. Once dispatcher1 is back in service, detach dispatcher2 from the load balancer.
  6. Deploy AEM packages to publish2 and the dispatcher package to dispatcher2, flush dispatcher cache.
  7. Put dispatcher2 back into the load balancer.

This process continues until the deployment has reached all publishers and dispatchers in the topology.

Production Deployment phase

Timeouts timeouts

The following steps will timeout if left waiting for user feedback:

Code Quality Testing
14 days
Security Testing
14 days
Performance Testing
14 days
Application for Approval
14 days
Schedule Production Deployment
14 days
CSE Support
14 days

Deployment Process deployment-process

All Cloud Service deployments follow a rolling process to ensure zero downtime. See How Rolling Deployments Work to learn more.

The Dispatcher cache is wiped out on each deployment. It is subsequently warmed up before the new publish nodes accept traffic.

Re-Executing a Production Deployment reexecute-deployment

In rare cases, production deployment steps may fail for transient reasons. In such cases, re-execution of the production deployment step is supported so long as the production deployment step has completed, regardless of the type of completion (for example, cancelled or unsuccessful). Re-execution creates a new execution using the same pipeline consisting of three steps.

  1. The validate step - This is essentially the same validation that occurs during a normal pipeline execution.
  2. The build step - In the context of a re-execution, the build step copies artifacts and does not actually execute a new build process.
  3. The production deployment step - This uses the same configuration and options as the production deployment step in a normal pipeline execution.

In such circumstances where a re-execution is possible, the production pipeline status page provides the Re-execute option next to the usual Download build log option.

The Re-execute option in the pipeline overview window

In a re-execution, the build step is labeled in the UI to reflect that it is copying artifacts, not re-building.

Limitations limitations

  • Re-executing the production deployment step will only be available for the last execution.
  • Re-execution is not available for push update executions.
    • If the last execution is a push update execution, re-execution is not possible.
  • If the last execution failed at any point prior to the production deployment step, re-execution is not possible.

Re-Execute API reexecute-API

In addition to being available in the UI, you can use the Cloud Manager API to trigger re-executions and identify executions that were triggered as re-executions.

Triggering a Re-Execution reexecute-deployment-api

To trigger a re-execution, make a PUT request to the HAL Link on the production deploy step state.

  • If this link is present, the execution can be restarted from that step.
  • If it is absent, the execution cannot be restarted from that step.

This link is only available for the production deploy step.

  "_links": {
    "": {
      "href": "/api/program/4/pipeline/1/execution/953671/phase/1575676/step/2983530/logs",
      "templated": false
    "": {
      "href": "/api/program/4/pipeline/1/execution?stepId=2983530",
      "templated": false
    "": {
      "href": "/api/program/4/pipeline/1/execution/953671/phase/1575676/step/2983530/metrics",
      "templated": false
    "self": {
      "href": "/api/program/4/pipeline/1/execution/953671/phase/1575676/step/2983530",
      "templated": false
  "id": "6187842",
  "stepId": "2983530",
  "phaseId": "1575676",
  "action": "deploy",
  "environment": "weretail-global-b75-prod",
  "environmentType": "prod",
  "environmentId": "59254",
  "startedAt": "2022-01-20T14:47:41.247+0000",
  "finishedAt": "2022-01-20T15:06:19.885+0000",
  "updatedAt": "2022-01-20T15:06:20.803+0000",
  "details": {
  "status": "FINISHED"

The syntax of the HAL link’s href value is only an example. The actual value should always be read from the HAL link and not generated.

Submitting a PUT request to this endpoint results in a 201 response if successful, and the response body is the representation of the new execution. This is similar to starting a regular execution through the API.

Identifying a Re-Executed Execution identify-reexecution

Re-executed executions can be identified by the value RE_EXECUTE in the trigger field.