@catladder/pipeline
Version:
Panter workflow for cloud CI/CD and DevOps
323 lines • 8.8 kB
TypeScript
import type { AllowUnknownProps, DeployConfigBase } from "./base";
export type DeployConfigKubernetesClusterGCloud = {
type: "gcloud";
/**
* gcoud name of the cluster
*/
name: string;
/**
* google cloud project id
*/
projectId: string;
/**
* region
*/
region: string;
/**
* domain of the cluster, for canonical domains without custom host (e.g. review and dev apps)
*/
domainCanonical?: string;
};
export type DeployConfigKubernetesCluster = DeployConfigKubernetesClusterGCloud;
export type KubernetesAutoscaleMetricResourceTarget = {
type: "Utilization";
averageUtilization: number;
} | {
type: "AverageValue";
averageValue: number | string;
};
export type KubernetesAutoscaleMetric = {
type: "Resource";
resource: {
name: "cpu" | "memory";
target: KubernetesAutoscaleMetricResourceTarget;
};
};
export type KubernetesAutoscale = {
minReplicas: number;
maxReplicas: number;
/**
* declare a number of metrics (at least one). Usually you would use cpu as a metric
*/
metrics: KubernetesAutoscaleMetric[];
};
export type KubernetesResourcesDef = {
limits?: {
cpu?: string;
memory?: string;
};
requests?: {
cpu?: string;
memory?: string;
};
};
type KubernetesHealthDef = {
httpGet?: {
path?: string;
port?: number;
httpHeaders?: {
name: string;
value: string;
}[];
failureThreshold?: number;
timeoutSeconds?: number;
periodSeconds?: number;
successThreshold?: number;
};
};
export type KubernetesUpdateStrategy = {
rollingUpdate: {
/**
* how many pods can be created additionally to the target number
* can be absolute number or percentage.
* defaults to 1 (kube default is 25%)
*/
maxSurge: number | string;
/**
* how many pods are allowed to be unavailable
* can be absolute number or percentage
* defaults to 0 (kube default is 25%)
*/
maxUnavailable: number | string;
};
type: "RollingUpdate";
};
export type KubernetesWorkerDef = {
enabled: boolean;
/**
* which command to run. defaults to `yarn start`
*/
command?: string;
resources?: KubernetesResourcesDef;
service?: {
enabled?: boolean;
};
/**
* if the same livenessProbe as the application should be used, defaults to `true`
*/
livenessProbe?: boolean;
};
type KubernetesTolerationExists = {
operator: "Exists";
};
type KubernetesTolerationEqual = {
operator: "Equal";
value: string;
};
export type KubernetesToleration = {
key: string;
effect: "NoSchedule" | "PreferNoSchedule" | "NoExecute";
} & (KubernetesTolerationEqual | KubernetesTolerationExists);
export type DeployConfigMongodbBase = {
enabled?: boolean;
dbName?: string;
persistence?: {
/**
* set premium-rwo for ssd
*/
storageClass?: "standard-rwo" | "premium-rwo";
/**
* size of the volume, defaults to 8Gi
*/
size?: string;
};
resources?: KubernetesResourcesDef;
tolerations?: KubernetesToleration[];
};
export type KubernetesRedirect = {
/**
* the domain to redirect from
*/
host: string;
/**
* optional path to redirect from, defaults to `/`
*/
path?: string;
/**
* optional nginx config snippet, defaults to a 301 redirect to the environment host name name with the request path appended
*
* important: to get a literal `$` use `$$` to prevent variable expansion by gitlab
* see https://docs.gitlab.com/ee/ci/variables/#use-the--character-in-cicd-variables
*/
rule?: string;
};
export type DeployConfigMongodbStandalone = {
architecture: "standalone";
};
export type DeployConfigMongodbReplicaset = {
architecture: "replicaset";
/**
* defaults to 2
*/
replicaCount?: number;
};
export type DeployConfigMongodb = DeployConfigMongodbBase & (DeployConfigMongodbStandalone | DeployConfigMongodbReplicaset);
export type DeployConfigKubernetesValuesCloudSQLUnmanaged = {
enabled: boolean;
instanceConnectionName: string;
/**
* the recommended type for the config.
*
* this mode is similar to cloudrun and declares fully-qualified db names including env.
*
* This makes it easier to share db instances across envs and dbs
*/
type: "unmanaged";
/**
* the database username, defaults to "postgres"
*/
dbUser?: string;
/**
* the prefix of the database, the full db name is this plus the environment slug prefix plus the componentName
*
* defaults to customerName-appName
*/
dbNamePrefix?: string | false;
/**
* the base name of the db, defaults to the componentName
*/
dbBaseName?: string;
};
export type DeployConfigKubernetesValuesCloudSQL = DeployConfigKubernetesValuesCloudSQLUnmanaged;
export type DeployConfigKubernetesValues = AllowUnknownProps<{
/**
* enable cloudsql db. Currently you have to manually set it up
*/
cloudsql?: DeployConfigKubernetesValuesCloudSQL;
/**
* enable mongodb. The mongodb is deployed using a helm chart.
* See https://github.com/bitnami/charts/tree/master/bitnami/mongodb
*/
mongodb?: DeployConfigMongodb;
/**
* enable mailhog. Mailhog is a virtual mail server that catches all outgoing mailsl and show them in a mailbox.
* This is great for development as it prevents to accidentially send out real emails and helps with debugging outgoing mails.
*
* It will automaticaly inject a MAIL_URL env var.
*
* Turn it of for production.
*/
mailhog?: {
enabled: boolean;
};
/**
* post-install/upgrade jobs. These use the app image and have all env vars available.
* Typically used for migrations and seeds
*/
jobs?: Record<string, false | AllowUnknownProps<{
/**
* the command to execute
*/
command: string;
/**
* comma-separated list of helm hooks, see https://helm.sh/docs/topics/charts_hooks/
*
* defaults to post-install,post-upgrade
*/
hook?: string;
}>>;
/**
* cronjobs that run periodically. These use the app image have all env vars available.
*/
cronjobs?: Record<string, false | AllowUnknownProps<{
schedule: string;
command: string;
concurrencyPolicy?: "Forbid" | "Allow" | "Replace";
timeZone?: string;
}>>;
/**
* configuration for the application ("Deployment" in kubernetes)
*/
application?: false | AllowUnknownProps<{
/**
* command to start, defaults to build's startCommand
*/
command?: string;
/**
* enable, disable app deployment, defaults to true
*/
enabled?: boolean;
/**
* redirects
*/
redirects?: KubernetesRedirect[];
/**
* Host aliases
*/
hostAliases?: string[];
/**
* how many pods will be started
*/
replicas?: number;
/**
* autoscale the pods horizontally
*/
autoscale?: KubernetesAutoscale;
/**
* the update strategy, see https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#rolling-update-deployment
*/
updateStrategy?: KubernetesUpdateStrategy;
/**
* kubernetes resources
*/
resources?: KubernetesResourcesDef;
healthRoute?: string;
startupProbe?: KubernetesHealthDef;
readinessProbe?: KubernetesHealthDef;
livenessProbe?: KubernetesHealthDef;
/**
* specify a worker. A worker is a separate deployment that runs continously in the background.
* The worker pod can use the same entry point as the app or a different one (specify command).
* It has the same environment variables as the application and an additional IS_WORKER="true" variable
*/
worker?: KubernetesWorkerDef;
/**
* kubernetes resources for jobs and cronjobs
*/
jobDefaults?: {
resources: KubernetesResourcesDef;
};
}>;
/**
* load secrets from other components.
* Use this only in cases where the secret is not known on pipeline-time
* and only if the component is also in the same cluster.
*
* a typical case is reusing mongo_url from other component
*
* also make sure that the other component deploys first
*
* in all other cases use normal env var handling
*/
secretsFromOtherComponent?: {
[envVar: string]: string;
};
/**
* map another services internal endpoint into a env var.
*/
mapServiceUrlToEnv?: {
[envVar: string]: string;
};
}>;
export type DeployConfigKubernetes = {
type: "kubernetes";
/**
* cluster config to use.
*/
cluster: DeployConfigKubernetesCluster;
/**
* prints out debug info (helm --debug)
*/
debug?: boolean;
additionalHelmArgs?: string[];
/**
* values to configure the app
*/
values?: DeployConfigKubernetesValues;
/**
* Custom Helm chart location.
* Not recommended to use.
*/
chartName?: string;
} & DeployConfigBase;
export {};