Environment Substitution
The envsubst function replaces environment variable placeholders in strings.
Usage
typescript
import { envsubst } from "rhdh-e2e-test-utils/utils";Basic Substitution
typescript
// Simple variable
process.env.API_URL = "https://api.example.com";
const result = envsubst("URL: $API_URL");
// Result: "URL: https://api.example.com"
// With braces
const result2 = envsubst("URL: ${API_URL}");
// Result: "URL: https://api.example.com"Default Values
Use :- syntax for default values:
typescript
// If PORT is not set, use 8080
const result = envsubst("Port: ${PORT:-8080}");
// Result: "Port: 8080"
// If PORT is set
process.env.PORT = "3000";
const result2 = envsubst("Port: ${PORT:-8080}");
// Result: "Port: 3000"YAML Configuration
Common use case is processing YAML configuration files:
yaml
# config-template.yaml
app:
title: ${APP_TITLE:-My App}
baseUrl: https://${HOST}.${DOMAIN}
backend:
cors:
origin: ${CORS_ORIGIN:-*}typescript
import { envsubst } from "rhdh-e2e-test-utils/utils";
import * as fs from "fs";
const template = fs.readFileSync("config-template.yaml", "utf-8");
const config = envsubst(template);
fs.writeFileSync("config.yaml", config);Secrets Processing
The package uses envsubst internally for secrets:
yaml
# rhdh-secrets.yaml
apiVersion: v1
kind: Secret
metadata:
name: rhdh-secrets
type: Opaque
stringData:
GITHUB_TOKEN: ${GITHUB_TOKEN}
API_KEY: ${API_KEY:-default-key}When deployed, environment variables are substituted automatically.
If you are writing tests in the overlay repository, see Overlay Configuration Files for how secrets and substitution are applied in CI.
Complete Example
typescript
import { test } from "rhdh-e2e-test-utils/test";
import { envsubst } from "rhdh-e2e-test-utils/utils";
test.beforeAll(async ({ rhdh }) => {
// Set environment variables
process.env.CUSTOM_API_URL = "https://custom.example.com";
process.env.NAMESPACE = rhdh.deploymentConfig.namespace;
// Template with variables
const template = `
backend:
baseUrl: https://backstage-\${NAMESPACE}.\${K8S_CLUSTER_ROUTER_BASE}
custom:
apiUrl: \${CUSTOM_API_URL}
`;
// Substitute variables
const config = envsubst(template);
console.log(config);
await rhdh.configure({ auth: "keycloak" });
await rhdh.deploy();
});Supported Syntax
| Syntax | Description |
|---|---|
$VAR | Simple substitution |
${VAR} | Braced substitution |
${VAR:-default} | Default if unset or empty |