@vaharoni/devops 1.1.7 → 1.1.9

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 (59) hide show
  1. package/README.md +5 -1
  2. package/dist/cli/cloudrun.d.ts +11 -0
  3. package/dist/cli/cloudrun.d.ts.map +1 -0
  4. package/dist/cli/cloudrun.js +121 -0
  5. package/dist/cli/common.d.ts +10 -12
  6. package/dist/cli/common.d.ts.map +1 -1
  7. package/dist/cli/common.js +28 -22
  8. package/dist/cli/env.js +2 -2
  9. package/dist/cli/image.d.ts.map +1 -1
  10. package/dist/cli/image.js +16 -1
  11. package/dist/cli/prep-build.d.ts.map +1 -1
  12. package/dist/cli/prep-build.js +35 -6
  13. package/dist/cli/registry.d.ts.map +1 -1
  14. package/dist/cli/registry.js +15 -5
  15. package/dist/devops.js +3 -1
  16. package/dist/libs/cloudrun-helpers.d.ts +16 -0
  17. package/dist/libs/cloudrun-helpers.d.ts.map +1 -0
  18. package/dist/libs/cloudrun-helpers.js +79 -0
  19. package/dist/libs/config.d.ts +1 -0
  20. package/dist/libs/config.d.ts.map +1 -1
  21. package/dist/libs/config.js +4 -0
  22. package/dist/libs/digital-ocean/container-reg.d.ts +1 -1
  23. package/dist/libs/digital-ocean/container-reg.d.ts.map +1 -1
  24. package/dist/libs/digital-ocean/container-reg.js +7 -2
  25. package/dist/libs/k8s-constants.d.ts +1 -0
  26. package/dist/libs/k8s-constants.d.ts.map +1 -1
  27. package/dist/libs/k8s-constants.js +35 -10
  28. package/dist/libs/k8s-generate.d.ts +1 -1
  29. package/dist/libs/k8s-generate.d.ts.map +1 -1
  30. package/dist/libs/k8s-generate.js +15 -2
  31. package/dist/libs/k8s-secrets-manager.d.ts +2 -1
  32. package/dist/libs/k8s-secrets-manager.d.ts.map +1 -1
  33. package/dist/libs/k8s-secrets-manager.js +8 -5
  34. package/dist/types/index.d.ts +19 -8
  35. package/dist/types/index.d.ts.map +1 -1
  36. package/dist/types/index.js +3 -1
  37. package/package.json +1 -1
  38. package/src/cli/cloudrun.ts +133 -0
  39. package/src/cli/common.ts +46 -38
  40. package/src/cli/db.ts +1 -1
  41. package/src/cli/dml.ts +1 -1
  42. package/src/cli/env.ts +2 -2
  43. package/src/cli/exec.ts +1 -1
  44. package/src/cli/image.ts +15 -1
  45. package/src/cli/job.ts +1 -1
  46. package/src/cli/prep-build.ts +34 -6
  47. package/src/cli/redis.ts +1 -1
  48. package/src/cli/registry.ts +15 -5
  49. package/src/devops.ts +3 -1
  50. package/src/libs/cloudrun-helpers.ts +118 -0
  51. package/src/libs/config.ts +5 -0
  52. package/src/libs/digital-ocean/container-reg.ts +10 -2
  53. package/src/libs/k8s-constants.ts +36 -12
  54. package/src/libs/k8s-generate.ts +15 -2
  55. package/src/libs/k8s-secrets-manager.ts +9 -5
  56. package/src/target-templates/lang-variants-common/python/.devops/config/images.yaml +3 -1
  57. package/src/target-templates/lang-variants-common/typescript/.devops/docker-images/cloudrun.Dockerfile +31 -0
  58. package/src/target-templates/lang-variants-common/typescript/.github/actions/deploy-image@v1/action.yaml +4 -0
  59. package/src/types/index.ts +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"container-reg.d.ts","sourceRoot":"","sources":["../../../src/libs/digital-ocean/container-reg.ts"],"names":[],"mappings":"AA0DA,wBAAgB,KAAK;AACnB,2HAA2H;AAC3H,gBAAgB,EAAE,MAAM;AACxB,qDAAqD;AACrD,QAAQ,EAAE,MAAM,QAkBjB"}
