@catladder/pipeline 1.134.0 → 1.135.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.
Files changed (36) hide show
  1. package/dist/bundles/catladder-gitlab/index.js +2 -2
  2. package/dist/constants.js +1 -1
  3. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.d.ts +7 -0
  4. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.js +178 -0
  5. package/dist/deploy/cloudRun/createJobs/cloudRunServices.d.ts +4 -0
  6. package/dist/deploy/cloudRun/createJobs/cloudRunServices.js +54 -0
  7. package/dist/deploy/cloudRun/createJobs/common.d.ts +18 -0
  8. package/dist/deploy/cloudRun/createJobs/common.js +90 -0
  9. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.d.ts +2 -0
  10. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.js +56 -0
  11. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.d.ts +2 -0
  12. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.js +52 -0
  13. package/dist/deploy/cloudRun/createJobs/index.d.ts +3 -0
  14. package/dist/deploy/cloudRun/createJobs/index.js +43 -0
  15. package/dist/deploy/cloudRun/createJobs/variables.d.ts +5 -0
  16. package/dist/deploy/cloudRun/createJobs/variables.js +19 -0
  17. package/dist/deploy/cloudRun/index.js +2 -2
  18. package/dist/deploy/types/googleCloudRun.d.ts +9 -0
  19. package/dist/tsconfig.tsbuildinfo +1 -1
  20. package/examples/__snapshots__/cloud-run-post-stop-job.ts.snap +5 -5
  21. package/examples/__snapshots__/cloud-run-service-gen2.ts.snap +1839 -0
  22. package/examples/__snapshots__/cloud-run-with-sql.ts.snap +36 -36
  23. package/examples/cloud-run-service-gen2.ts +27 -0
  24. package/package.json +1 -1
  25. package/src/deploy/cloudRun/createJobs/cloudRunJobs.ts +182 -0
  26. package/src/deploy/cloudRun/createJobs/cloudRunServices.ts +74 -0
  27. package/src/deploy/cloudRun/createJobs/common.ts +59 -0
  28. package/src/deploy/cloudRun/createJobs/getCloudRunDeployScripts.ts +58 -0
  29. package/src/deploy/cloudRun/createJobs/getCloudRunStopScripts.ts +34 -0
  30. package/src/deploy/cloudRun/createJobs/index.ts +45 -0
  31. package/src/deploy/cloudRun/createJobs/variables.ts +21 -0
  32. package/src/deploy/cloudRun/index.ts +1 -1
  33. package/src/deploy/types/googleCloudRun.ts +11 -1
  34. package/dist/deploy/cloudRun/deployJob.d.ts +0 -3
  35. package/dist/deploy/cloudRun/deployJob.js +0 -261
  36. package/src/deploy/cloudRun/deployJob.ts +0 -318
@@ -0,0 +1,45 @@
1
+ import { merge } from "lodash";
2
+
3
+ import { getDockerJobBaseProps } from "../../../build/docker";
4
+ import { getRunnerImage } from "../../../runner";
5
+ import type { Context } from "../../../types/context";
6
+ import type { CatladderJob } from "../../../types/jobs";
7
+ import { allowFailureInScripts } from "../../../utils/gitlab";
8
+ import { createDeployementJobs } from "../../base";
9
+
10
+ import { isOfDeployType } from "../../types";
11
+ import { getDeployJobVariables } from "./variables";
12
+ import { getCloudRunDeployScripts } from "./getCloudRunDeployScripts";
13
+ import { getCloudRunStopScripts } from "./getCloudRunStopScripts";
14
+
15
+ export const createGoogleCloudRunDeployJobs = (
16
+ context: Context
17
+ ): CatladderJob[] => {
18
+ const deployConfig = context.componentConfig.deploy;
19
+ if (deployConfig === false) {
20
+ return [];
21
+ }
22
+ if (!isOfDeployType(deployConfig, "google-cloudrun")) {
23
+ // should not happen
24
+ throw new Error("deploy config is wrong");
25
+ }
26
+
27
+ const deployScripts = getCloudRunDeployScripts(context);
28
+ const stopScripts = getCloudRunStopScripts(context);
29
+
30
+ return createDeployementJobs(context, {
31
+ deploy: merge(getDockerJobBaseProps(context), {
32
+ artifacts: { paths: ["____envvars.yaml"] },
33
+ variables: getDeployJobVariables(context),
34
+ image: getRunnerImage("gcloud"),
35
+ script: deployScripts,
36
+ }),
37
+ stop: {
38
+ image: getRunnerImage("gcloud"),
39
+ variables: {
40
+ CLOUDSDK_CORE_DISABLE_PROMPTS: "1",
41
+ },
42
+ script: allowFailureInScripts(stopScripts),
43
+ },
44
+ });
45
+ };
@@ -0,0 +1,21 @@
1
+ import { dump } from "js-yaml";
2
+ import { omit } from "lodash";
3
+
4
+ import type { Context } from "../../../types/context";
5
+
6
+ import { GCLOUD_DEPLOY_CREDENTIALS_KEY } from "../../..";
7
+
8
+ export function getDeployJobVariables(context: Context) {
9
+ const allEnvVars = omit(
10
+ context.environment.envVars,
11
+ GCLOUD_DEPLOY_CREDENTIALS_KEY
12
+ );
13
+ return {
14
+ CLOUDSDK_CORE_DISABLE_PROMPTS: "1",
15
+ ENV_VARS: dump(allEnvVars, {
16
+ lineWidth: -1,
17
+ quotingType: "'",
18
+ forceQuotes: true,
19
+ }),
20
+ };
21
+ }
@@ -3,7 +3,7 @@ import { getSecretVarName } from "../../context";
3
3
  import type { EnvironmentContext } from "../../types/environmentContext";
