Skip to main content

Merge Request Preview Environments

This guide explains how to use MR (Merge Request) preview environments to share and review documentation changes before merging to production.

Overview

When you create a merge request, GitLab CI automatically builds and deploys a preview version of the documentation site. This preview:

  • Uses the same S3 bucket as production but in a separate subdirectory
  • Has a unique URL based on the MR ID: https://docs.mambu.com/mr-{ID}/
  • Automatically updates when you push new commits to the MR
  • Is automatically cleaned up when the MR is merged or closed
  • Keeps all internal links working within the preview environment

How to Use MR Previews

1. Create a Merge Request

Create your MR as usual through GitLab. The CI pipeline will automatically:

  1. Build the documentation with a special base URL
  2. Deploy to s3://docs-mambu-prod/mr-{ID}/
  3. Create a GitLab environment with the preview URL

2. Access the Preview

Once the deploy_s3_review job completes:

  1. Go to your MR page in GitLab
  2. Look for the Environments section or click the View app button
  3. The preview URL will be: https://docs.mambu.com/mr-{ID}/

Example: MR #251 → https://docs.mambu.com/mr-251/

3. Share for Review

Share the preview URL with stakeholders for review. All internal links will work correctly within the preview environment.

Clean URLs work: You can share URLs with or without .html extensions:

  • https://docs.mambu.com/mr-251/docs/navigating-in-mambu/
  • https://docs.mambu.com/mr-251/docs/navigating-in-mambu.html

Both formats work thanks to CloudFront URL rewriting.

4. Update the Preview

Push new commits to your MR branch, and the pipeline will automatically rebuild and redeploy the preview.

5. Cleanup

The preview environment is automatically deleted when:

  • The MR is merged
  • The MR is closed

You can also manually stop the environment from:

  • GitLab → Deployments → Environments → Click the stop button for your review environment

How It Works

Build Process

When building for an MR preview, the CI pipeline:

  1. Detects CI_MERGE_REQUEST_IID environment variable
  2. Sets baseUrl to /mr-{ID}/ in docusaurus.config.ts
  3. Builds the site with all internal links prefixed with /mr-{ID}/
  4. Deploys to the S3 subdirectory

Relevant code in docusaurus.config.ts:

const isReviewBuild = process.env.CI_MERGE_REQUEST_IID !== undefined;
const baseUrl = isReviewBuild ? `/mr-${process.env.CI_MERGE_REQUEST_IID}/` : '/';

URL Rewriting

A CloudFront Function handles URL rewriting to support clean URLs:

  • /mr-251/docs/guide//mr-251/docs/guide/index.html
  • /mr-251/docs/intro/mr-251/docs/intro.html

This is configured in infrastructure/cloudfront/url-rewrite-function.js and associated with the CloudFront distribution.

Environment Lifecycle

GitLab CI uses dynamic environments with auto-stop:

deploy_s3_review:
environment:
name: review/mr-$CI_MERGE_REQUEST_IID
url: https://docs.mambu.com/mr-$CI_MERGE_REQUEST_IID/
on_stop: stop_s3_review

When the MR is closed/merged, GitLab automatically triggers stop_s3_review which deletes the S3 files.

Limitations

  • No Security: MR previews are publicly accessible. Sensitive WIP content should not be pushed to MR branches.
    • Note: Security can be added via CloudFront Functions to restrict to VPN/Netskope. See infrastructure/cloudfront/ for implementation.
  • No CloudFront Invalidation: Changes may take up to 5 minutes to appear due to cache (cache-control is set to max-age=300)
  • S3 Costs: Each preview uses S3 storage. With auto-cleanup, costs are minimal.

Troubleshooting

Preview URL returns 404

Check deployment status:

# Check if files were deployed
aws s3 ls s3://docs-mambu-prod/mr-{ID}/ --recursive

Check CloudFront Function:

  • Ensure docs-mambu-url-rewrite function is deployed and associated with the distribution

This means the baseUrl wasn't set correctly during build:

  1. Check the build logs for: Building for MR preview with baseUrl: /mr-{ID}/
  2. Verify CI_MERGE_REQUEST_IID is available in the pipeline
  3. Rebuild the MR pipeline

Preview not cleaned up after merge

Check the stop_s3_review job:

  1. Go to GitLab → Deployments → Environments
  2. Find the review/mr-{ID} environment
  3. Manually click the stop button

If it fails, manually delete from S3:

aws s3 rm s3://docs-mambu-prod/mr-{ID}/ --recursive
  • .gitlab-ci.yml - CI/CD pipeline configuration
  • docusaurus.config.ts - Dynamic baseUrl configuration
  • infrastructure/cloudfront/url-rewrite-function.js - CloudFront URL rewriting
  • infrastructure/cloudfront/SETUP.md - CloudFront Function setup instructions

Cost Estimate

For typical usage (5-10 active MRs at a time):

  • S3 Storage: ~$0.50/month (assuming 100MB per preview × 10 MRs)
  • S3 Requests: ~$0.10/month
  • CloudFront Functions: ~$0.50/month (for URL rewriting)
  • Total: < $2/month

Costs are minimal since previews are automatically cleaned up.