@catladder/cli 0.0.0-next-4e7c6848 → 0.0.0-next-8b9ad5ca
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/bundles/catenv/index.js +617 -19
- package/dist/bundles/cli/index.js +811 -18
- package/dist/cli/src/adapters/baseContext.d.ts +4 -0
- package/dist/cli/src/adapters/baseContext.js +5 -0
- package/dist/cli/src/adapters/baseContext.js.map +1 -1
- package/dist/cli/src/adapters/nonInteractive.d.ts +9 -0
- package/dist/cli/src/adapters/nonInteractive.js +32 -0
- package/dist/cli/src/adapters/nonInteractive.js.map +1 -0
- package/dist/cli/src/adapters/programmatic.d.ts +1 -0
- package/dist/cli/src/adapters/programmatic.js +6 -1
- package/dist/cli/src/adapters/programmatic.js.map +1 -1
- package/dist/cli/src/adapters/terminal.d.ts +1 -0
- package/dist/cli/src/adapters/terminal.js +10 -1
- package/dist/cli/src/adapters/terminal.js.map +1 -1
- package/dist/cli/src/adapters/vaultManagerAccess.d.ts +8 -0
- package/dist/cli/src/adapters/vaultManagerAccess.js +26 -0
- package/dist/cli/src/adapters/vaultManagerAccess.js.map +1 -0
- package/dist/cli/src/apps/catenv/catenv.d.ts +2 -0
- package/dist/cli/src/apps/catenv/catenv.js +8 -1
- package/dist/cli/src/apps/catenv/catenv.js.map +1 -1
- package/dist/cli/src/apps/catenv/printVariables.d.ts +2 -2
- package/dist/cli/src/apps/catenv/printVariables.js +4 -4
- package/dist/cli/src/apps/catenv/printVariables.js.map +1 -1
- package/dist/cli/src/apps/catenv/types.d.ts +9 -0
- package/dist/cli/src/apps/catenv/writeDotEnvFiles.d.ts +2 -2
- package/dist/cli/src/apps/catenv/writeDotEnvFiles.js +1 -1
- package/dist/cli/src/apps/catenv/writeDotEnvFiles.js.map +1 -1
- package/dist/cli/src/apps/cli/commands/project/commandConfigSecrets.js +52 -3
- package/dist/cli/src/apps/cli/commands/project/commandConfigSecrets.js.map +1 -1
- package/dist/cli/src/catenv.js +3 -2
- package/dist/cli/src/catenv.js.map +1 -1
- package/dist/cli/src/commands/index.d.ts +1 -0
- package/dist/cli/src/commands/index.js +8 -1
- package/dist/cli/src/commands/index.js.map +1 -1
- package/dist/cli/src/commands/project/commandSecretsSyncGithub.d.ts +37 -0
- package/dist/cli/src/commands/project/commandSecretsSyncGithub.js +127 -0
- package/dist/cli/src/commands/project/commandSecretsSyncGithub.js.map +1 -0
- package/dist/cli/src/config/getProjectConfig.d.ts +1 -1
- package/dist/cli/src/config/getProjectConfig.js +12 -2
- package/dist/cli/src/config/getProjectConfig.js.map +1 -1
- package/dist/cli/src/core/types.d.ts +15 -0
- package/dist/cli/src/core/types.js +8 -1
- package/dist/cli/src/core/types.js.map +1 -1
- package/dist/cli/src/git/gitProjectInformation.d.ts +1 -1
- package/dist/cli/src/git/gitProjectInformation.js +3 -3
- package/dist/cli/src/git/gitProjectInformation.js.map +1 -1
- package/dist/cli/src/utils/github.d.ts +15 -0
- package/dist/cli/src/utils/github.js +54 -0
- package/dist/cli/src/utils/github.js.map +1 -0
- package/dist/cli/src/vault/BitwardenVault.d.ts +24 -0
- package/dist/cli/src/vault/BitwardenVault.js +107 -0
- package/dist/cli/src/vault/BitwardenVault.js.map +1 -0
- package/dist/cli/src/vault/GitlabVault.d.ts +11 -0
- package/dist/cli/src/vault/GitlabVault.js +24 -0
- package/dist/cli/src/vault/GitlabVault.js.map +1 -0
- package/dist/cli/src/vault/VaultManager.d.ts +43 -0
- package/dist/cli/src/vault/VaultManager.js +131 -0
- package/dist/cli/src/vault/VaultManager.js.map +1 -0
- package/dist/cli/src/vault/bw.d.ts +15 -0
- package/dist/cli/src/vault/bw.js +89 -0
- package/dist/cli/src/vault/bw.js.map +1 -0
- package/dist/cli/src/vault/cache.d.ts +38 -0
- package/dist/cli/src/vault/cache.js +53 -0
- package/dist/cli/src/vault/cache.js.map +1 -0
- package/dist/cli/src/vault/index.d.ts +5 -0
- package/dist/cli/src/vault/index.js +48 -0
- package/dist/cli/src/vault/index.js.map +1 -0
- package/dist/cli/src/vault/types.d.ts +33 -0
- package/dist/cli/src/vault/types.js +5 -0
- package/dist/cli/src/vault/types.js.map +1 -0
- package/dist/pipeline/src/backends/index.d.ts +17 -1
- package/dist/pipeline/src/backends/index.js +33 -1
- package/dist/pipeline/src/backends/index.js.map +1 -1
- package/dist/pipeline/src/constants.js +1 -1
- package/dist/pipeline/src/deploy/cloudRun/index.js +11 -4
- package/dist/pipeline/src/deploy/cloudRun/index.js.map +1 -1
- package/dist/pipeline/src/types/config.d.ts +37 -3
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/adapters/baseContext.ts +10 -0
- package/src/adapters/nonInteractive.ts +30 -0
- package/src/adapters/programmatic.ts +7 -1
- package/src/adapters/terminal.ts +9 -1
- package/src/adapters/vaultManagerAccess.ts +25 -0
- package/src/apps/catenv/catenv.ts +5 -1
- package/src/apps/catenv/printVariables.ts +16 -6
- package/src/apps/catenv/types.ts +9 -0
- package/src/apps/catenv/writeDotEnvFiles.ts +3 -3
- package/src/apps/cli/commands/project/commandConfigSecrets.ts +94 -9
- package/src/catenv.ts +22 -2
- package/src/commands/index.ts +1 -0
- package/src/commands/project/commandSecretsSyncGithub.ts +149 -0
- package/src/config/getProjectConfig.ts +21 -7
- package/src/core/types.ts +23 -0
- package/src/git/gitProjectInformation.ts +5 -3
- package/src/utils/github.ts +59 -0
- package/src/vault/BitwardenVault.ts +161 -0
- package/src/vault/GitlabVault.ts +25 -0
- package/src/vault/VaultManager.ts +211 -0
- package/src/vault/bw.ts +110 -0
- package/src/vault/cache.ts +80 -0
- package/src/vault/index.ts +5 -0
- package/src/vault/types.ts +42 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.VaultManager = void 0;
|
|
7
|
+
const pipeline_1 = require("../../../pipeline/src/index.js");
|
|
8
|
+
const BitwardenVault_1 = require("./BitwardenVault");
|
|
9
|
+
const cache_1 = require("./cache");
|
|
10
|
+
const GitlabVault_1 = require("./GitlabVault");
|
|
11
|
+
/**
|
|
12
|
+
* only secrets of this env are cached locally — the other envs'
|
|
13
|
+
* secrets have no business sitting on developer machines
|
|
14
|
+
*/
|
|
15
|
+
const CACHED_ENV = "local";
|
|
16
|
+
/**
|
|
17
|
+
* owns the configured vault, the secrets mode and the local cache.
|
|
18
|
+
* The vault is the readable source of truth for secrets; CI backends
|
|
19
|
+
* only receive mirrored copies.
|
|
20
|
+
*/
|
|
21
|
+
class VaultManager {
|
|
22
|
+
constructor(config, options = {}) {
|
|
23
|
+
var _a, _b;
|
|
24
|
+
this.config = config;
|
|
25
|
+
/** refresh mode bypasses the cache only once per manager */
|
|
26
|
+
this.refreshed = false;
|
|
27
|
+
this.mode = (_a = options.mode) !== null && _a !== void 0 ? _a : "auto";
|
|
28
|
+
this.io = (_b = options.io) !== null && _b !== void 0 ? _b : null;
|
|
29
|
+
this.vault = this.createVault();
|
|
30
|
+
}
|
|
31
|
+
createVault() {
|
|
32
|
+
const vaultConfig = (0, pipeline_1.getVaultConfig)(this.config);
|
|
33
|
+
switch (vaultConfig.type) {
|
|
34
|
+
case "gitlab":
|
|
35
|
+
return new GitlabVault_1.GitlabVault();
|
|
36
|
+
case "bitwarden":
|
|
37
|
+
return new BitwardenVault_1.BitwardenVault(this.config, vaultConfig, this.mode === "auto" || this.mode === "refresh");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* the vault secrets, served from the local cache when it contains
|
|
42
|
+
* all required names; otherwise (depending on the mode) refreshed
|
|
43
|
+
* from the vault. Only the "local" env is (re-)cached.
|
|
44
|
+
*/
|
|
45
|
+
async readSecrets(requiredNames, io = this.io) {
|
|
46
|
+
const bypassCache = this.mode === "refresh" && !this.refreshed;
|
|
47
|
+
const cache = bypassCache ? null : await (0, cache_1.readSecretsCache)();
|
|
48
|
+
// known entries include recorded misses (null values), so declared
|
|
49
|
+
// but intentionally unset secrets don't force a vault refresh
|
|
50
|
+
const known = (cache === null || cache === void 0 ? void 0 : cache.vaultId) === this.vault.id ? flattenSecrets(cache.secrets) : undefined;
|
|
51
|
+
const missing = requiredNames.filter(name => !(name in (known !== null && known !== void 0 ? known : {})));
|
|
52
|
+
// nothing missing (or nothing required at all): don't touch the vault
|
|
53
|
+
if (missing.length === 0 && (known || requiredNames.length === 0)) {
|
|
54
|
+
return withoutMisses(known !== null && known !== void 0 ? known : {});
|
|
55
|
+
}
|
|
56
|
+
if (this.mode === "offline") {
|
|
57
|
+
if (missing.length > 0) {
|
|
58
|
+
io === null || io === void 0 ? void 0 : io.log(`⚠️ vault is offline (--vault-mode offline) and ${missing.length} secrets are not in the local cache: ${missing.join(", ")}`);
|
|
59
|
+
}
|
|
60
|
+
return withoutMisses(known !== null && known !== void 0 ? known : {});
|
|
61
|
+
}
|
|
62
|
+
const secrets = await this.vault.readAllSecrets(io);
|
|
63
|
+
this.refreshed = true;
|
|
64
|
+
await (0, cache_1.writeSecretsCache)(this.vault.id, await this.cacheableSubset(secrets));
|
|
65
|
+
return secrets;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* writes secrets of one env/component to the vault and updates the
|
|
69
|
+
* local cache (write-through, "local" env only)
|
|
70
|
+
*/
|
|
71
|
+
async writeSecrets(env, componentName, secrets, io = this.io) {
|
|
72
|
+
if (!io) {
|
|
73
|
+
throw new Error("writing to the vault requires an interactive context");
|
|
74
|
+
}
|
|
75
|
+
await this.vault.writeSecrets(io, env, componentName, secrets);
|
|
76
|
+
if (env === CACHED_ENV) {
|
|
77
|
+
await (0, cache_1.updateSecretsCache)(this.vault.id, env, componentName, Object.fromEntries(Object.entries(secrets).map(([key, value]) => [key, typeof value === "string" ? value : JSON.stringify(value)])));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* the subset of the vault secrets that may be cached: the declared
|
|
82
|
+
* secrets of the "local" env, per component, as a hierarchy
|
|
83
|
+
*/
|
|
84
|
+
async cacheableSubset(flatSecrets) {
|
|
85
|
+
const local = {};
|
|
86
|
+
for (const componentName of Object.keys(this.config.components)) {
|
|
87
|
+
const keys = await this.declaredSecretKeys(componentName);
|
|
88
|
+
const values = Object.fromEntries(keys.map(key => {
|
|
89
|
+
var _a;
|
|
90
|
+
return [key,
|
|
91
|
+
// null records "absent in the vault" (a known miss)
|
|
92
|
+
(_a = flatSecrets[(0, pipeline_1.getSecretVarName)(CACHED_ENV, componentName, key)]) !== null && _a !== void 0 ? _a : null];
|
|
93
|
+
}));
|
|
94
|
+
if (Object.keys(values).length > 0) {
|
|
95
|
+
local[componentName] = values;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return Object.keys(local).length > 0 ? {
|
|
99
|
+
[CACHED_ENV]: local
|
|
100
|
+
} : {};
|
|
101
|
+
}
|
|
102
|
+
async declaredSecretKeys(componentName) {
|
|
103
|
+
try {
|
|
104
|
+
const {
|
|
105
|
+
secretEnvVarKeys,
|
|
106
|
+
jobOnlyVars
|
|
107
|
+
} = await (0, pipeline_1.getEnvironment)({
|
|
108
|
+
config: this.config,
|
|
109
|
+
componentName,
|
|
110
|
+
env: CACHED_ENV
|
|
111
|
+
});
|
|
112
|
+
return [...secretEnvVarKeys, ...jobOnlyVars.build.secretEnvVarKeys, ...jobOnlyVars.deploy.secretEnvVarKeys].map(({
|
|
113
|
+
key
|
|
114
|
+
}) => key);
|
|
115
|
+
} catch (_a) {
|
|
116
|
+
// components without a local env simply have nothing to cache
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
exports.VaultManager = VaultManager;
|
|
122
|
+
/**
|
|
123
|
+
* the cache hierarchy as a flat map of raw secret variable names
|
|
124
|
+
* (null values = recorded misses)
|
|
125
|
+
*/
|
|
126
|
+
const flattenSecrets = secrets => Object.fromEntries(Object.entries(secrets).flatMap(([env, components]) => Object.entries(components).flatMap(([componentName, values]) => Object.entries(values).map(([key, value]) => [(0, pipeline_1.getSecretVarName)(env, componentName, key), value]))));
|
|
127
|
+
/**
|
|
128
|
+
* only actual values — recorded misses stay unresolved, like any other
|
|
129
|
+
* unset variable
|
|
130
|
+
*/
|
|
131
|
+
const withoutMisses = known => Object.fromEntries(Object.entries(known).filter(entry => entry[1] !== null));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VaultManager.js","sourceRoot":"","sources":["../../../../src/vault/VaultManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { IO } from "../core/types";
|
|
2
|
+
/**
|
|
3
|
+
* a working bw session: reuses the cached one, otherwise unlocks (or
|
|
4
|
+
* logs in) interactively — unless prompting is disabled
|
|
5
|
+
*/
|
|
6
|
+
export declare const getBwSession: (io: IO | null, {
|
|
7
|
+
allowPrompt
|
|
8
|
+
}: {
|
|
9
|
+
allowPrompt: boolean;
|
|
10
|
+
}) => Promise<string>;
|
|
11
|
+
/**
|
|
12
|
+
* runs a bw command with the given session and returns stdout
|
|
13
|
+
*/
|
|
14
|
+
export declare const runBw: (session: string, args: string[]) => Promise<string>;
|
|
15
|
+
export declare const runBwJson: <T>(session: string, args: string[]) => Promise<T>;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.runBwJson = exports.runBw = exports.getBwSession = void 0;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const util_1 = require("util");
|
|
9
|
+
const preferences_1 = require("../utils/preferences");
|
|
10
|
+
const execFile = (0, util_1.promisify)(child_process_1.execFile);
|
|
11
|
+
const SESSION_PREFERENCE = "bwsession";
|
|
12
|
+
class BitwardenLockedError extends Error {
|
|
13
|
+
constructor() {
|
|
14
|
+
super("bitwarden is locked and prompting is disabled — run `bw unlock` or catenv without --vault-mode no-prompt");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* runs an interactive bw command that prints a session key on stdout
|
|
19
|
+
* (login/unlock) while the user types the password on the terminal
|
|
20
|
+
*/
|
|
21
|
+
const interactiveSessionCommand = args => new Promise((resolve, reject) => {
|
|
22
|
+
var _a;
|
|
23
|
+
const child = (0, child_process_1.spawn)("bw", [...args, "--raw"], {
|
|
24
|
+
stdio: ["inherit", "pipe", "inherit"]
|
|
25
|
+
});
|
|
26
|
+
let session = "";
|
|
27
|
+
(_a = child.stdout) === null || _a === void 0 ? void 0 : _a.on("data", data => session += data.toString("utf-8"));
|
|
28
|
+
child.on("error", reject);
|
|
29
|
+
child.on("close", code => code === 0 && session.trim() ? resolve(session.trim()) : reject(new Error(`bw ${args[0]} failed`)));
|
|
30
|
+
});
|
|
31
|
+
const getBwStatus = async session => {
|
|
32
|
+
try {
|
|
33
|
+
const {
|
|
34
|
+
stdout
|
|
35
|
+
} = await execFile("bw", ["status"], {
|
|
36
|
+
env: {
|
|
37
|
+
...process.env,
|
|
38
|
+
...(session ? {
|
|
39
|
+
BW_SESSION: session
|
|
40
|
+
} : {})
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return JSON.parse(stdout).status;
|
|
44
|
+
} catch (_a) {
|
|
45
|
+
return "unauthenticated";
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* a working bw session: reuses the cached one, otherwise unlocks (or
|
|
50
|
+
* logs in) interactively — unless prompting is disabled
|
|
51
|
+
*/
|
|
52
|
+
const getBwSession = async (io, {
|
|
53
|
+
allowPrompt
|
|
54
|
+
}) => {
|
|
55
|
+
const cached = (await (0, preferences_1.hasPreference)(SESSION_PREFERENCE)) ? String(await (0, preferences_1.getPreference)(SESSION_PREFERENCE)) : null;
|
|
56
|
+
const status = await getBwStatus(cached);
|
|
57
|
+
if (status === "unlocked" && cached) {
|
|
58
|
+
return cached;
|
|
59
|
+
}
|
|
60
|
+
if (!allowPrompt) {
|
|
61
|
+
throw new BitwardenLockedError();
|
|
62
|
+
}
|
|
63
|
+
io === null || io === void 0 ? void 0 : io.log("");
|
|
64
|
+
io === null || io === void 0 ? void 0 : io.log(status === "unauthenticated" ? "# Please login to Bitwarden:" : "# Bitwarden is locked, please unlock:");
|
|
65
|
+
io === null || io === void 0 ? void 0 : io.log("");
|
|
66
|
+
const session = await interactiveSessionCommand([status === "unauthenticated" ? "login" : "unlock"]);
|
|
67
|
+
await (0, preferences_1.setPreference)(SESSION_PREFERENCE, session);
|
|
68
|
+
await (0, exports.runBw)(session, ["sync"]);
|
|
69
|
+
return session;
|
|
70
|
+
};
|
|
71
|
+
exports.getBwSession = getBwSession;
|
|
72
|
+
/**
|
|
73
|
+
* runs a bw command with the given session and returns stdout
|
|
74
|
+
*/
|
|
75
|
+
const runBw = async (session, args) => {
|
|
76
|
+
const {
|
|
77
|
+
stdout
|
|
78
|
+
} = await execFile("bw", [...args, "--raw", "--nointeraction"], {
|
|
79
|
+
env: {
|
|
80
|
+
...process.env,
|
|
81
|
+
BW_SESSION: session
|
|
82
|
+
},
|
|
83
|
+
maxBuffer: 50 * 1024 * 1024
|
|
84
|
+
});
|
|
85
|
+
return stdout;
|
|
86
|
+
};
|
|
87
|
+
exports.runBw = runBw;
|
|
88
|
+
const runBwJson = async (session, args) => JSON.parse(await (0, exports.runBw)(session, args));
|
|
89
|
+
exports.runBwJson = runBwJson;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bw.js","sourceRoot":"","sources":["../../../../src/vault/bw.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hierarchical: env -> componentName -> key -> value.
|
|
3
|
+
* Only the "local" env is ever cached — other envs' secrets have no
|
|
4
|
+
* business sitting on developer machines.
|
|
5
|
+
*
|
|
6
|
+
* `null` records a declared secret that was absent in the vault at the
|
|
7
|
+
* last refresh (e.g. deploy credentials that intentionally don't exist
|
|
8
|
+
* for local) — a known miss, so it doesn't force re-contacting the
|
|
9
|
+
* vault on every run.
|
|
10
|
+
*/
|
|
11
|
+
export type CachedSecrets = {
|
|
12
|
+
[env: string]: {
|
|
13
|
+
[componentName: string]: {
|
|
14
|
+
[key: string]: string | null;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* local, project-scoped cache of the vault secrets, so that frequent
|
|
20
|
+
* catenv runs don't have to contact the vault (e.g. unlock bitwarden)
|
|
21
|
+
* every time. Plaintext — like the .env files catenv writes anyway —
|
|
22
|
+
* but never committed (the folder ignores itself).
|
|
23
|
+
*/
|
|
24
|
+
type SecretsCache = {
|
|
25
|
+
/** the vault this cache was filled from */
|
|
26
|
+
vaultId: string;
|
|
27
|
+
updatedAt: string;
|
|
28
|
+
secrets: CachedSecrets;
|
|
29
|
+
};
|
|
30
|
+
export declare const readSecretsCache: () => Promise<SecretsCache | null>;
|
|
31
|
+
export declare const writeSecretsCache: (vaultId: string, secrets: CachedSecrets) => Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* merges freshly written secrets of one env/component into the cache
|
|
34
|
+
* (write-through from config-secrets), so the next catenv run doesn't
|
|
35
|
+
* need the vault
|
|
36
|
+
*/
|
|
37
|
+
export declare const updateSecretsCache: (vaultId: string, env: string, componentName: string, values: Record<string, string>) => Promise<void>;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.updateSecretsCache = exports.writeSecretsCache = exports.readSecretsCache = void 0;
|
|
7
|
+
const promises_1 = require("fs/promises");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const gitProjectInformation_1 = require("../git/gitProjectInformation");
|
|
10
|
+
const getCacheFolder = async () => (0, path_1.join)(await (0, gitProjectInformation_1.getProjectRootPath)(), ".catladder");
|
|
11
|
+
const getCachePath = async () => (0, path_1.join)(await getCacheFolder(), "secrets.json");
|
|
12
|
+
const readSecretsCache = async () => {
|
|
13
|
+
try {
|
|
14
|
+
return JSON.parse(await (0, promises_1.readFile)(await getCachePath(), "utf-8"));
|
|
15
|
+
} catch (_a) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
exports.readSecretsCache = readSecretsCache;
|
|
20
|
+
const writeSecretsCache = async (vaultId, secrets) => {
|
|
21
|
+
const folder = await getCacheFolder();
|
|
22
|
+
await (0, promises_1.mkdir)(folder, {
|
|
23
|
+
recursive: true
|
|
24
|
+
});
|
|
25
|
+
// the folder ignores itself, so the cache can never be committed
|
|
26
|
+
await (0, promises_1.writeFile)((0, path_1.join)(folder, ".gitignore"), "*\n");
|
|
27
|
+
const cache = {
|
|
28
|
+
vaultId,
|
|
29
|
+
updatedAt: new Date().toISOString(),
|
|
30
|
+
secrets
|
|
31
|
+
};
|
|
32
|
+
await (0, promises_1.writeFile)(await getCachePath(), JSON.stringify(cache, null, 2));
|
|
33
|
+
};
|
|
34
|
+
exports.writeSecretsCache = writeSecretsCache;
|
|
35
|
+
/**
|
|
36
|
+
* merges freshly written secrets of one env/component into the cache
|
|
37
|
+
* (write-through from config-secrets), so the next catenv run doesn't
|
|
38
|
+
* need the vault
|
|
39
|
+
*/
|
|
40
|
+
const updateSecretsCache = async (vaultId, env, componentName, values) => {
|
|
41
|
+
var _a;
|
|
42
|
+
const existing = await (0, exports.readSecretsCache)();
|
|
43
|
+
const secrets = (existing === null || existing === void 0 ? void 0 : existing.vaultId) === vaultId ? existing.secrets : {};
|
|
44
|
+
secrets[env] = {
|
|
45
|
+
...secrets[env],
|
|
46
|
+
[componentName]: {
|
|
47
|
+
...((_a = secrets[env]) === null || _a === void 0 ? void 0 : _a[componentName]),
|
|
48
|
+
...values
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
await (0, exports.writeSecretsCache)(vaultId, secrets);
|
|
52
|
+
};
|
|
53
|
+
exports.updateSecretsCache = updateSecretsCache;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../../src/vault/cache.ts"],"names":[],"mappings":";;;AAAA,0CAAyD;AACzD,+BAA4B;AAC5B,wEAAkE;AA6BlE,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE,CAChC,IAAA,WAAI,EAAC,MAAM,IAAA,0CAAkB,GAAE,EAAE,YAAY,CAAC,CAAC;AAEjD,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE,CAAC,IAAA,WAAI,EAAC,MAAM,cAAc,EAAE,EAAE,cAAc,CAAC,CAAC;AAEvE,MAAM,gBAAgB,GAAG,KAAK,IAAkC,EAAE;IACvE,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,mBAAQ,EAAC,MAAM,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AANW,QAAA,gBAAgB,oBAM3B;AAEK,MAAM,iBAAiB,GAAG,KAAK,EACpC,OAAe,EACf,OAAsB,EACP,EAAE;IACjB,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;IACtC,MAAM,IAAA,gBAAK,EAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,iEAAiE;IACjE,MAAM,IAAA,oBAAS,EAAC,IAAA,WAAI,EAAC,MAAM,EAAE,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;IACnD,MAAM,KAAK,GAAiB;QAC1B,OAAO;QACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO;KACR,CAAC;IACF,MAAM,IAAA,oBAAS,EAAC,MAAM,YAAY,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC,CAAC;AAdW,QAAA,iBAAiB,qBAc5B;AAEF;;;;GAIG;AACI,MAAM,kBAAkB,GAAG,KAAK,EACrC,OAAe,EACf,GAAW,EACX,aAAqB,EACrB,MAA8B,EACf,EAAE;;IACjB,MAAM,QAAQ,GAAG,MAAM,IAAA,wBAAgB,GAAE,CAAC;IAC1C,MAAM,OAAO,GACX,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,MAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,GAAG;QACb,GAAG,OAAO,CAAC,GAAG,CAAC;QACf,CAAC,aAAa,CAAC,EAAE,EAAE,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAG,aAAa,CAAC,EAAE,GAAG,MAAM,EAAE;KACjE,CAAC;IACF,MAAM,IAAA,yBAAiB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC,CAAC;AAdW,QAAA,kBAAkB,sBAc7B"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var __createBinding = this && this.__createBinding || (Object.create ? function (o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () {
|
|
10
|
+
return m[k];
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
} : function (o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
});
|
|
19
|
+
var __exportStar = this && this.__exportStar || function (m, exports) {
|
|
20
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", {
|
|
23
|
+
value: true
|
|
24
|
+
});
|
|
25
|
+
exports.updateSecretsCache = exports.BitwardenVault = exports.GitlabVault = void 0;
|
|
26
|
+
__exportStar(require("./types"), exports);
|
|
27
|
+
__exportStar(require("./VaultManager"), exports);
|
|
28
|
+
var GitlabVault_1 = require("./GitlabVault");
|
|
29
|
+
Object.defineProperty(exports, "GitlabVault", {
|
|
30
|
+
enumerable: true,
|
|
31
|
+
get: function () {
|
|
32
|
+
return GitlabVault_1.GitlabVault;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
var BitwardenVault_1 = require("./BitwardenVault");
|
|
36
|
+
Object.defineProperty(exports, "BitwardenVault", {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
get: function () {
|
|
39
|
+
return BitwardenVault_1.BitwardenVault;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
var cache_1 = require("./cache");
|
|
43
|
+
Object.defineProperty(exports, "updateSecretsCache", {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
get: function () {
|
|
46
|
+
return cache_1.updateSecretsCache;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/vault/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,iDAA+B;AAC/B,6CAA4C;AAAnC,0GAAA,WAAW,OAAA;AACpB,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AACvB,iCAA6C;AAApC,2GAAA,kBAAkB,OAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { IO } from "../core/types";
|
|
2
|
+
/**
|
|
3
|
+
* a secrets vault is the readable source of truth for secret values.
|
|
4
|
+
* CI backends (gitlab variables, github secrets) only receive mirrored
|
|
5
|
+
* copies of what is stored here.
|
|
6
|
+
*/
|
|
7
|
+
export type SecretsVault = {
|
|
8
|
+
/**
|
|
9
|
+
* identity of the vault (incl. its config), used to invalidate the
|
|
10
|
+
* local cache when the vault changes
|
|
11
|
+
*/
|
|
12
|
+
id: string;
|
|
13
|
+
/**
|
|
14
|
+
* all secrets as a flat map of raw secret variable names
|
|
15
|
+
* (CL_<ENV>_<COMPONENT>_<KEY>) to values
|
|
16
|
+
*/
|
|
17
|
+
readAllSecrets(io: IO | null): Promise<Record<string, string>>;
|
|
18
|
+
/**
|
|
19
|
+
* upserts the secrets of one env and component
|
|
20
|
+
* (keys as declared in the config, not the raw variable names)
|
|
21
|
+
*/
|
|
22
|
+
writeSecrets(io: IO, env: string, componentName: string, secrets: Record<string, unknown>): Promise<void>;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* how secret resolution may interact with the vault:
|
|
26
|
+
* - auto (default): contact the vault when the local cache is
|
|
27
|
+
* incomplete, prompting to unlock if necessary
|
|
28
|
+
* - no-prompt: contact the vault only if that needs no interaction;
|
|
29
|
+
* fail on missing secrets instead of prompting to unlock
|
|
30
|
+
* - offline: never contact the vault, use only the local cache
|
|
31
|
+
* - refresh: ignore the local cache once and refresh it from the vault
|
|
32
|
+
*/
|
|
33
|
+
export type SecretsMode = "auto" | "no-prompt" | "offline" | "refresh";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/vault/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,9 +1,25 @@
|
|
|
1
|
-
import type { Config, PipelineType } from "../types";
|
|
1
|
+
import type { Config, PipelineOutputOptions, PipelineType, SecretsVaultConfig } from "../types";
|
|
2
2
|
import type { PipelineBackend } from "./types";
|
|
3
3
|
export * from "./types";
|
|
4
4
|
export * from "./gitlab";
|
|
5
5
|
export * from "./github";
|
|
6
6
|
export declare const getPipelineBackend: (type: PipelineType) => PipelineBackend;
|
|
7
|
+
/**
|
|
8
|
+
* the options of an enabled pipeline type (empty object when enabled
|
|
9
|
+
* with `true`)
|
|
10
|
+
*/
|
|
11
|
+
export declare const getPipelineOptions: (config: Config, type: PipelineType) => PipelineOutputOptions;
|
|
12
|
+
/**
|
|
13
|
+
* the git remote pointing to the repository of this pipeline type's CI
|
|
14
|
+
* system (e.g. during a migration, gitlab may be `origin` and github a
|
|
15
|
+
* second remote)
|
|
16
|
+
*/
|
|
17
|
+
export declare const getPipelineGitRemote: (config: Config, type: PipelineType) => string;
|
|
18
|
+
/**
|
|
19
|
+
* the normalized secrets vault of a config (string shorthands resolved
|
|
20
|
+
* to their object form; defaults to the legacy gitlab store)
|
|
21
|
+
*/
|
|
22
|
+
export declare const getVaultConfig: (config: Config) => Exclude<SecretsVaultConfig, string>;
|
|
7
23
|
/**
|
|
8
24
|
* the pipeline types enabled for this config. Multiple types can be
|
|
9
25
|
* enabled at once (parallel generation, e.g. during a CI migration).
|
|
@@ -22,7 +22,7 @@ var __exportStar = this && this.__exportStar || function (m, exports) {
|
|
|
22
22
|
Object.defineProperty(exports, "__esModule", {
|
|
23
23
|
value: true
|
|
24
24
|
});
|
|
25
|
-
exports.getEnabledPipelineTypes = exports.getPipelineBackend = void 0;
|
|
25
|
+
exports.getEnabledPipelineTypes = exports.getVaultConfig = exports.getPipelineGitRemote = exports.getPipelineOptions = exports.getPipelineBackend = void 0;
|
|
26
26
|
const github_1 = require("./github");
|
|
27
27
|
const gitlab_1 = require("./gitlab");
|
|
28
28
|
__exportStar(require("./types"), exports);
|
|
@@ -40,6 +40,38 @@ const getPipelineBackend = type => {
|
|
|
40
40
|
return createBackend();
|
|
41
41
|
};
|
|
42
42
|
exports.getPipelineBackend = getPipelineBackend;
|
|
43
|
+
/**
|
|
44
|
+
* the options of an enabled pipeline type (empty object when enabled
|
|
45
|
+
* with `true`)
|
|
46
|
+
*/
|
|
47
|
+
const getPipelineOptions = (config, type) => {
|
|
48
|
+
var _a;
|
|
49
|
+
const value = (_a = config.pipelines) === null || _a === void 0 ? void 0 : _a[type];
|
|
50
|
+
return typeof value === "object" ? value : {};
|
|
51
|
+
};
|
|
52
|
+
exports.getPipelineOptions = getPipelineOptions;
|
|
53
|
+
/**
|
|
54
|
+
* the git remote pointing to the repository of this pipeline type's CI
|
|
55
|
+
* system (e.g. during a migration, gitlab may be `origin` and github a
|
|
56
|
+
* second remote)
|
|
57
|
+
*/
|
|
58
|
+
const getPipelineGitRemote = (config, type) => {
|
|
59
|
+
var _a;
|
|
60
|
+
return (_a = (0, exports.getPipelineOptions)(config, type).gitRemote) !== null && _a !== void 0 ? _a : "origin";
|
|
61
|
+
};
|
|
62
|
+
exports.getPipelineGitRemote = getPipelineGitRemote;
|
|
63
|
+
/**
|
|
64
|
+
* the normalized secrets vault of a config (string shorthands resolved
|
|
65
|
+
* to their object form; defaults to the legacy gitlab store)
|
|
66
|
+
*/
|
|
67
|
+
const getVaultConfig = config => {
|
|
68
|
+
var _a, _b;
|
|
69
|
+
const vault = (_b = (_a = config.secrets) === null || _a === void 0 ? void 0 : _a.vault) !== null && _b !== void 0 ? _b : "gitlab";
|
|
70
|
+
return typeof vault === "string" ? {
|
|
71
|
+
type: vault
|
|
72
|
+
} : vault;
|
|
73
|
+
};
|
|
74
|
+
exports.getVaultConfig = getVaultConfig;
|
|
43
75
|
/**
|
|
44
76
|
* the pipeline types enabled for this config. Multiple types can be
|
|
45
77
|
* enabled at once (parallel generation, e.g. during a CI migration).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../pipeline/src/backends/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../pipeline/src/backends/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAMA,qCAAyC;AACzC,qCAAyC;AAGzC,0CAAwB;AACxB,2CAAyB;AACzB,2CAAyB;AAEzB,MAAM,QAAQ,GAAmD;IAC/D,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,sBAAa,EAAE;IACjC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,sBAAa,EAAE;CAClC,CAAC;AAEK,MAAM,kBAAkB,GAAG,CAAC,IAAkB,EAAmB,EAAE;IACxE,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC,CAAC;AANW,QAAA,kBAAkB,sBAM7B;AAEF;;;GAGG;AACI,MAAM,kBAAkB,GAAG,CAChC,MAAc,EACd,IAAkB,EACK,EAAE;;IACzB,MAAM,KAAK,GAAG,MAAA,MAAM,CAAC,SAAS,0CAAG,IAAI,CAAC,CAAC;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC,CAAC;AANW,QAAA,kBAAkB,sBAM7B;AAEF;;;;GAIG;AACI,MAAM,oBAAoB,GAAG,CAClC,MAAc,EACd,IAAkB,EACV,EAAE,WAAC,OAAA,MAAA,IAAA,0BAAkB,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC,SAAS,mCAAI,QAAQ,CAAA,EAAA,CAAC;AAHvD,QAAA,oBAAoB,wBAGmC;AAEpE;;;GAGG;AACI,MAAM,cAAc,GAAG,CAC5B,MAAc,EACuB,EAAE;;IACvC,MAAM,KAAK,GAAG,MAAA,MAAA,MAAM,CAAC,OAAO,0CAAE,KAAK,mCAAI,QAAQ,CAAC;IAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7D,CAAC,CAAC;AALW,QAAA,cAAc,kBAKzB;AAEF;;;GAGG;AACI,MAAM,uBAAuB,GAAG,CAAC,MAAc,EAAkB,EAAE;;IACxE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,OAAO,GAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAoB,CAAC,MAAM,CAC9D,CAAC,IAAI,EAAE,EAAE,WAAC,OAAA,MAAA,MAAM,CAAC,SAAS,0CAAG,IAAI,CAAC,CAAA,EAAA,CACnC,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,CAAC,MAAA,MAAM,CAAC,YAAY,mCAAI,QAAQ,CAAC,CAAC;AAC3C,CAAC,CAAC;AAbW,QAAA,uBAAuB,2BAalC"}
|
|
@@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.DOCKER_REGISTRY = exports.PIPELINE_IMAGE_TAG = void 0;
|
|
7
|
-
exports.PIPELINE_IMAGE_TAG = "next-
|
|
7
|
+
exports.PIPELINE_IMAGE_TAG = "next-8b9ad5ca" || "latest";
|
|
8
8
|
exports.DOCKER_REGISTRY = "git.panter.ch:5001/catladder/catladder" || "git.panter.ch:5001/catladder/catladder";
|
|
@@ -55,13 +55,15 @@ exports.GCLOUD_RUN_DEPLOY_TYPE = {
|
|
|
55
55
|
}
|
|
56
56
|
return {};
|
|
57
57
|
},
|
|
58
|
-
additionalSecretKeys: ctx => [
|
|
58
|
+
additionalSecretKeys: ctx => [
|
|
59
|
+
// deploy-time credentials don't exist for the local env
|
|
60
|
+
...(ctx.envType !== "local" ? [{
|
|
59
61
|
key: exports.GCLOUD_DEPLOY_CREDENTIALS_KEY,
|
|
60
62
|
hidden: true
|
|
61
63
|
}, {
|
|
62
64
|
key: exports.GCLOUD_RUN_CANONICAL_HOST_SUFFIX,
|
|
63
65
|
hidden: true
|
|
64
|
-
}, ...(ctx.deployConfigRaw && ctx.deployConfigRaw.cloudSql ? [{
|
|
66
|
+
}] : []), ...(ctx.deployConfigRaw && ctx.deployConfigRaw.cloudSql ? [{
|
|
65
67
|
key: "DB_PASSWORD"
|
|
66
68
|
}] : [])],
|
|
67
69
|
getAdditionalEnvVars: ctx => {
|
|
@@ -69,7 +71,8 @@ exports.GCLOUD_RUN_DEPLOY_TYPE = {
|
|
|
69
71
|
fullName,
|
|
70
72
|
env,
|
|
71
73
|
componentName,
|
|
72
|
-
deployConfigRaw
|
|
74
|
+
deployConfigRaw,
|
|
75
|
+
envType
|
|
73
76
|
} = ctx;
|
|
74
77
|
const HOSTNAME_INTERNAL = (0, BashExpression_1.joinBashExpressions)([fullName, (0, BashExpression_1.getBashVariable)((0, context_1.getSecretVarName)(env, componentName, exports.GCLOUD_RUN_CANONICAL_HOST_SUFFIX))], "-").toLowerCase();
|
|
75
78
|
const jobTriggers = deployConfigRaw && deployConfigRaw.jobs ? Object.fromEntries(Object.entries(deployConfigRaw.jobs).filter(([name, job]) => Boolean(job)).map(([name, job]) => ["CLOUD_RUN_JOB_TRIGGER_URL_" + (0, gitlab_1.sanitizeForBashVariable)(name), (0, cloudRunExecutionUrl_1.getCloudRunJobExecuteUrl)(name, {
|
|
@@ -78,7 +81,11 @@ exports.GCLOUD_RUN_DEPLOY_TYPE = {
|
|
|
78
81
|
region: deployConfigRaw.region
|
|
79
82
|
})])) : {};
|
|
80
83
|
return {
|
|
81
|
-
|
|
84
|
+
// references the canonical host suffix secret, which doesn't
|
|
85
|
+
// exist for the local env
|
|
86
|
+
...(envType !== "local" ? {
|
|
87
|
+
HOSTNAME_INTERNAL
|
|
88
|
+
} : {}),
|
|
82
89
|
...getCloudSqlVariables(ctx),
|
|
83
90
|
...jobTriggers,
|
|
84
91
|
DEPLOY_CLOUD_RUN_SERVICE_NAME: (0, getServiceName_1.getServiceNameForEnvContext)(ctx),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../pipeline/src/deploy/cloudRun/index.ts"],"names":[],"mappings":";;;AACA,8DAGmC;AAEnC,2CAAiD;AAEjD,+CAA6D;AAC7D,6CAAkD;AAClD,6CAA8D;AAC9D,uEAAwE;AACxE,+CAI0B;AAC1B,2DAAqE;AAExD,QAAA,6BAA6B,GAAG,8BAA8B,CAAC;AAE5E,4HAA4H;AAC/G,QAAA,gCAAgC,GAC3C,gCAAgC,CAAC;AAEnC,MAAM,oBAAoB,GAAG,CAAC,EAC5B,eAAe,EACf,qBAAqB,EACrB,GAAG,EACH,aAAa,EACb,UAAU,GAC4C,EAAE,EAAE;;IAC1D,IAAI,eAAe,IAAI,eAAe,CAAC,QAAQ,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,IAAA,qBAAa,EAC3B,eAAe,CAAC,QAAQ,EACxB,UAAU,EACV,qBAAqB,EACrB,aAAa,CACd,CAAC;QAEF,MAAM,2BAA2B,GAAG,MAAM,CAAC,OAAO,CAChD,MAAA,eAAe,CAAC,QAAQ,CAAC,uBAAuB,mCAAI,EAAE,CACvD;aACE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;aACzC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEZ,MAAM,MAAM,GAAG;YACb,kCAAkC,EAChC,eAAe,CAAC,QAAQ,CAAC,sBAAsB;YACjD,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,MAAA,eAAe,CAAC,QAAQ,CAAC,MAAM,mCAAI,UAAU;YACtD,WAAW,EAAE,GAAG,GAAG,IAAA,0BAAgB,EAAC,GAAG,EAAE,aAAa,EAAE,aAAa,CAAC;SACvE,CAAC;QACF,OAAO;YACL,GAAG,MAAM;YACT,YAAY,EAAE,IAAA,sCAA2B,EACvC,eAAe,CAAC,QAAQ,EACxB,MAAM,CACP,CAAC,MAAM,CAAC,2BAA2B,CAAC;YACrC,iBAAiB,EAAE,IAAA,6BAAkB,EACnC,MAAM,EACN,MAAA,eAAe,CAAC,QAAQ,CAAC,+BAA+B,mCACtD,oCAAyB,CAC5B;SACF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AACW,QAAA,sBAAsB,GACjC;IACE,IAAI,EAAE,2CAA8B;IACpC,QAAQ,EAAE,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,EAAE;QACzC,IAAI,eAAe,IAAI,eAAe,CAAC,QAAQ,EAAE,CAAC;YAChD,OAAO;gBACL,QAAQ,EAAE;oBACR,oBAAoB,EAAE,OAAO,KAAK,QAAQ;iBAC3C;aACF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;QAC7B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../pipeline/src/deploy/cloudRun/index.ts"],"names":[],"mappings":"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"}
|