1
+ {"version":3,"file":"container-reg.d.ts","sourceRoot":"","sources":["../../../src/libs/digital-ocean/container-reg.ts"],"names":[],"mappings":"AA0DA,wBAAgB,KAAK;AACnB,2HAA2H;AAC3H,gBAAgB,EAAE,MAAM;AACxB,qDAAqD;AACrD,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,QAyBd"}
@@ -1,6 +1,6 @@
1
1
  import { CommandExecutor } from "../../cli/common";
2
2
  import { z } from "zod";
3
- import { getConst } from "../config";
3
+ import { getConst, getImageData } from "../config";
4
4
  const repoTagMetadataSchema = z.object({
5
5
  // What we rely on
6
6
  tag: z.string().optional(),
@@ -50,12 +50,17 @@ export function prune(
50
50
  /** To keep the image-related constants simple, this accepts the full URL including the prefix registry.digitalocean.com */
51
51
  registryFullName,
52
52
  /** The name of the repository inside the registry */
53
- repoName) {
53
+ repoName, image) {
54
54
  const infra = getConst("infra");
55
55
  if (infra !== "digitalocean") {
56
56
  console.warn("Pruning is only supported for the DigitalOcean container registry");
57
57
  return;
58
58
  }
59
+ const imageData = getImageData(image);
60
+ if (imageData["cloudrun"]) {
61
+ console.warn("Pruning is skipped for cloudrun images");
62
+ return;
63
+ }
59
64
  const tags = getRepoTagMetadata(repoName);
60
65
  const versionsToKeep = Number(getConst("image-versions-to-keep"));
61
66
  if (!tags.length || tags.length <= versionsToKeep)
@@ -1,5 +1,6 @@
1
1
  export declare const MISSING_DOMAIN_KEY_ERROR = "$$$MISSING_DOMAIN_KEY$$$";
2
2
  export declare function allSupportedEnvs(): string[];
3
+ export declare function isLocalOrRemoteEnv(monorepoEnv: string): "local" | "remote";
3
4
  export declare function envToNamespace(monorepoEnv?: string): string;
4
5
  export declare function secretName(): string;
5
6
  export declare function imageDebugName(image: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"k8s-constants.d.ts","sourceRoot":"","sources":["../../src/libs/k8s-constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,wBAAwB,6BAA6B,CAAA;AAoBlE,wBAAgB,gBAAgB,aAE/B;AAYD,wBAAgB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,UAGlD;AAED,wBAAgB,UAAU,WAEzB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,UAE3C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,UAE3C;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,UAG5E;AAED,wBAAgB,qBAAqB,WAEpC;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,UAOf;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,UAIlE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,UAE9C"}
1
+ {"version":3,"file":"k8s-constants.d.ts","sourceRoot":"","sources":["../../src/libs/k8s-constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,wBAAwB,6BAA6B,CAAA;AAoBlE,wBAAgB,gBAAgB,aAE/B;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAI1E;AAqBD,wBAAgB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,UAGlD;AAED,wBAAgB,UAAU,WAEzB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,UAE3C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,UAE3C;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,UAG5E;AAED,wBAAgB,qBAAqB,WAEpC;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,UAgBf;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,UAIlE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,UAE9C"}
@@ -21,12 +21,27 @@ function localSupportedEnvs() {
21
21
  export function allSupportedEnvs() {
22
22
  return [...remoteSupportedEnvs(), ...localSupportedEnvs()];
23
23
  }
24
- function validateEnv(monorepoEnv) {
24
+ export function isLocalOrRemoteEnv(monorepoEnv) {
25
+ if (remoteSupportedEnvs().includes(monorepoEnv))
26
+ return "remote";
27
+ if (localSupportedEnvs().includes(monorepoEnv))
28
+ return "local";
29
+ throw new Error(`Unsupported environment: ${monorepoEnv}`);
30
+ }
31
+ function validateEnv(monorepoEnv, { allowLocal = false } = {}) {
25
32
  if (!monorepoEnv)
26
33
  throw new Error("MONOREPO_ENV cannot be empty");
27
- if (!remoteSupportedEnvs().includes(monorepoEnv)) {
28
- console.error(`MONOREPO_ENV must be one of: ${remoteSupportedEnvs().join(", ")}. Can be set using --env flag.`);
29
- process.exit(1);
34
+ if (allowLocal) {
35
+ if (!allSupportedEnvs().includes(monorepoEnv)) {
36
+ console.error(`MONOREPO_ENV must be one of: ${allSupportedEnvs().join(", ")}. Can be set using --env flag.`);
37
+ process.exit(1);
38
+ }
39
+ }
40
+ else {
41
+ if (!remoteSupportedEnvs().includes(monorepoEnv)) {
42
+ console.error(`MONOREPO_ENV must be one of: ${remoteSupportedEnvs().join(", ")}. Can be set using --env flag.`);
43
+ process.exit(1);
44
+ }
30
45
  }
31
46
  }
32
47
  export function envToNamespace(monorepoEnv) {
@@ -43,18 +58,28 @@ export function imageConfigMap(image) {
43
58
  return `image-config-${image}`;
44
59
  }
45
60
  export function containerRegistryImageName(image, monorepoEnv) {
46
- validateEnv(monorepoEnv);
61
+ validateEnv(monorepoEnv, { allowLocal: true });
47
62
  return `${getConst("project-name")}-${monorepoEnv}-${image}`;
48
63
  }
49
64
  export function containerRegistryPath() {
50
65
  return [getConst("registry-base-url"), getConst("registry-image-path-prefix", { ignoreIfInvalid: true })].filter(Boolean).join("/");
51
66
  }
52
67
  export function containerRegistryRepoPath(image, monorepoEnv, gitSha) {
53
- return [
54
- getConst("registry-base-url"),
55
- getConst("registry-image-path-prefix", { ignoreIfInvalid: true }),
56
- [containerRegistryImageName(image, monorepoEnv), gitSha].join(":"),
57
- ].filter(Boolean).join("/");
68
+ const imageNameAndTag = [containerRegistryImageName(image, monorepoEnv), gitSha].join(":");
69
+ const imageData = getImageData(image);
70
+ if (imageData["cloudrun"]) {
71
+ return [
72
+ getConst("cloudrun-artifact-registry-repo-path"),
73
+ imageNameAndTag,
74
+ ].join("/");
75
+ }
76
+ else {
77
+ return [
78
+ getConst("registry-base-url"),
79
+ getConst("registry-image-path-prefix", { ignoreIfInvalid: true }),
80
+ imageNameAndTag,
81
+ ].filter(Boolean).join("/");
82
+ }
58
83
  }
59
84
  export function domainNameForEnv(image, monorepoEnv) {
60
85
  const imageData = getImageData(image);
@@ -1,7 +1,7 @@
1
1
  import type { PackageData, TemplateDbMigrateObject, TemplateDebugObject, TemplateDeploymentObject, TemplateSharedContext } from "../types";
2
2
  export declare function generateImageDeployments(monorepoEnv: string, image: string, gitSha: string): string;
3
3
  export declare function generateWorkspaceDeployment(packageData: PackageData, monorepoEnv: string, image: string, gitSha: string): string;
4
- export declare function generateDebugDeployment(monorepoEnv: string, image: string, gitSha: string): string;
4
+ export declare function generateDebugDeployment(monorepoEnv: string, image: string, gitSha: string): string | undefined;
5
5
  export declare function generateDbMigrateJob(monorepoEnv: string, image: string, gitSha: string): string;
6
6
  export declare class ImageContextGenerator {
7
7
  monorepoEnv: string;
@@ -1 +1 @@
1
- {"version":3,"file":"k8s-generate.d.ts","sourceRoot":"","sources":["../../src/libs/k8s-generate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAqB3I,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,UAaf;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAMvH;AAED,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,UAOf;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,UAMf;AA6FD,qBAAa,qBAAqB;IAIb,WAAW,EAAE,MAAM;IAAS,KAAK,EAAE,MAAM;IAAS,MAAM,EAAE,MAAM;IAHnF,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,YAAY,EAAE,IAAI,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC;gBAEvC,WAAW,EAAE,MAAM,EAAS,KAAK,EAAE,MAAM,EAAS,MAAM,EAAE,MAAM;IAYnF,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,wBAAwB;IAmB7D,YAAY,IAAI,uBAAuB;IAOvC,QAAQ,IAAI,mBAAmB;CAMhC"}
1
+ {"version":3,"file":"k8s-generate.d.ts","sourceRoot":"","sources":["../../src/libs/k8s-generate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AA6B3I,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,UAcf;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAOvH;AAED,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,sBASf;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,UAOf;AA6FD,qBAAa,qBAAqB;IAIb,WAAW,EAAE,MAAM;IAAS,KAAK,EAAE,MAAM;IAAS,MAAM,EAAE,MAAM;IAHnF,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,YAAY,EAAE,IAAI,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC;gBAEvC,WAAW,EAAE,MAAM,EAAS,KAAK,EAAE,MAAM,EAAS,MAAM,EAAE,MAAM;IAYnF,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,wBAAwB;IAmB7D,YAAY,IAAI,uBAAuB;IAOvC,QAAQ,IAAI,mBAAmB;CAMhC"}
@@ -5,15 +5,23 @@ import path from "path";
5
5
  import yaml from "yaml";
6
6
  import fs from 'fs';
7
7
  import { globSync } from "glob";
8
- import _, { template } from 'lodash';
8
+ import _ from 'lodash';
9
9
  import Handlebars from "handlebars";
10
10
  import { getImageData } from "./config";
11
11
  import { getImageDescendentData } from "./discovery/images";
12
12
  const MANIFEST_FOLDER_PATH = path.join(process.cwd(), '.devops/manifests');
13
13
  const MANIFEST_INDEX_FILE_PATH = path.join(MANIFEST_FOLDER_PATH, '_index.yaml');
14
14
  const DB_MIGRATE_TEMPLATE_NAME = 'db-migrate';
15
+ function verifyNotCloudrunImage(image) {
16
+ const imageData = getImageData(image);
17
+ if (imageData["cloudrun"]) {
18
+ console.error(`Image ${image} is a cloudrun image. Cloudrun images are not supported for k8s generation`);
19
+ process.exit(1);
20
+ }
21
+ }
15
22
  // = Interface
16
23
  export function generateImageDeployments(monorepoEnv, image, gitSha) {
24
+ verifyNotCloudrunImage(image);
17
25
  const generator = new ImageContextGenerator(monorepoEnv, image, gitSha);
18
26
  const apps = getImageDescendentData(image)
19
27
  .filter((packageData) => packageData.deployment)
@@ -23,10 +31,11 @@ export function generateImageDeployments(monorepoEnv, image, gitSha) {
23
31
  return generateManifestForDeployment(projectData.rootPath, projectData.deployment.template, renderFn);
24
32
  });
25
33
  const debug = generateDebugDeployment(monorepoEnv, image, gitSha);
26
- const manifest = [debug, ...apps].join("\n---\n");
34
+ const manifest = [debug, ...apps].filter(Boolean).join("\n---\n");
27
35
  return ensureProperDomainsPresent(manifest, monorepoEnv, image);
28
36
  }
29
37
  export function generateWorkspaceDeployment(packageData, monorepoEnv, image, gitSha) {
38
+ verifyNotCloudrunImage(image);
30
39
  const generator = new ImageContextGenerator(monorepoEnv, image, gitSha);
31
40
  const context = generator.getDeployment(packageData);
32
41
  const renderFn = (template) => Handlebars.compile(template)(context);
@@ -34,13 +43,17 @@ export function generateWorkspaceDeployment(packageData, monorepoEnv, image, git
34
43
  return ensureProperDomainsPresent(manifest, monorepoEnv, image);
35
44
  }
36
45
  export function generateDebugDeployment(monorepoEnv, image, gitSha) {
46
+ verifyNotCloudrunImage(image);
37
47
  const generator = new ImageContextGenerator(monorepoEnv, image, gitSha);
38
48
  const context = generator.getDebug();
39
49
  const renderFn = (template) => Handlebars.compile(template)(context);
40
50
  const debugTemplate = getImageData(image)["debug-template"];
51
+ if (!debugTemplate)
52
+ return;
41
53
  return generateManifestsFromTemplateName(debugTemplate, renderFn).map(x => yaml.stringify(x)).join("\n---\n");
42
54
  }
43
55
  export function generateDbMigrateJob(monorepoEnv, image, gitSha) {
56
+ verifyNotCloudrunImage(image);
44
57
  const generator = new ImageContextGenerator(monorepoEnv, image, gitSha);
45
58
  const context = generator.getDbMigrate();
46
59
  const renderFn = (template) => Handlebars.compile(template)(context);
@@ -1,4 +1,5 @@
1
- export declare function getMonorepoSecret(monorepoEnv: string, keys?: string[]): string;
1
+ export declare function getMonorepoSecretObject(monorepoEnv: string, keys?: string[]): Record<string, string>;
2
+ export declare function getMonorepoSecretStr(monorepoEnv: string, keys?: string[]): string;
2
3
  /** E.g.: setMonorepoSecret('staging', ['KEY1=val1', 'KEY2=val2']) */
3
4
  export declare function setMonorepoSecret(monorepoEnv: string, pairs?: string[]): void;
4
5
  export declare function deleteMonorepoSecret(monorepoEnv: string, keys?: string[]): void;
@@ -1 +1 @@
1
- {"version":3,"file":"k8s-secrets-manager.d.ts","sourceRoot":"","sources":["../../src/libs/k8s-secrets-manager.ts"],"names":[],"mappings":"AA0DA,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,UAKzE;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAO,QAQ1E;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,QAE5E"}
1
+ {"version":3,"file":"k8s-secrets-manager.d.ts","sourceRoot":"","sources":["../../src/libs/k8s-secrets-manager.ts"],"names":[],"mappings":"AAkBA,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,0BAY/E;AA4BD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,UAS5E;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAO,QAQ1E;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,QAE5E"}
@@ -9,7 +9,7 @@ function execUpdateSecret(monorepoEnv, secretValue) {
9
9
  const { fullCommand, redactedCommand } = patchSecretKeyCommand(monorepoEnv, secretName(), SECRET_FILE_NAME, JSON.stringify(secretValue));
10
10
  new CommandExecutor(fullCommand, { quiet: true, redactedCommand }).exec();
11
11
  }
12
- function getSecret(monorepoEnv, keys = []) {
12
+ export function getMonorepoSecretObject(monorepoEnv, keys = []) {
13
13
  // Dots in jsonpath can only be accessed with a \ prefix
14
14
  const escapedSecretFileName = SECRET_FILE_NAME.replaceAll(".", "\\.");
15
15
  // prettier-ignore
@@ -28,7 +28,7 @@ function updateSecret(monorepoEnv, vars) {
28
28
  console.error("Keys-value pairs to set must be provided, e.g. KEY1=val1 KEY2=val2");
29
29
  process.exit(1);
30
30
  }
31
- const current = getSecret(monorepoEnv);
31
+ const current = getMonorepoSecretObject(monorepoEnv);
32
32
  const newVars = { ...current, ...vars };
33
33
  execUpdateSecret(monorepoEnv, newVars);
34
34
  }
@@ -37,13 +37,16 @@ function deleteSecretKeys(monorepoEnv, keys = []) {
37
37
  console.error("Keys to delete must be provided");
38
38
  process.exit(1);
39
39
  }
40
- const secretValue = getSecret(monorepoEnv);
40
+ const secretValue = getMonorepoSecretObject(monorepoEnv);
41
41
  keys.forEach((key) => delete secretValue[key]);
42
42
  execUpdateSecret(monorepoEnv, secretValue);
43
43
  }
44
44
  //= Interface (L3)
45
- export function getMonorepoSecret(monorepoEnv, keys = []) {
46
- const value = getSecret(monorepoEnv, keys);
45
+ export function getMonorepoSecretStr(monorepoEnv, keys = []) {
46
+ const value = getMonorepoSecretObject(monorepoEnv, keys);
47
+ if (Object.keys(value).length === 1) {
48
+ return Object.values(value)[0];
49
+ }
47
50
  return Object.entries(value)
48
51
  .map((pair) => pair.join("="))
49
52
  .join("\n");
@@ -7,6 +7,7 @@ export declare const constFileSchema: z.ZodObject<{
7
7
  "image-versions-to-keep": z.ZodOptional<z.ZodNumber>;
8
8
  "registry-base-url": z.ZodString;
9
9
  "registry-image-path-prefix": z.ZodOptional<z.ZodString>;
10
+ "cloudrun-artifact-registry-repo-path": z.ZodOptional<z.ZodString>;
10
11
  "extra-remote-environments": z.ZodArray<z.ZodString, "many">;
11
12
  "extra-local-environments": z.ZodArray<z.ZodString, "many">;
12
13
  }, "strip", z.ZodTypeAny, {
@@ -17,6 +18,7 @@ export declare const constFileSchema: z.ZodObject<{
17
18
  "extra-local-environments": string[];
18
19
  "image-versions-to-keep"?: number | undefined;
19
20
  "registry-image-path-prefix"?: string | undefined;
21
+ "cloudrun-artifact-registry-repo-path"?: string | undefined;
20
22
  }, {
21
23
  "project-name": string;
22
24
  infra: "hetzner" | "digitalocean" | "gcloud";
@@ -25,6 +27,7 @@ export declare const constFileSchema: z.ZodObject<{
25
27
  "extra-local-environments": string[];
26
28
  "image-versions-to-keep"?: number | undefined;
27
29
  "registry-image-path-prefix"?: string | undefined;
30
+ "cloudrun-artifact-registry-repo-path"?: string | undefined;
28
31
  }>;
29
32
  export type ConstFileSchema = z.infer<typeof constFileSchema>;
30
33
  declare const singleTemplateSchema: z.ZodObject<{
@@ -42,22 +45,25 @@ declare const singleImageSchema: z.ZodObject<{
42
45
  "image-template": z.ZodString;
43
46
  language: z.ZodEnum<["python", "node"]>;
44
47
  domains: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
45
- "debug-template": z.ZodString;
48
+ "debug-template": z.ZodOptional<z.ZodString>;
49
+ cloudrun: z.ZodOptional<z.ZodBoolean>;
46
50
  "can-db-migrate": z.ZodOptional<z.ZodBoolean>;
47
51
  applications: z.ZodArray<z.ZodString, "many">;
48
52
  }, "strip", z.ZodTypeAny, {
49
53
  "image-template": string;
50
54
  language: "python" | "node";
51
- "debug-template": string;
52
55
  applications: string[];
53
56
  domains?: Record<string, string> | undefined;
57
+ "debug-template"?: string | undefined;
58
+ cloudrun?: boolean | undefined;
54
59
  "can-db-migrate"?: boolean | undefined;
55
60
  }, {
56
61
  "image-template": string;
57
62
  language: "python" | "node";
58
- "debug-template": string;
59
63
  applications: string[];
60
64
  domains?: Record<string, string> | undefined;
65
+ "debug-template"?: string | undefined;
66
+ cloudrun?: boolean | undefined;
61
67
  "can-db-migrate"?: boolean | undefined;
62
68
  }>;
63
69
  export type SingleImageSchema = z.infer<typeof singleImageSchema>;
@@ -76,22 +82,25 @@ export declare const imageFileSchema: z.ZodObject<{
76
82
  "image-template": z.ZodString;
77
83
  language: z.ZodEnum<["python", "node"]>;
78
84
  domains: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
79
- "debug-template": z.ZodString;
85
+ "debug-template": z.ZodOptional<z.ZodString>;
86
+ cloudrun: z.ZodOptional<z.ZodBoolean>;
80
87
  "can-db-migrate": z.ZodOptional<z.ZodBoolean>;
81
88
  applications: z.ZodArray<z.ZodString, "many">;
82
89
  }, "strip", z.ZodTypeAny, {
83
90
  "image-template": string;
84
91
  language: "python" | "node";
85
- "debug-template": string;
86
92
  applications: string[];
87
93
  domains?: Record<string, string> | undefined;
94
+ "debug-template"?: string | undefined;
95
+ cloudrun?: boolean | undefined;
88
96
  "can-db-migrate"?: boolean | undefined;
89
97
  }, {
90
98
  "image-template": string;
91
99
  language: "python" | "node";
92
- "debug-template": string;
93
100
  applications: string[];
94
101
  domains?: Record<string, string> | undefined;
102
+ "debug-template"?: string | undefined;
103
+ cloudrun?: boolean | undefined;
95
104
  "can-db-migrate"?: boolean | undefined;
96
105
  }>>;
97
106
  }, "strip", z.ZodTypeAny, {
@@ -102,9 +111,10 @@ export declare const imageFileSchema: z.ZodObject<{
102
111
  images: Record<string, {
103
112
  "image-template": string;
104
113
  language: "python" | "node";
105
- "debug-template": string;
106
114
  applications: string[];
107
115
  domains?: Record<string, string> | undefined;
116
+ "debug-template"?: string | undefined;
117
+ cloudrun?: boolean | undefined;
108
118
  "can-db-migrate"?: boolean | undefined;
109
119
  }>;
110
120
  }, {
@@ -115,9 +125,10 @@ export declare const imageFileSchema: z.ZodObject<{
115
125
  images: Record<string, {
116
126
  "image-template": string;
117
127
  language: "python" | "node";
118
- "debug-template": string;
119
128
  applications: string[];
120
129
  domains?: Record<string, string> | undefined;
130
+ "debug-template"?: string | undefined;
131
+ cloudrun?: boolean | undefined;
121
132
  "can-db-migrate"?: boolean | undefined;
122
133
  }>;
123
134
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ export const constFileSchema = z.object({
7
7
  "image-versions-to-keep": z.number().optional(),
8
8
  "registry-base-url": z.string(),
9
9
  "registry-image-path-prefix": z.string().optional(),
10
+ "cloudrun-artifact-registry-repo-path": z.string().optional(),
10
11
  "extra-remote-environments": z.array(z.string()),
11
12
  "extra-local-environments": z.array(z.string()),
12
13
  });
@@ -18,7 +19,8 @@ const singleImageSchema = z.object({
18
19
  "image-template": z.string(),
19
20
  "language": z.enum(SUPPORTED_LANGUAGES),
20
21
  "domains": z.record(z.string()).optional(),
21
- "debug-template": z.string(),
22
+ "debug-template": z.string().optional(),
23
+ "cloudrun": z.boolean().optional(),
22
24
  "can-db-migrate": z.boolean().optional(),
23
25
  applications: z.array(z.string()),
24
26
  });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vaharoni/devops",
3
3
  "type": "module",
4
- "version": "1.1.7",
4
+ "version": "1.1.9",
5
5
  "description": "Devops utility",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -0,0 +1,133 @@
1
+ import { CLICommandParser, printUsageAndExit, StrongParams } from "./common";
2
+ import { buildDev, deploy } from "../libs/cloudrun-helpers";
3
+
4
+ const oneLiner =
5
+ "Supports cloudrun images";
6
+ const keyExamples = `
7
+ $ devops cloudrun deploy cloudrun-image SHA --env staging --region us-central1 [--forward-env ENV1,ENV2 --allow-unauthenticated]
8
+ $ devops cloudrun build-dev cloudrun-image
9
+ `.trim();
10
+
11
+ const usage = `
12
+ ${oneLiner}
13
+
14
+ USAGE
15
+ Configuration prerequisites:
16
+ - The image should be defined in images.yaml with:
17
+ cloudrun: true
18
+ - The artifact registry URL should be set in config/constants.yaml:
19
+ cloudrun-artifact-registry-repo-path: REGION-docker.pkg.dev/PROJECT_ID/REPO
20
+
21
+ Deploy a cloudrun image to Cloud Run:
22
+ devops cloudrun deploy <image> <sha> --env <env> --region <region> [options]
23
+
24
+ Options:
25
+ --forward-env ENV1,ENV2 Comma-separated env var names to forward into the service
26
+ --allow-unauthenticated Allow unauthenticated access
27
+ --cpu <cpu> CPU, e.g. 0.25, 0.5, 1
28
+ --memory <mem> Memory, e.g. 256Mi, 512Mi, 1Gi
29
+ --min-instances <n> Minimum instances
30
+ --max-instances <n> Maximum instances
31
+ --timeout <time> Request timeout, e.g. 60s
32
+ -- Pass through additional args to gcloud (e.g. -- --ingress internal)
33
+
34
+ Notes:
35
+ - The image must already be pushed to the artifact registry.
36
+ - <env> also supports local environments (e.g. development).
37
+ - For remote monorepo environments, variables specified in --forward-env that
38
+ are not present in the current process's env are fetched from the cluster.
39
+
40
+ Build a cloudrun image locally in development environment:
41
+ devops cloudrun build-dev cloudrun-image
42
+
43
+ This command builds the image locally with a random SHA and pushes it to the artifact registry.
44
+
45
+ EXAMPLES
46
+ ${keyExamples}
47
+ `;
48
+
49
+ const handlers = {
50
+ "build-dev": (opts: StrongParams) => {
51
+ buildDev(opts.required("image"));
52
+ },
53
+ _deploy: (opts: StrongParams) => {
54
+ const rawForwardEnv = opts.optional("forwardEnv");
55
+ const forwardEnv = rawForwardEnv
56
+ ? rawForwardEnv.split(",").map(v => v.trim()).filter(Boolean)
57
+ : [];
58
+ const minInstancesStr = opts.optional("minInstances");
59
+ const maxInstancesStr = opts.optional("maxInstances");
60
+
61
+ deploy({
62
+ image: opts.required("image"),
63
+ env: opts.required("env"),
64
+ sha: opts.required("sha"),
65
+ region: opts.required("region"),
66
+ forwardEnv,
67
+ allowUnauthenticated: opts.optional("allowUnauthenticated") === "true",
68
+ cpu: opts.optional("cpu"),
69
+ memory: opts.optional("memory"),
70
+ minInstances: minInstancesStr ? Number(minInstancesStr) : undefined,
71
+ maxInstances: maxInstancesStr ? Number(maxInstancesStr) : undefined,
72
+ timeout: opts.optional("timeout"),
73
+ extraArgs: opts.optional("extraArgs"),
74
+ });
75
+ },
76
+ } as const;
77
+
78
+ async function run(cmdObj: CLICommandParser) {
79
+ if (cmdObj.help || cmdObj.args.length === 0) printUsageAndExit(usage);
80
+ const parsed = cmdObj.parseOptions({
81
+ params: [
82
+ "--keep-last",
83
+ "--forward-env",
84
+ "--region",
85
+ "--cpu",
86
+ "--memory",
87
+ "--min-instances",
88
+ "--max-instances",
89
+ "--timeout",
90
+ "--sha",
91
+ ],
92
+ booleans: ["--allow-unauthenticated"],
93
+ passthroughArgs: true,
94
+ });
95
+ const [subcommand, image, sha] = parsed.args;
96
+
97
+ // Inject env variables as forwarding is needed
98
+ if (subcommand === "deploy") {
99
+ cmdObj.executorFromEnv(
100
+ `devops cloudrun _deploy ${cmdObj.args.slice(1).join(" ")}`,
101
+ { checkEnvYaml: false }
102
+ ).spawn();
103
+ return;
104
+ }
105
+
106
+ const handler = handlers[subcommand as keyof typeof handlers];
107
+ if (!handler) {
108
+ console.error(`Unknown subcommand: ${subcommand}`);
109
+ printUsageAndExit(usage);
110
+ }
111
+
112
+ const params = new StrongParams(usage, {
113
+ env: cmdObj.env,
114
+ subcommand,
115
+ image,
116
+ sha,
117
+ keepLast: parsed.options["--keep-last"],
118
+ forwardEnv: parsed.options["--forward-env"],
119
+ region: parsed.options["--region"],
120
+ allowUnauthenticated: parsed.options["--allow-unauthenticated"] ? "true" : undefined,
121
+ cpu: parsed.options["--cpu"],
122
+ memory: parsed.options["--memory"],
123
+ minInstances: parsed.options["--min-instances"],
124
+ maxInstances: parsed.options["--max-instances"],
125
+ timeout: parsed.options["--timeout"],
126
+ extraArgs: parsed.passthrough ? parsed.passthrough.join(" ") : undefined,
127
+ });
128
+ handler(params);
129
+ }
130
+
131
+ export default {
132
+ cloudrun: { oneLiner, keyExamples, run },
133
+ };