docs

Flow Preview Environments

Easily create a first class PR preview environment experience within Flows

Overview

Preview environments are a powerful software testing pattern in which you create a near clone of a dev environment running a feature branch's code for the duration of a pull request. This has a few great benefits:

  1. Reduces churn in your dev environment, improving overall stability - a common failure point in large organizations with many in-flight changes
  2. Makes it easier to test code in isolation - the code only has the changes in your branch
  3. Reduces dev data corruption issues - if you implement database forking as part of the preview, making it easy to test things like schema migrations

This is extremely easy to implement with Plural for a few reasons:

  • GitOps patterns make it easy to redeploy and reconfigure services
  • Plural already natively implements the webhook and event system to track PR updates within its server
  • Plural already has a secure way of managing SCM credentials, so it can natively implement GitHub/GitLab comment feedback for an ideal DevEx around preview environments

Demo Video

If you want to see it in action, here's a quick YouTube video demo:

How to Implement

Implementing preview environments is quite simple. You only need to register one custom resource, a PreviewEnvironmentTemplate like the one below:

yaml
apiVersion: deployments.plural.sh/v1alpha1
kind: PreviewEnvironmentTemplate
metadata:
  name: test
spec:
  flowRef:
    kind: Flow
    name: flow-test

  referenceServiceRef:
    kind: ServiceDeployment
    name: flow-test-dev
    namespace: flow-test
  
  template:
    namespace: "flow-test-pr-{{ pr.number }}"
    name: "flow-test-pr-{{ pr.number }}"

    syncConfig:
      deleteNamespace: true # ensure the temp namespace is deleted on cleanup
      
    helm:
      values:
        image:
          tag: "sha-{{ commitSha | slice: 0, 7 }}"
        
        ingress:
          hosts:
            - host: flow-test-pr-{{ pr.number }}.your.domain # give a unique pr domain for the environment
              paths:
                - path: /
                  pathType: ImplementationSpecific
          tls:
            hosts:
              - flow-test-pr-{{ pr.number }}.your.domain # also ensure certs still work
            secretName: flow-test-pr-{{ pr.number }}-tls