@catladder/pipeline 1.59.0 → 1.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/constants.js CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  exports.__esModule = true;
4
4
  exports.DOCKER_REGISTRY = exports.PIPELINE_IMAGE_TAG = void 0;
5
- exports.PIPELINE_IMAGE_TAG = "v1-59-0-e967002c" || "";
5
+ exports.PIPELINE_IMAGE_TAG = "v1-60-0-3b922c26" || "";
6
6
  exports.DOCKER_REGISTRY = "git.panter.ch:5001/catladder/catladder" || "";
@@ -56,10 +56,12 @@ var types_1 = require("../types");
56
56
 
57
57
  var gcloudServiceAccountLoginCommands_1 = require("./utils/gcloudServiceAccountLoginCommands");
58
58
 
59
+ var database_1 = require("./utils/database");
60
+
59
61
  var gitlab_1 = require("../../utils/gitlab");
60
62
 
61
63
  var createGoogleCloudRunDeployJobs = function (context) {
62
- var _a, _b;
64
+ var _a;
63
65
 
64
66
  var deployConfig = context.componentConfig.deploy;
65
67
 
@@ -88,7 +90,8 @@ var createGoogleCloudRunDeployJobs = function (context) {
88
90
  return "".concat(key, "=").concat(value);
89
91
  }).join(",");
90
92
  var commonArgs = "--project ".concat(deployConfig.projectId, " --region=").concat(deployConfig.region);
91
- var commonDeployArgs = "--image ".concat(gcloudImageName, " ").concat(commonArgs, " --labels ").concat(labelsString);
93
+ var cloudRunArgs = deployConfig.cloudSql ? "--set-cloudsql-instances=".concat(deployConfig.cloudSql.instanceConnectionName) : "";
94
+ var commonDeployArgs = "--image ".concat(gcloudImageName, " ").concat(commonArgs, " ").concat(cloudRunArgs, " --labels ").concat(labelsString);
92
95
  var serviceName = context.environment.fullName.toLowerCase();
93
96
 
