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:
- Reduces churn in your dev environment, improving overall stability - a common failure point in large organizations with many in-flight changes
- Makes it easier to test code in isolation - the code only has the changes in your branch
- 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