@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.
- package/README.md +5 -1
- package/dist/cli/cloudrun.d.ts +11 -0
- package/dist/cli/cloudrun.d.ts.map +1 -0
- package/dist/cli/cloudrun.js +121 -0
- package/dist/cli/common.d.ts +10 -12
- package/dist/cli/common.d.ts.map +1 -1
- package/dist/cli/common.js +28 -22
- package/dist/cli/env.js +2 -2
- package/dist/cli/image.d.ts.map +1 -1
- package/dist/cli/image.js +16 -1
- package/dist/cli/prep-build.d.ts.map +1 -1
- package/dist/cli/prep-build.js +35 -6
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/registry.js +15 -5
- package/dist/devops.js +3 -1
- package/dist/libs/cloudrun-helpers.d.ts +16 -0
- package/dist/libs/cloudrun-helpers.d.ts.map +1 -0
- package/dist/libs/cloudrun-helpers.js +79 -0
- package/dist/libs/config.d.ts +1 -0
- package/dist/libs/config.d.ts.map +1 -1
- package/dist/libs/config.js +4 -0
- package/dist/libs/digital-ocean/container-reg.d.ts +1 -1
- package/dist/libs/digital-ocean/container-reg.d.ts.map +1 -1
- package/dist/libs/digital-ocean/container-reg.js +7 -2
- package/dist/libs/k8s-constants.d.ts +1 -0
- package/dist/libs/k8s-constants.d.ts.map +1 -1
- package/dist/libs/k8s-constants.js +35 -10
- package/dist/libs/k8s-generate.d.ts +1 -1
- package/dist/libs/k8s-generate.d.ts.map +1 -1
- package/dist/libs/k8s-generate.js +15 -2
- package/dist/libs/k8s-secrets-manager.d.ts +2 -1
- package/dist/libs/k8s-secrets-manager.d.ts.map +1 -1
- package/dist/libs/k8s-secrets-manager.js +8 -5
- package/dist/types/index.d.ts +19 -8
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -1
- package/package.json +1 -1
- package/src/cli/cloudrun.ts +133 -0
- package/src/cli/common.ts +46 -38
- package/src/cli/db.ts +1 -1
- package/src/cli/dml.ts +1 -1
- package/src/cli/env.ts +2 -2
- package/src/cli/exec.ts +1 -1
- package/src/cli/image.ts +15 -1
- package/src/cli/job.ts +1 -1
- package/src/cli/prep-build.ts +34 -6
- package/src/cli/redis.ts +1 -1
- package/src/cli/registry.ts +15 -5
- package/src/devops.ts +3 -1
- package/src/libs/cloudrun-helpers.ts +118 -0
- package/src/libs/config.ts +5 -0
- package/src/libs/digital-ocean/container-reg.ts +10 -2
- package/src/libs/k8s-constants.ts +36 -12
- package/src/libs/k8s-generate.ts +15 -2
- package/src/libs/k8s-secrets-manager.ts +9 -5
- package/src/target-templates/lang-variants-common/python/.devops/config/images.yaml +3 -1
- package/src/target-templates/lang-variants-common/typescript/.devops/docker-images/cloudrun.Dockerfile +31 -0
- package/src/target-templates/lang-variants-common/typescript/.github/actions/deploy-image@v1/action.yaml +4 -0
- 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,
|
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;
|
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
|
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 (
|
28
|
-
|
29
|
-
|
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
|
-
|
54
|
-
|
55
|
-
|
56
|
-
[
|
57
|
-
|
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;
|
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 _
|
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
|
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":"
|
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
|
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 =
|
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 =
|
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
|
46
|
-
const value =
|
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");
|
package/dist/types/index.d.ts
CHANGED
@@ -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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB,6BAA8B,CAAC;AAC/D,MAAM,MAAM,kBAAkB,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAIpE,eAAO,MAAM,eAAe
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.js
CHANGED
@@ -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
@@ -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
|
+
};
|