94
97
  var getServiceDeployScript = function (service) {
@@ -103,7 +106,7 @@ var createGoogleCloudRunDeployJobs = function (context) {
103
106
  // due to some oversight from google, jobs create does not accept `--env-vars-file` 🤦
104
107
  // lucky, update on the other hand accepts it... so let's just imediatly update it
105
108
  // also we cannot upsert a job, so we have to create it and catch the error and then update
106
- var args = "".concat(jobName, " --command=\"").concat(job.command.split(" ").join(","), "\" ").concat(commonDeployArgs);
109
+ var args = "".concat(jobName, " --command=\"").concat(job.command.split(" ").join(","), "\" ").concat(commonDeployArgs, " --memory=").concat(job.memory || "512Mi");
107
110
  return __spreadArray(__spreadArray([], __read((0, gitlab_1.allowFailureInScripts)(["gcloud beta run jobs create ".concat(args)])), false), ["gcloud beta run jobs update ".concat(args, " --env-vars-file=____envvars.yaml")], false);
108
111
  };
109
112
 
@@ -112,10 +115,13 @@ var createGoogleCloudRunDeployJobs = function (context) {
112
115
  };
113
116
 
114
117
  var getFullJobName = function (name) {
115
- return context.environment.fullName.toLowerCase() + "-" + name;
118
+ return context.environment.fullName.toLowerCase() + "-" + name.toLowerCase();
116
119
  };
117
120
 
118
- var jobsWithNames = Object.entries((_a = deployConfig.jobs) !== null && _a !== void 0 ? _a : {}).map(function (_a) {
121
+ var jobsWithNames = Object.entries((_a = deployConfig.jobs) !== null && _a !== void 0 ? _a : {}) // filter out disabled jobs
122
+ .filter(function (entry) {
123
+ return Boolean(entry[1]);
124
+ }).map(function (_a) {
119
125
  var _b = __read(_a, 2),
120
126
  name = _b[0],
121
127
  job = _b[1];
@@ -123,7 +129,8 @@ var createGoogleCloudRunDeployJobs = function (context) {
123
129
  return [getFullJobName(name), job];
124
130
  });
125
131
 
126
- var cloudRunDeployScripts = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(["echo \"$ENV_VARS\" > ____envvars.yaml", "cat ____envvars.yaml"], __read(jobsWithNames.map(function (_a) {
132
+ var cloudRunDeployScripts = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(["echo \"$ENV_VARS\" > ____envvars.yaml"], __read(deployConfig.cloudSql ? (0, database_1.getDatabaseCreateScript)(context, deployConfig) // we create the db, so that we can also delete it afterwards
133
+ : []), false), __read(jobsWithNames.map(function (_a) {
127
134
  var _b = __read(_a, 2),
128
135
  name = _b[0],
129
136
  job = _b[1];
@@ -131,37 +138,32 @@ var createGoogleCloudRunDeployJobs = function (context) {
131
138
  return getJobCreateScripts(name, job);
132
139
  }).flat()), false), __read(jobsWithNames.filter(function (_a) {
133
140
  var _b = __read(_a, 2),
134
- name = _b[0],
135
141
  job = _b[1];
136
142
 
137
143
  return job.when === "preDeploy";
138
144
  }).map(function (_a) {
139
- var _b = __read(_a, 2),
140
- name = _b[0],
141
- job = _b[1];
145
+ var _b = __read(_a, 1),
146
+ name = _b[0];
142
147
 
143
148
  return getJobRunScript(name);
144
149
  })), false), __read(deployConfig.service !== false ? [getServiceDeployScript(deployConfig.service)] : []), false), __read(jobsWithNames.filter(function (_a) {
145
150
  var _b = __read(_a, 2),
146
- name = _b[0],
147
151
  job = _b[1];
148
152
 
149
153
  return job.when === "postDeploy";
150
154
  }).map(function (_a) {
151
- var _b = __read(_a, 2),
152
- name = _b[0],
153
- job = _b[1];
155
+ var _b = __read(_a, 1),
156
+ name = _b[0];
154
157
 
155
158
  return getJobRunScript(name);
156
159
  })), false), ["docker image rm ".concat(gcloudImageName)], false);
157
160
 
158
- var cloudRunStopScripts = __spreadArray(__spreadArray([], __read(deployConfig.service !== false ? ["gcloud run services delete ".concat(serviceName, " ").concat(commonArgs)] : []), false), __read(Object.entries((_b = deployConfig.jobs) !== null && _b !== void 0 ? _b : {}).map(function (_a) {
159
- var _b = __read(_a, 2),
160
- name = _b[0],
161
- job = _b[1];
161
+ var cloudRunStopScripts = __spreadArray(__spreadArray(__spreadArray([], __read(deployConfig.service !== false ? ["gcloud run services delete ".concat(serviceName, " ").concat(commonArgs)] : []), false), __read(jobsWithNames.map(function (_a) {
162
+ var _b = __read(_a, 1),
163
+ name = _b[0];
162
164
 
163
- return "gcloud beta run jobs delete ".concat(getJobRunScript(name), " ").concat(commonArgs);
164
- })), false);
165
+ return "gcloud beta run jobs delete ".concat(name, " ").concat(commonArgs);
166
+ })), false), __read(deployConfig.cloudSql && deployConfig.cloudSql.deleteDatabaseOnStop ? (0, database_1.getDatabaseDeleteScript)(context, deployConfig) : []), false);
165
167
 
166
168
  var baseStopJob = (0, base_1.getBaseDeploymentStopJob)(context);
167
169
  return [(0, lodash_1.merge)({}, baseDeploymentJob, (0, docker_1.getDockerJobBaseProps)(context), {
@@ -39,22 +39,69 @@ var __read = this && this.__read || function (o, n) {
39
39
  return ar;
40
40
  };
41
41
 
42
+ var __spreadArray = this && this.__spreadArray || function (to, from, pack) {
43
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
44
+ if (ar || !(i in from)) {
45
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
46
+ ar[i] = from[i];
47
+ }
48
+ }
49
+ return to.concat(ar || Array.prototype.slice.call(from));
50
+ };
51
+
42
52
  exports.__esModule = true;
43
53
  exports.GCLOUD_RUN_DEPLOY_TYPE = exports.GCLOUD_RUN_CANONICAL_HOST_SUFFIX = exports.GCLOUD_DEPLOY_CREDENTIALS_KEY = void 0;
44
54
 
45
55
  var context_1 = require("../../context");
46
56
 
57
+ var gitlab_1 = require("../../utils/gitlab");
58
+
47
59
  var deployJob_1 = require("./deployJob");
48
60
 
49
61
  exports.GCLOUD_DEPLOY_CREDENTIALS_KEY = "GCLOUD_DEPLOY_credentialsKey";
50
62
  exports.GCLOUD_RUN_CANONICAL_HOST_SUFFIX = "GCLOUD_RUN_canonicalHostSuffix";
63
+
64
+ var getCloudSqlVariables = function (_a) {
65
+ var _b;
66
+
67
+ var deployConfigRaw = _a.deployConfigRaw,
68
+ environmentSlug = _a.environmentSlug,
69
+ env = _a.env,
70
+ componentName = _a.componentName,
71
+ fullConfig = _a.fullConfig;
72
+
73
+ if (deployConfigRaw && deployConfigRaw.cloudSql) {
74
+ var DB_NAME = [(_b = deployConfigRaw.cloudSql.dbNamePrefix) !== null && _b !== void 0 ? _b : "".concat(fullConfig.customerName, "-").concat(fullConfig.appName), environmentSlug].filter(Boolean).join("-");
75
+ return {
76
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: deployConfigRaw.cloudSql.instanceConnectionName,
77
+ DB_NAME: DB_NAME,
78
+ DB_USER: "postgres",
79
+ DB_PASSWORD: "$" + (0, context_1.getSecretVarName)(env, componentName, "DB_PASSWORD"),
80
+ DATABASE_URL: "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
81
+ };
82
+ }
83
+
84
+ return {};
85
+ };
86
+
51
87
  exports.GCLOUD_RUN_DEPLOY_TYPE = {
52
88
  jobs: deployJob_1.createGoogleCloudRunDeployJobs,
53
- defaults: function () {
89
+ defaults: function (_a) {
90
+ var deployConfigRaw = _a.deployConfigRaw,
91
+ envType = _a.envType;
92
+
93
+ if (deployConfigRaw && deployConfigRaw.cloudSql) {
94
+ return {
95
+ cloudSql: {
96
+ deleteDatabaseOnStop: envType === "review"
97
+ }
98
+ };
99
+ }
100
+
54
101
  return {};
55
102
  },
56
- additionalSecretKeys: function () {
57
- return [exports.GCLOUD_DEPLOY_CREDENTIALS_KEY];
103
+ additionalSecretKeys: function (ctx) {
104
+ return __spreadArray([exports.GCLOUD_DEPLOY_CREDENTIALS_KEY], __read(ctx.deployConfigRaw && ctx.deployConfigRaw.cloudSql ? ["DB_PASSWORD"] : []), false);
58
105
  },
59
106
  getAdditionalEnvVars: function (ctx) {
60
107
  var fullName = ctx.fullName,
@@ -67,10 +114,10 @@ exports.GCLOUD_RUN_DEPLOY_TYPE = {
67
114
  name = _b[0],
68
115
  job = _b[1];
69
116
 
70
- return ["CLOUD_RUN_JOB_TRIGGER_URL_" + name, "https://".concat(deployConfigRaw.region, "-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/").concat(deployConfigRaw.projectId, "/jobs/").concat(name, ":run")];
117
+ return ["CLOUD_RUN_JOB_TRIGGER_URL_" + (0, gitlab_1.sanitizeForBashVariable)(name), "https://".concat(deployConfigRaw.region, "-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/").concat(deployConfigRaw.projectId, "/jobs/").concat(name, ":run")];
71
118
  })) : {};
72
- return __assign({
119
+ return __assign(__assign({
73
120
  HOST_CANONICAL: HOST_CANONICAL
74
- }, jobTriggers);
121
+ }, getCloudSqlVariables(ctx)), jobTriggers);
75
122
  }
76
123
  };
@@ -0,0 +1,4 @@
1
+ import type { Context } from "../../../types";
2
+ import type { DeployConfigCloudRun } from "../../types";
3
+ export declare const getDatabaseDeleteScript: (context: Context, deployConfig: DeployConfigCloudRun) => string[];
4
+ export declare const getDatabaseCreateScript: (context: Context, deployConfig: DeployConfigCloudRun) => string[];
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+
3
+ var __read = this && this.__read || function (o, n) {
4
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
5
+ if (!m) return o;
6
+ var i = m.call(o),
7
+ r,
8
+ ar = [],
9
+ e;
10
+
11
+ try {
12
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
13
+ } catch (error) {
14
+ e = {
15
+ error: error
16
+ };
17
+ } finally {
18
+ try {
19
+ if (r && !r.done && (m = i["return"])) m.call(i);
20
+ } finally {
21
+ if (e) throw e.error;
22
+ }
23
+ }
24
+
25
+ return ar;
26
+ };
27
+
28
+ exports.__esModule = true;
29
+ exports.getDatabaseCreateScript = exports.getDatabaseDeleteScript = void 0;
30
+
31
+ var gitlab_1 = require("../../../utils/gitlab");
32
+
33
+ var getDatabaseDeleteScript = function (context, deployConfig) {
34
+ var _a;
35
+
36
+ if (!deployConfig.cloudSql || !deployConfig.cloudSql.deleteDatabaseOnStop) {
37
+ throw new Error("not possible");
38
+ }
39
+
40
+ var DB_NAME = ((_a = context.environment.envVars) !== null && _a !== void 0 ? _a : {}).DB_NAME;
41
+
42
+ if (!DB_NAME) {
43
+ throw new Error("error: env vars did not specify DB_NAME");
44
+ }
45
+
46
+ var _b = __read(deployConfig.cloudSql.instanceConnectionName.split(":"), 3),
47
+ projectId = _b[0],
48
+ region = _b[1],
49
+ instanceId = _b[2]; // unfortunatly the database cannot be deleted right after the service has stopped, as it might still have connections
50
+ // we have to repeate this process
51
+
52
+
53
+ return ["echo \"deleting database ".concat(DB_NAME, "...\""), "echo \"\uD83D\uDC46 this can take multiple attemps (3-5min), because google cloud run may still have a connection to the database after the cloud run service is shut down\"", (0, gitlab_1.repeatOnFailure)("gcloud sql databases delete ".concat(DB_NAME, " --instance=").concat(instanceId, " --project ").concat(projectId), {
54
+ pauseInSeconds: 10
55
+ })];
56
+ };
57
+
58
+ exports.getDatabaseDeleteScript = getDatabaseDeleteScript;
59
+
60
+ var getDatabaseCreateScript = function (context, deployConfig) {
61
+ var _a;
62
+
63
+ if (!deployConfig.cloudSql) {
64
+ throw new Error("not possible");
65
+ }
66
+
67
+ var DB_NAME = ((_a = context.environment.envVars) !== null && _a !== void 0 ? _a : {}).DB_NAME;
68
+
69
+ if (!DB_NAME) {
70
+ throw new Error("error: env vars did not specify DB_NAME");
71
+ }
72
+
73
+ var _b = __read(deployConfig.cloudSql.instanceConnectionName.split(":"), 3),
74
+ projectId = _b[0],
75
+ region = _b[1],
76
+ instanceId = _b[2]; // may fail if it already exists
77
+
78
+
79
+ return (0, gitlab_1.allowFailureInScripts)(["echo \"ensuring Database...\"", "gcloud sql databases create ".concat(DB_NAME, " --instance=").concat(instanceId, " --project ").concat(projectId)]);
80
+ };
81
+
82
+ exports.getDatabaseCreateScript = getDatabaseCreateScript;
@@ -1,15 +1,16 @@
1
1
  import type { Context } from "../types/context";
2
2
  import type { EnvironmentContext } from "../types/environmentContext";
3
3
  import type { CatladderJob } from "../types/jobs";
4
+ import type { PartialDeep } from "../types/utils";
4
5
  import type { DeployConfigGeneric, DeployConfigType } from "./types";
5
6
  export * from "./cloudRun";
6
- export * from "./cloudSql";
7
+ export * from "./kubernetes/cloudSql";
7
8
  export * from "./kubernetes";
8
9
  export * from "./types";
9
10
  export * from "./utils";
10
11
  export declare type DeployTypeDefinition<T extends DeployConfigType> = {
11
12
  jobs: (context: Context) => CatladderJob[];
12
- defaults: (envContext: EnvironmentContext<any, T>) => Partial<DeployConfigGeneric<T>>;
13
+ defaults: (envContext: EnvironmentContext<any, T>) => PartialDeep<DeployConfigGeneric<T>>;
13
14
  additionalSecretKeys: (envContext: EnvironmentContext<any, T>) => string[];
14
15
  getAdditionalEnvVars: (envContext: EnvironmentContext<any, T>) => Record<string, string | undefined | null>;
15
16
  };
@@ -30,7 +30,7 @@ var kubernetes_1 = require("./kubernetes");
30
30
 
31
31
  __exportStar(require("./cloudRun"), exports);
32
32
 
33
- __exportStar(require("./cloudSql"), exports);
33
+ __exportStar(require("./kubernetes/cloudSql"), exports);
34
34
 
35
35
  __exportStar(require("./kubernetes"), exports);
36
36
 
@@ -0,0 +1,8 @@
1
+ import type { Context } from "../../../types";
2
+ export declare const hasKubernetesCloudSQL: (context: Context) => boolean | undefined;
3
+ export declare const getKubernetesCloudSQLConfig: (context: Context) => {
4
+ enabled: boolean;
5
+ instanceId?: string | undefined;
6
+ projectId?: string | undefined;
7
+ region?: string | undefined;
8
+ } | undefined;
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
 
3
3
  exports.__esModule = true;
4
- exports.getCloudSQLConfig = exports.hasCloudSQL = void 0;
4
+ exports.getKubernetesCloudSQLConfig = exports.hasKubernetesCloudSQL = void 0;
5
5
 
6
- var types_1 = require("../types");
6
+ var types_1 = require("../../types");
7
7
 
8
- var hasCloudSQL = function (context) {
8
+ var hasKubernetesCloudSQL = function (context) {
9
9
  var _a, _b;
10
10
 
11
11
  if ((0, types_1.isOfDeployType)(context.componentConfig.deploy, "kubernetes")) {
@@ -15,9 +15,9 @@ var hasCloudSQL = function (context) {
15
15
  return false;
16
16
  };
17
17
 
18
- exports.hasCloudSQL = hasCloudSQL;
18
+ exports.hasKubernetesCloudSQL = hasKubernetesCloudSQL;
19
19
 
20
- var getCloudSQLConfig = function (context) {
20
+ var getKubernetesCloudSQLConfig = function (context) {
21
21
  var _a;
22
22
 
23
23
  if ((0, types_1.isOfDeployType)(context.componentConfig.deploy, "kubernetes")) {
@@ -27,4 +27,4 @@ var getCloudSQLConfig = function (context) {
27
27
  throw new Error("cannot get cloud sql config");
28
28
  };
29
29
 
30
- exports.getCloudSQLConfig = getCloudSQLConfig;
30
+ exports.getKubernetesCloudSQLConfig = getKubernetesCloudSQLConfig;
@@ -18,7 +18,7 @@ var lodash_1 = require("lodash");
18
18
 
19
19
  var utils_1 = require("../../utils");
20
20
 
21
- var cloudSql_1 = require("../cloudSql");
21
+ var cloudSql_1 = require("./cloudSql");
22
22
 
23
23
  var types_1 = require("../types");
24
24
 
@@ -88,7 +88,7 @@ var createKubeValues = function (context) {
88
88
  var defaultKubeValues = (0, lodash_1.merge)({
89
89
  env: env,
90
90
  application: createAppConfig(context, application)
91
- }, (0, cloudSql_1.hasCloudSQL)(context) ? (0, cloudsql_1.createCloudsqlBaseConfig)(context) : {}, ((_b = (_a = deployConfig.values) === null || _a === void 0 ? void 0 : _a.mongodb) === null || _b === void 0 ? void 0 : _b.enabled) ? (0, mongodb_1.createMongodbBaseConfig)(context) : {});
91
+ }, (0, cloudSql_1.hasKubernetesCloudSQL)(context) ? (0, cloudsql_1.createCloudsqlBaseConfig)(context) : {}, ((_b = (_a = deployConfig.values) === null || _a === void 0 ? void 0 : _a.mongodb) === null || _b === void 0 ? void 0 : _b.enabled) ? (0, mongodb_1.createMongodbBaseConfig)(context) : {});
92
92
  var kubeValues = (0, processSecretsAsFiles_1.processSecretsAsFiles)((0, utils_1.mergeWithMergingArrays)(defaultKubeValues, rest));
93
93
  return kubeValues;
94
94
  };
@@ -1,5 +1,22 @@
1
1
  import type { DeployConfigBase } from "./base";
2
2
  export declare type Gcloudregion = "asia-east1" | "asia-northeast1" | "asia-northeast2" | "europe-north1" | "europe-southwest1" | "europe-west1" | "europe-west4" | "europe-west8" | "europe-west9" | "me-west1" | "us-central1" | "us-east1" | "us-east4" | "us-east5" | "us-south1" | "us-west1" | "asia-east2" | "asia-northeast3" | "asia-southeast1" | "asia-southeast2" | "asia-south1" | "asia-south2" | "australia-southeast1" | "australia-southeast2" | "europe-central2" | "europe-west2" | "europe-west3" | "europe-west6" | "northamerica-northeast1" | "northamerica-northeast2" | "southamerica-east1" | "southamerica-west1" | "us-west2" | "us-west3" | "us-west4";
3
+ export declare type DeployConfigCloudRunCloudSql = {
4
+ type: "unmanaged";
5
+ instanceConnectionName: string;
6
+ /**
7
+ * the prefix of the database, the full db name is this plus the environment slug
8
+ *
9
+ * defaults to customerName-appName
10
+ */
11
+
12
+ dbNamePrefix?: string | false;
13
+ /**
14
+ * whether to delete the database if the environment is stopped
15
+ * defaults to true for review envs, to false for every other environment
16
+ */
17
+
18
+ deleteDatabaseOnStop?: boolean;
19
+ };
3
20
  export declare type DeployConfigCloudRunService = {
4
21
  /**
5
22
  * command / entrypoint, fallsback to buildConfig.startcommand
@@ -12,6 +29,11 @@ export declare type DeployConfigCloudRunJob = {
12
29
  */
13
30
  command: string;
14
31
  when: "manual" | "preDeploy" | "postDeploy";
32
+ /**
33
+ * memory limit of the job, defaults to 51Mi
34
+ */
35
+
36
+ memory?: `${number}${"M" | "G" | "Mi" | "Gi"}`;
15
37
  };
16
38
  export declare type DeployConfigCloudRun = {
17
39
  /**
@@ -38,6 +60,11 @@ export declare type DeployConfigCloudRun = {
38
60
 
39
61
  service?: boolean | DeployConfigCloudRunService;
40
62
  jobs?: {
41
- [name: string]: DeployConfigCloudRunJob;
63
+ [name: string]: DeployConfigCloudRunJob | false | null;
42
64
  };
65
+ /**
66
+ * add cloudSql
67
+ */
68
+
69
+ cloudSql?: DeployConfigCloudRunCloudSql | false;
43
70
  } & DeployConfigBase;