4
4
  import { sanitizeForBashVariable } from "../../utils/gitlab";
5
5
  import { getFullDbName } from "../cloudSql/utils";
6
- import { createGoogleCloudRunDeployJobs } from "./deployJob";
6
+ import { createGoogleCloudRunDeployJobs } from "./createJobs";
7
7
  import { getCloudRunJobName } from "./utils/jobName";
8
8
 
9
9
  export const GCLOUD_DEPLOY_CREDENTIALS_KEY = "GCLOUD_DEPLOY_credentialsKey";
@@ -117,6 +117,16 @@ export type DeployConfigCloudRunService = {
117
117
  * memory limit. Defaults to 512MB
118
118
  */
119
119
  memory?: Memory;
120
+
121
+ /**
122
+ *
123
+ * set the execution environment.
124
+ *
125
+ * see https://cloud.google.com/run/docs/about-execution-environments
126
+ *
127
+ * defaults to gen1 according to gcloud
128
+ */
129
+ executionEnvironment?: "gen2" | "gen1";
120
130
  };
121
131
 
122
132
  export type DeployConfigCloudRunJobBase = {
@@ -187,7 +197,7 @@ export type DeployConfigCloudRun = {
187
197
  service?: boolean | DeployConfigCloudRunService;
188
198
 
189
199
  /**
190
- * deploy additional services with different entry points.
200
+ * deploy additional services with different entry points.
191
201
  */
192
202
  additionalServices?: {
193
203
  [name: string]: DeployConfigCloudRunService;
@@ -1,3 +0,0 @@
1
- import type { Context } from "../../types/context";
2
- import type { CatladderJob } from "../../types/jobs";
3
- export declare const createGoogleCloudRunDeployJobs: (context: Context) => CatladderJob[];
@@ -1,261 +0,0 @@
1
- "use strict";
2
-
3
- var __assign = this && this.__assign || function () {
4
- __assign = Object.assign || function (t) {
5
- for (var s, i = 1, n = arguments.length; i < n; i++) {
6
- s = arguments[i];
7
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- var __read = this && this.__read || function (o, n) {
14
- var m = typeof Symbol === "function" && o[Symbol.iterator];
15
- if (!m) return o;
16
- var i = m.call(o),
17
- r,
18
- ar = [],
19
- e;
20
- try {
21
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
22
- } catch (error) {
23
- e = {
24
- error: error
25
- };
26
- } finally {
27
- try {
28
- if (r && !r.done && (m = i["return"])) m.call(i);
29
- } finally {
30
- if (e) throw e.error;
31
- }
32
- }
33
- return ar;
34
- };
35
- var __spreadArray = this && this.__spreadArray || function (to, from, pack) {
36
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
37
- if (ar || !(i in from)) {
38
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
39
- ar[i] = from[i];
40
- }
41
- }
42
- return to.concat(ar || Array.prototype.slice.call(from));
43
- };
44
- exports.__esModule = true;
45
- exports.createGoogleCloudRunDeployJobs = void 0;
46
- var js_yaml_1 = require("js-yaml");
47
- var lodash_1 = require("lodash");
48
- var _1 = require(".");
49
- var docker_1 = require("../../build/docker");
50
- var getLabels_1 = require("../../context/getLabels");
51
- var runner_1 = require("../../runner");
52
- var gitlab_1 = require("../../utils/gitlab");
53
- var base_1 = require("../base");
54
- var sbom_1 = require("../sbom");
55
- var types_1 = require("../types");
56
- var createArgsString_1 = require("./utils/createArgsString");
57
- var database_1 = require("./utils/database");
58
- var gcloudServiceAccountLoginCommands_1 = require("./utils/gcloudServiceAccountLoginCommands");
59
- var jobName_1 = require("./utils/jobName");
60
- var artifactsRegistry_1 = require("./artifactsRegistry");
61
- var getServiceName_1 = require("./utils/getServiceName");
62
- var cleanup_1 = require("./cleanup");
63
- var setGoogleProjectNumberScript = function (deployConfig) {
64
- return ["export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe ".concat(deployConfig.projectId, " --format=\"value(projectNumber)\")"), "echo \"GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER\""];
65
- };
66
- var makeLabelString = function (obj) {
67
- return Object.entries(obj).map(function (_a) {
68
- var _b = __read(_a, 2),
69
- key = _b[0],
70
- value = _b[1];
71
- return "".concat(key, "=").concat(value);
72
- }).join(",");
73
- };
74
- var createGoogleCloudRunDeployJobs = function (context) {
75
- var _a, _b, _c;
76
- var deployConfig = context.componentConfig.deploy;
77
- if (deployConfig === false) {
78
- return [];
79
- }
80
- if (!(0, types_1.isOfDeployType)(deployConfig, "google-cloudrun")) {
81
- // should not happen
82
- throw new Error("deploy config is wrong");
83
- }
84
- var allEnvVars = (0, lodash_1.omit)(context.environment.envVars, _1.GCLOUD_DEPLOY_CREDENTIALS_KEY);
85
- var commonArgs = {
86
- project: deployConfig.projectId,
87
- region: deployConfig.region
88
- };
89
- var commonDeployArgs = __assign(__assign({
90
- image: (0, artifactsRegistry_1.getArtifactsRegistryImage)(context)
91
- }, commonArgs), {
92
- "set-cloudsql-instances": deployConfig.cloudSql ? deployConfig.cloudSql.instanceConnectionName : undefined
93
- });
94
- var serviceName = (0, getServiceName_1.getServiceName)(context);
95
- var getFullJobName = function (name) {
96
- return (0, jobName_1.getCloudRunJobName)(context.environment.fullName, name);
97
- };
98
- var jobsWithNames = Object.entries((_a = deployConfig.jobs) !== null && _a !== void 0 ? _a : {})
99
- // filter out disabled jobs
100
- .filter(function (entry) {
101
- return Boolean(entry[1]);
102
- }).map(function (_a) {
103
- var _b = __read(_a, 2),
104
- name = _b[0],
105
- job = _b[1];
106
- return {
107
- jobName: getFullJobName(name),
108
- job: job
109
- };
110
- });
111
- var jobsWithSchedule = jobsWithNames.filter(function (entry) {
112
- return entry.job.when === "schedule";
113
- }).map(function (_a) {
114
- var job = _a.job,
115
- jobName = _a.jobName;
116
- return {
117
- job: job,
118
- jobName: jobName,
119
- schedulerName: jobName + "-scheduler"
120
- };
121
- });
122
- var getServiceDeployScript = function (service, nameSuffix) {
123
- var _a, _b, _c, _d, _e;
124
- var customConfig = service !== true ? service : undefined;
125
- var command = service !== true ? (_a = service === null || service === void 0 ? void 0 : service.command) !== null && _a !== void 0 ? _a : context.componentConfig.build.startCommand : undefined;
126
- var commandArray = command ? Array.isArray(command) ? command : command.split(" ") : undefined;
127
- var fullServiceName = "".concat(serviceName).concat(nameSuffix !== null && nameSuffix !== void 0 ? nameSuffix : "");
128
- var argsString = (0, createArgsString_1.createArgsString)(__assign(__assign({
129
- // command as empty string resets it to default (uses the image's entrypoint)
130
- command: commandArray ? '"' + commandArray.join(",") + '"' : '""'
131
- }, commonDeployArgs), {
132
- labels: makeLabelString(__assign(__assign({}, (0, getLabels_1.getLabels)(context)), {
133
- "cloud-run-service-name": fullServiceName
134
- })),
135
- "env-vars-file": "____envvars.yaml",
136
- "min-instances": (_b = customConfig === null || customConfig === void 0 ? void 0 : customConfig.minInstances) !== null && _b !== void 0 ? _b : 0,
137
- "max-instances": (_c = customConfig === null || customConfig === void 0 ? void 0 : customConfig.maxInstances) !== null && _c !== void 0 ? _c : 100,
138
- "cpu-throttling": (customConfig === null || customConfig === void 0 ? void 0 : customConfig.noCpuThrottling) !== true,
139
- memory: customConfig === null || customConfig === void 0 ? void 0 : customConfig.memory,
140
- "allow-unauthenticated": (_d = customConfig === null || customConfig === void 0 ? void 0 : customConfig.allowUnauthenticated) !== null && _d !== void 0 ? _d : true,
141
- ingress: (_e = customConfig === null || customConfig === void 0 ? void 0 : customConfig.ingress) !== null && _e !== void 0 ? _e : "all",
142
- "cpu-boost": true
143
- }));
144
- return "gcloud run deploy ".concat(fullServiceName, " ").concat(argsString);
145
- };
146
- var getJobCreateScriptsForJob = function (jobName, job) {
147
- // due to some oversight from google, jobs create does not accept `--env-vars-file` 🤦
148
- // lucky, update on the other hand accepts it... so let's just imediatly update it
149
- // also we cannot upsert a job, so we have to create it and catch the error and then update
150
- var commandArray = Array.isArray(job.command) ? job.command : job.command.split(" ");
151
- var commonDeployArgsString = (0, createArgsString_1.createArgsString)(__assign(__assign({
152
- command: '"' + commandArray.join(",") + '"'
153
- }, commonDeployArgs), {
154
- labels: makeLabelString(__assign(__assign({}, (0, getLabels_1.getLabels)(context)), {
155
- "cloud-run-job-name": jobName
156
- })),
157
- image: job.image || commonDeployArgs.image,
158
- memory: job.memory || "512Mi",
159
- "task-timeout": job.timeout || "10m"
160
- }));
161
- var argsString = "".concat(jobName, " ").concat(commonDeployArgsString);
162
- return __spreadArray(__spreadArray([], __read((0, gitlab_1.allowFailureInScripts)(["gcloud beta run jobs create ".concat(argsString)])), false), ["gcloud beta run jobs update ".concat(argsString, " --env-vars-file=____envvars.yaml")], false);
163
- };
164
- var commonArgsString = (0, createArgsString_1.createArgsString)(commonArgs);
165
- var getJobCreateScripts = function () {
166
- return jobsWithNames.map(function (_a) {
167
- var job = _a.job,
168
- jobName = _a.jobName;
169
- return getJobCreateScriptsForJob(jobName, job);
170
- }).flat();
171
- };
172
- var getJobRunScriptForJob = function (jobName, wait) {
173
- return "gcloud beta run jobs execute ".concat(jobName, " ").concat(commonArgsString).concat(wait ? " --wait" : "");
174
- };
175
- var getJobRunScripts = function (when) {
176
- return jobsWithNames.filter(function (_a) {
177
- var job = _a.job;
178
- return job.when === when;
179
- }).map(function (_a) {
180
- var jobName = _a.jobName;
181
- return getJobRunScriptForJob(jobName,
182
- // wait for completin on stop jobs, since stop will delete the jobs afterwards, so they will fail
183
- ["preStop", "postStop"].includes(when));
184
- });
185
- };
186
- var getCreateScheduleScripts = function () {
187
- return jobsWithSchedule.map(function (_a) {
188
- var _b;
189
- var job = _a.job,
190
- jobName = _a.jobName,
191
- schedulerName = _a.schedulerName;
192
- var argsString = (0, createArgsString_1.createArgsString)({
193
- project: deployConfig.projectId,
194
- location: deployConfig.region,
195
- schedule: "\"".concat(job.schedule, "\""),
196
- "max-retry-attempts": (_b = job.maxRetryAttempts) !== null && _b !== void 0 ? _b : 0,
197
- uri: "\"https://".concat(deployConfig.region, "-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/").concat(deployConfig.projectId, "/jobs/").concat(jobName, ":run\""),
198
- "http-method": "POST",
199
- "oauth-service-account-email": "$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com"
200
- });
201
- var commonArgs = "http ".concat(schedulerName, " ").concat(argsString);
202
- return __spreadArray(__spreadArray([], __read((0, gitlab_1.allowFailureInScripts)(["gcloud scheduler jobs create ".concat(commonArgs)])), false), ["gcloud scheduler jobs update ".concat(commonArgs)], false);
203
- }).flat();
204
- };
205
- var getDeleteSchedulesScripts = function () {
206
- var argsString = (0, createArgsString_1.createArgsString)({
207
- project: deployConfig.projectId,
208
- location: deployConfig.region
209
- });
210
- return jobsWithSchedule.map(function (_a) {
211
- var schedulerName = _a.schedulerName;
212
- return ["gcloud scheduler jobs delete ".concat(schedulerName, " ").concat(argsString)];
213
- }).flat();
214
- };
215
- var getDeleteJobsScripts = function () {
216
- return jobsWithNames.flatMap(function (_a) {
217
- var jobName = _a.jobName;
218
- return [
219
- // first delete all job executions. Otherwise delete might fail if one of those is still running
220
- "gcloud beta run jobs executions list ".concat(commonArgsString, " --job ").concat(jobName, " --format=\"value(name)\" | xargs -I {} gcloud beta run jobs executions delete {} --quiet ").concat(commonArgsString), "gcloud beta run jobs delete ".concat(jobName, " ").concat(commonArgsString)];
221
- });
222
- };
223
- var deployScripts = __spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read((0, gitlab_1.collapseableSection)("prepare", "Prepare...")(__spreadArray(__spreadArray([], __read((0, gcloudServiceAccountLoginCommands_1.gcloudServiceAccountLoginCommands)(context)), false), __read(setGoogleProjectNumberScript(deployConfig)), false))), false), __read((0, gitlab_1.collapseableSection)("deploy", "Deploy to cloud run")(__spreadArray(__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
224
- : []), false), __read(getCreateScheduleScripts()), false), __read(getJobCreateScripts()), false), __read(getJobRunScripts("preDeploy")), false), __read(deployConfig.service !== false ? [getServiceDeployScript(deployConfig.service)] : []), false), __read(Object.entries((_b = deployConfig.additionalServices) !== null && _b !== void 0 ? _b : {}).map(function (_a) {
225
- var _b = __read(_a, 2),
226
- name = _b[0],
227
- service = _b[1];
228
- return getServiceDeployScript(service, "-" + name);
229
- })), false), __read(getJobRunScripts("postDeploy")), false))), false), __read((0, gitlab_1.collapseableSection)("cleanup", "Cleanup")((0, cleanup_1.getRemoveOldRevisionsAndImagesCommand)(context, "postDeploy") // we cleanup inactive images both on deploy and stop
230
- )), false), __read((0, sbom_1.getDependencyTrackUploadScript)(context)), false);
231
- var stopScripts = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read((0, gcloudServiceAccountLoginCommands_1.gcloudServiceAccountLoginCommands)(context)), false), __read(getJobRunScripts("preStop")), false), __read(deployConfig.service !== false ? ["gcloud run services delete ".concat(serviceName, " ").concat(commonArgsString)] : []), false), __read(Object.entries((_c = deployConfig.additionalServices) !== null && _c !== void 0 ? _c : {}).map(function (_a) {
232
- var _b = __read(_a, 1),
233
- name = _b[0];
234
- return "gcloud run services delete ".concat(serviceName, "-").concat(name, " ").concat(commonArgsString);
235
- })), false), __read(getJobRunScripts("postStop")), false), __read(getDeleteSchedulesScripts()), false), __read(getDeleteJobsScripts()), false), __read(deployConfig.cloudSql && deployConfig.cloudSql.deleteDatabaseOnStop ? (0, database_1.getDatabaseDeleteScript)(context, deployConfig) : []), false), __read((0, cleanup_1.getRemoveOldRevisionsAndImagesCommand)(context, "onStop")), false), __read((0, sbom_1.getDependencyTrackDeleteScript)(context)), false);
236
- return (0, base_1.createDeployementJobs)(context, {
237
- deploy: (0, lodash_1.merge)((0, docker_1.getDockerJobBaseProps)(context), {
238
- artifacts: {
239
- paths: ["____envvars.yaml"]
240
- },
241
- variables: {
242
- CLOUDSDK_CORE_DISABLE_PROMPTS: "1",
243
- ENV_VARS: (0, js_yaml_1.dump)(allEnvVars, {
244
- lineWidth: -1,
245
- quotingType: "'",
246
- forceQuotes: true
247
- })
248
- },
249
- image: (0, runner_1.getRunnerImage)("gcloud"),
250
- script: deployScripts
251
- }),
252
- stop: {
253
- image: (0, runner_1.getRunnerImage)("gcloud"),
254
- variables: {
255
- CLOUDSDK_CORE_DISABLE_PROMPTS: "1"
256
- },
257
- script: (0, gitlab_1.allowFailureInScripts)(stopScripts)
258
- }
259
- });
260
- };
261
- exports.createGoogleCloudRunDeployJobs = createGoogleCloudRunDeployJobs;