@catladder/cli 5.0.1 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/apps/cli/src/apps/cli/commands/project/doctor/checkGithub.js +3 -3
- package/dist/apps/cli/src/apps/cli/commands/project/doctor/checkGithub.js.map +1 -1
- package/dist/apps/cli/src/apps/cli/commands/project/setup/setupAccessTokens.js +2 -2
- package/dist/apps/cli/src/apps/cli/commands/project/setup/setupAccessTokens.js.map +1 -1
- package/dist/apps/cli/src/apps/cli/commands/project/setup/setupGithub.js +2 -2
- package/dist/apps/cli/src/apps/cli/commands/project/setup/setupGithub.js.map +1 -1
- package/dist/apps/cli/src/apps/cli/commands/project/setup/setupKubernetes.js +23 -7
- package/dist/apps/cli/src/apps/cli/commands/project/setup/setupKubernetes.js.map +1 -1
- package/dist/apps/cli/src/commands/index.d.ts +1 -0
- package/dist/apps/cli/src/commands/index.js +4 -1
- package/dist/apps/cli/src/commands/index.js.map +1 -1
- package/dist/apps/cli/src/commands/project/commandConfigSecrets.js +2 -1
- package/dist/apps/cli/src/commands/project/commandConfigSecrets.js.map +1 -1
- package/dist/apps/cli/src/commands/project/commandMrPin.d.ts +21 -0
- package/dist/apps/cli/src/commands/project/commandMrPin.js +119 -0
- package/dist/apps/cli/src/commands/project/commandMrPin.js.map +1 -0
- package/dist/apps/cli/src/commands/project/commandSecretsSyncGithub.d.ts +1 -42
- package/dist/apps/cli/src/commands/project/commandSecretsSyncGithub.js +5 -124
- package/dist/apps/cli/src/commands/project/commandSecretsSyncGithub.js.map +1 -1
- package/dist/apps/cli/src/commands/project/secrets/commandSecretsPush.js +2 -1
- package/dist/apps/cli/src/commands/project/secrets/commandSecretsPush.js.map +1 -1
- package/dist/apps/cli/src/commands/project/secrets/commandSecretsSet.js +2 -2
- package/dist/apps/cli/src/commands/project/secrets/commandSecretsSet.js.map +1 -1
- package/dist/apps/cli/src/commands/project/secrets/document.d.ts +1 -12
- package/dist/apps/cli/src/commands/project/secrets/document.js +1 -79
- package/dist/apps/cli/src/commands/project/secrets/document.js.map +1 -1
- package/dist/apps/cli/src/gcloud/serviceAccounts.js +15 -4
- package/dist/apps/cli/src/gcloud/serviceAccounts.js.map +1 -1
- package/dist/apps/cli/src/secrets/github.d.ts +41 -0
- package/dist/apps/cli/src/secrets/github.js +127 -0
- package/dist/apps/cli/src/secrets/github.js.map +1 -0
- package/dist/apps/cli/src/secrets/index.d.ts +2 -0
- package/dist/apps/cli/src/secrets/index.js +19 -0
- package/dist/apps/cli/src/secrets/index.js.map +1 -0
- package/dist/apps/cli/src/secrets/writeSecrets.d.ts +18 -0
- package/dist/apps/cli/src/secrets/writeSecrets.js +88 -0
- package/dist/apps/cli/src/secrets/writeSecrets.js.map +1 -0
- package/dist/apps/cli/src/utils/gitlab.d.ts +10 -0
- package/dist/apps/cli/src/utils/gitlab.js +30 -5
- package/dist/apps/cli/src/utils/gitlab.js.map +1 -1
- package/dist/apps/cli/src/vault/BitwardenVault.d.ts +6 -0
- package/dist/apps/cli/src/vault/BitwardenVault.js +11 -1
- package/dist/apps/cli/src/vault/BitwardenVault.js.map +1 -1
- package/dist/apps/cli/src/vault/GitlabVault.d.ts +2 -2
- package/dist/apps/cli/src/vault/GitlabVault.js +3 -2
- package/dist/apps/cli/src/vault/GitlabVault.js.map +1 -1
- package/dist/apps/cli/src/vault/VaultManager.d.ts +2 -2
- package/dist/apps/cli/src/vault/VaultManager.js +2 -2
- package/dist/apps/cli/src/vault/VaultManager.js.map +1 -1
- package/dist/apps/cli/src/vault/types.d.ts +16 -2
- package/dist/bundles/catenv/index.js +115 -13
- package/dist/bundles/cli/index.js +749 -431
- package/dist/bundles/skills/catladder-cli/references/commands.md +13 -0
- package/dist/bundles/skills/catladder-deploys/SKILL.md +7 -0
- package/dist/bundles/skills/catladder-migrate-ci-backend/SKILL.md +7 -2
- package/dist/bundles/skills/catladder-pipelines/SKILL.md +27 -1
- package/dist/bundles/skills/catladder-secrets/SKILL.md +16 -0
- package/dist/packages/pipeline/src/autoStop.d.ts +22 -0
- package/dist/packages/pipeline/src/autoStop.js +30 -0
- package/dist/packages/pipeline/src/autoStop.js.map +1 -0
- package/dist/packages/pipeline/src/backends/gitlab/GitlabBackend.js +2 -0
- package/dist/packages/pipeline/src/backends/gitlab/GitlabBackend.js.map +1 -1
- package/dist/packages/pipeline/src/backends/gitlab/createGitlabPipeline.d.ts +4 -1
- package/dist/packages/pipeline/src/backends/gitlab/createGitlabPipeline.js +21 -1
- package/dist/packages/pipeline/src/backends/gitlab/createGitlabPipeline.js.map +1 -1
- package/dist/packages/pipeline/src/deploy/base/deploy.js +8 -2
- package/dist/packages/pipeline/src/deploy/base/deploy.js.map +1 -1
- package/dist/packages/pipeline/src/index.d.ts +1 -0
- package/dist/packages/pipeline/src/index.js +1 -0
- package/dist/packages/pipeline/src/index.js.map +1 -1
- package/dist/packages/pipeline/src/types/config.d.ts +32 -0
- package/dist/skills/catladder-cli/references/commands.md +13 -0
- package/dist/skills/catladder-deploys/SKILL.md +7 -0
- package/dist/skills/catladder-migrate-ci-backend/SKILL.md +7 -2
- package/dist/skills/catladder-pipelines/SKILL.md +27 -1
- package/dist/skills/catladder-secrets/SKILL.md +16 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/apps/cli/commands/project/doctor/checkGithub.ts +1 -1
- package/src/apps/cli/commands/project/setup/setupAccessTokens.ts +3 -2
- package/src/apps/cli/commands/project/setup/setupGithub.ts +1 -1
- package/src/apps/cli/commands/project/setup/setupKubernetes.ts +31 -20
- package/src/commands/index.ts +1 -0
- package/src/commands/project/commandConfigSecrets.ts +1 -1
- package/src/commands/project/commandMrPin.ts +184 -0
- package/src/commands/project/commandSecretsSyncGithub.ts +7 -154
- package/src/commands/project/secrets/commandSecretsPush.ts +2 -5
- package/src/commands/project/secrets/commandSecretsSet.ts +2 -2
- package/src/commands/project/secrets/document.ts +2 -127
- package/src/gcloud/serviceAccounts.ts +16 -7
- package/src/secrets/__tests__/writeSecrets.test.ts +147 -0
- package/src/secrets/github.ts +157 -0
- package/src/secrets/index.ts +2 -0
- package/src/secrets/writeSecrets.ts +138 -0
- package/src/utils/gitlab.ts +34 -7
- package/src/vault/BitwardenVault.ts +10 -1
- package/src/vault/GitlabVault.ts +9 -2
- package/src/vault/VaultManager.ts +3 -2
- package/src/vault/__tests__/BitwardenVault.test.ts +88 -0
- package/src/vault/types.ts +17 -1
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { Config } from "@catladder/pipeline";
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { parse } from "yaml";
|
|
4
|
+
import type { IO } from "../../core/types";
|
|
5
|
+
import { BitwardenVault } from "../BitwardenVault";
|
|
6
|
+
|
|
7
|
+
const { getBwSession, runBw, runBwJson } = vi.hoisted(() => ({
|
|
8
|
+
getBwSession: vi.fn(),
|
|
9
|
+
runBw: vi.fn(),
|
|
10
|
+
runBwJson: vi.fn(),
|
|
11
|
+
}));
|
|
12
|
+
vi.mock("../bw", () => ({ getBwSession, runBw, runBwJson }));
|
|
13
|
+
|
|
14
|
+
const io = { log: vi.fn() } as unknown as IO;
|
|
15
|
+
const config = { customerName: "pan", appName: "app" } as Config;
|
|
16
|
+
const ITEM_NAME = "pan/app/dev/www/secrets.yml";
|
|
17
|
+
|
|
18
|
+
/** the item the vault would edit, or none at all */
|
|
19
|
+
const bwContains = (item?: Record<string, unknown>) =>
|
|
20
|
+
runBwJson.mockImplementation(async (_session: string, args: string[]) =>
|
|
21
|
+
args[1] === "collections"
|
|
22
|
+
? [{ id: "collection-id", name: "catladder", organizationId: "org-id" }]
|
|
23
|
+
: item
|
|
24
|
+
? [item]
|
|
25
|
+
: [],
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
/** the notes of the `bw edit|create item` payload, parsed back */
|
|
29
|
+
const writtenNotes = () => {
|
|
30
|
+
const [, args] = runBw.mock.calls[0];
|
|
31
|
+
const payload = JSON.parse(
|
|
32
|
+
Buffer.from(args[args.length - 1], "base64").toString("utf-8"),
|
|
33
|
+
);
|
|
34
|
+
return parse(payload.notes);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
vi.clearAllMocks();
|
|
39
|
+
getBwSession.mockResolvedValue("session");
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
describe("BitwardenVault.writeSecrets", () => {
|
|
43
|
+
it("merges into the existing note instead of replacing it", async () => {
|
|
44
|
+
bwContains({
|
|
45
|
+
id: "item-id",
|
|
46
|
+
name: ITEM_NAME,
|
|
47
|
+
notes: "API_KEY: sesame\nSMTP_PASSWORD: hunter2\n",
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
await new BitwardenVault(config, {}, false).writeSecrets(io, "dev", "www", {
|
|
51
|
+
// the shape `project setup` writes: one provisioned credential,
|
|
52
|
+
// nothing else — the other secrets must survive it
|
|
53
|
+
GCLOUD_DEPLOY_credentialsKey: '{"type":"service_account"}',
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
expect(runBw.mock.calls[0][1].slice(0, 3)).toEqual([
|
|
57
|
+
"edit",
|
|
58
|
+
"item",
|
|
59
|
+
"item-id",
|
|
60
|
+
]);
|
|
61
|
+
expect(writtenNotes()).toEqual({
|
|
62
|
+
API_KEY: "sesame",
|
|
63
|
+
SMTP_PASSWORD: "hunter2",
|
|
64
|
+
GCLOUD_DEPLOY_credentialsKey: '{"type":"service_account"}',
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("overwrites the values it is given", async () => {
|
|
69
|
+
bwContains({ id: "item-id", name: ITEM_NAME, notes: "API_KEY: old\n" });
|
|
70
|
+
|
|
71
|
+
await new BitwardenVault(config, {}, false).writeSecrets(io, "dev", "www", {
|
|
72
|
+
API_KEY: "rotated",
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
expect(writtenNotes()).toEqual({ API_KEY: "rotated" });
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("creates the item when the env/component has no note yet", async () => {
|
|
79
|
+
bwContains();
|
|
80
|
+
|
|
81
|
+
await new BitwardenVault(config, {}, false).writeSecrets(io, "dev", "www", {
|
|
82
|
+
API_KEY: "sesame",
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
expect(runBw.mock.calls[0][1].slice(0, 2)).toEqual(["create", "item"]);
|
|
86
|
+
expect(writtenNotes()).toEqual({ API_KEY: "sesame" });
|
|
87
|
+
});
|
|
88
|
+
});
|
package/src/vault/types.ts
CHANGED
|
@@ -20,16 +20,32 @@ export type SecretsVault = {
|
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* upserts the secrets of one env and component
|
|
23
|
-
* (keys as declared in the config, not the raw variable names)
|
|
23
|
+
* (keys as declared in the config, not the raw variable names).
|
|
24
|
+
* Upsert, not replace: values that are not part of `secrets` stay
|
|
25
|
+
* untouched.
|
|
24
26
|
*/
|
|
25
27
|
writeSecrets(
|
|
26
28
|
io: IO,
|
|
27
29
|
env: string,
|
|
28
30
|
componentName: string,
|
|
29
31
|
secrets: Record<string, unknown>,
|
|
32
|
+
options?: WriteSecretsOptions,
|
|
30
33
|
): Promise<void>;
|
|
31
34
|
};
|
|
32
35
|
|
|
36
|
+
export type WriteSecretsOptions = {
|
|
37
|
+
/**
|
|
38
|
+
* keep the previous value around where the store supports it (the
|
|
39
|
+
* gitlab store writes `<KEY>_backup_<timestamp>` variables) —
|
|
40
|
+
* a hand-written secret's only undo.
|
|
41
|
+
*
|
|
42
|
+
* Machine-provisioned credentials (service account keys, kubernetes
|
|
43
|
+
* tokens) are regenerated on demand and their old value is worthless,
|
|
44
|
+
* so `project setup` writes them with `backup: false`.
|
|
45
|
+
*/
|
|
46
|
+
backup?: boolean;
|
|
47
|
+
};
|
|
48
|
+
|
|
33
49
|
/**
|
|
34
50
|
* how secret resolution may interact with the vault:
|
|
35
51
|
* - auto (default): contact the vault when the local cache is
|