@intentic/providers 1.0.2
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/LICENSE +21 -0
- package/README.md +26 -0
- package/dist/auth/authentik-api.d.ts +23 -0
- package/dist/auth/authentik-api.d.ts.map +1 -0
- package/dist/auth/authentik-api.js +67 -0
- package/dist/auth/authentik-api.js.map +1 -0
- package/dist/auth/authentik-client.d.ts +4 -0
- package/dist/auth/authentik-client.d.ts.map +1 -0
- package/dist/auth/authentik-client.js +50 -0
- package/dist/auth/authentik-client.js.map +1 -0
- package/dist/auth/authentik.d.ts +4 -0
- package/dist/auth/authentik.d.ts.map +1 -0
- package/dist/auth/authentik.js +132 -0
- package/dist/auth/authentik.js.map +1 -0
- package/dist/backup/backup-restore.d.ts +15 -0
- package/dist/backup/backup-restore.d.ts.map +1 -0
- package/dist/backup/backup-restore.js +51 -0
- package/dist/backup/backup-restore.js.map +1 -0
- package/dist/backup/backup.d.ts +6 -0
- package/dist/backup/backup.d.ts.map +1 -0
- package/dist/backup/backup.js +154 -0
- package/dist/backup/backup.js.map +1 -0
- package/dist/backup/migrate-host.d.ts +6 -0
- package/dist/backup/migrate-host.d.ts.map +1 -0
- package/dist/backup/migrate-host.js +46 -0
- package/dist/backup/migrate-host.js.map +1 -0
- package/dist/core/backing-ssh.d.ts +9 -0
- package/dist/core/backing-ssh.d.ts.map +1 -0
- package/dist/core/backing-ssh.js +67 -0
- package/dist/core/backing-ssh.js.map +1 -0
- package/dist/core/ci-yaml.d.ts +3 -0
- package/dist/core/ci-yaml.d.ts.map +1 -0
- package/dist/core/ci-yaml.js +15 -0
- package/dist/core/ci-yaml.js.map +1 -0
- package/dist/core/guarded-update.d.ts +14 -0
- package/dist/core/guarded-update.d.ts.map +1 -0
- package/dist/core/guarded-update.js +25 -0
- package/dist/core/guarded-update.js.map +1 -0
- package/dist/core/inputs.d.ts +27 -0
- package/dist/core/inputs.d.ts.map +1 -0
- package/dist/core/inputs.js +36 -0
- package/dist/core/inputs.js.map +1 -0
- package/dist/core/ssh-probe.d.ts +5 -0
- package/dist/core/ssh-probe.d.ts.map +1 -0
- package/dist/core/ssh-probe.js +22 -0
- package/dist/core/ssh-probe.js.map +1 -0
- package/dist/core/ssh.d.ts +31 -0
- package/dist/core/ssh.d.ts.map +1 -0
- package/dist/core/ssh.js +186 -0
- package/dist/core/ssh.js.map +1 -0
- package/dist/data/garage-bucket.d.ts +4 -0
- package/dist/data/garage-bucket.d.ts.map +1 -0
- package/dist/data/garage-bucket.js +92 -0
- package/dist/data/garage-bucket.js.map +1 -0
- package/dist/data/garage.d.ts +4 -0
- package/dist/data/garage.d.ts.map +1 -0
- package/dist/data/garage.js +124 -0
- package/dist/data/garage.js.map +1 -0
- package/dist/data/postgres-database.d.ts +4 -0
- package/dist/data/postgres-database.d.ts.map +1 -0
- package/dist/data/postgres-database.js +88 -0
- package/dist/data/postgres-database.js.map +1 -0
- package/dist/data/postgres.d.ts +4 -0
- package/dist/data/postgres.d.ts.map +1 -0
- package/dist/data/postgres.js +106 -0
- package/dist/data/postgres.js.map +1 -0
- package/dist/data/valkey-namespace.d.ts +4 -0
- package/dist/data/valkey-namespace.d.ts.map +1 -0
- package/dist/data/valkey-namespace.js +78 -0
- package/dist/data/valkey-namespace.js.map +1 -0
- package/dist/data/valkey.d.ts +4 -0
- package/dist/data/valkey.d.ts.map +1 -0
- package/dist/data/valkey.js +105 -0
- package/dist/data/valkey.js.map +1 -0
- package/dist/forgejo/ci.d.ts +4 -0
- package/dist/forgejo/ci.d.ts.map +1 -0
- package/dist/forgejo/ci.js +138 -0
- package/dist/forgejo/ci.js.map +1 -0
- package/dist/forgejo/forgejo-api.d.ts +209 -0
- package/dist/forgejo/forgejo-api.d.ts.map +1 -0
- package/dist/forgejo/forgejo-api.fake.d.ts +3 -0
- package/dist/forgejo/forgejo-api.fake.d.ts.map +1 -0
- package/dist/forgejo/forgejo-api.fake.js +31 -0
- package/dist/forgejo/forgejo-api.fake.js.map +1 -0
- package/dist/forgejo/forgejo-api.js +181 -0
- package/dist/forgejo/forgejo-api.js.map +1 -0
- package/dist/forgejo/forgejo-notify.d.ts +4 -0
- package/dist/forgejo/forgejo-notify.d.ts.map +1 -0
- package/dist/forgejo/forgejo-notify.js +103 -0
- package/dist/forgejo/forgejo-notify.js.map +1 -0
- package/dist/forgejo/forgejo-org.d.ts +4 -0
- package/dist/forgejo/forgejo-org.d.ts.map +1 -0
- package/dist/forgejo/forgejo-org.js +43 -0
- package/dist/forgejo/forgejo-org.js.map +1 -0
- package/dist/forgejo/forgejo-runner.d.ts +4 -0
- package/dist/forgejo/forgejo-runner.d.ts.map +1 -0
- package/dist/forgejo/forgejo-runner.js +111 -0
- package/dist/forgejo/forgejo-runner.js.map +1 -0
- package/dist/forgejo/forgejo-team.d.ts +4 -0
- package/dist/forgejo/forgejo-team.d.ts.map +1 -0
- package/dist/forgejo/forgejo-team.js +68 -0
- package/dist/forgejo/forgejo-team.js.map +1 -0
- package/dist/forgejo/forgejo-user.d.ts +4 -0
- package/dist/forgejo/forgejo-user.d.ts.map +1 -0
- package/dist/forgejo/forgejo-user.js +50 -0
- package/dist/forgejo/forgejo-user.js.map +1 -0
- package/dist/forgejo/forgejo.d.ts +4 -0
- package/dist/forgejo/forgejo.d.ts.map +1 -0
- package/dist/forgejo/forgejo.js +169 -0
- package/dist/forgejo/forgejo.js.map +1 -0
- package/dist/forgejo/repo.d.ts +4 -0
- package/dist/forgejo/repo.d.ts.map +1 -0
- package/dist/forgejo/repo.js +80 -0
- package/dist/forgejo/repo.js.map +1 -0
- package/dist/github/gh-ci.d.ts +4 -0
- package/dist/github/gh-ci.d.ts.map +1 -0
- package/dist/github/gh-ci.js +140 -0
- package/dist/github/gh-ci.js.map +1 -0
- package/dist/github/gh-deployment.d.ts +4 -0
- package/dist/github/gh-deployment.d.ts.map +1 -0
- package/dist/github/gh-deployment.js +92 -0
- package/dist/github/gh-deployment.js.map +1 -0
- package/dist/github/gh-repo.d.ts +4 -0
- package/dist/github/gh-repo.d.ts.map +1 -0
- package/dist/github/gh-repo.js +52 -0
- package/dist/github/gh-repo.js.map +1 -0
- package/dist/github/github-api.d.ts +70 -0
- package/dist/github/github-api.d.ts.map +1 -0
- package/dist/github/github-api.js +120 -0
- package/dist/github/github-api.js.map +1 -0
- package/dist/github/github.d.ts +4 -0
- package/dist/github/github.d.ts.map +1 -0
- package/dist/github/github.js +34 -0
- package/dist/github/github.js.map +1 -0
- package/dist/gitlab/gitlab-api.d.ts +77 -0
- package/dist/gitlab/gitlab-api.d.ts.map +1 -0
- package/dist/gitlab/gitlab-api.js +124 -0
- package/dist/gitlab/gitlab-api.js.map +1 -0
- package/dist/gitlab/gitlab.d.ts +4 -0
- package/dist/gitlab/gitlab.d.ts.map +1 -0
- package/dist/gitlab/gitlab.js +34 -0
- package/dist/gitlab/gitlab.js.map +1 -0
- package/dist/gitlab/gl-ci.d.ts +4 -0
- package/dist/gitlab/gl-ci.d.ts.map +1 -0
- package/dist/gitlab/gl-ci.js +130 -0
- package/dist/gitlab/gl-ci.js.map +1 -0
- package/dist/gitlab/gl-deployment.d.ts +4 -0
- package/dist/gitlab/gl-deployment.d.ts.map +1 -0
- package/dist/gitlab/gl-deployment.js +93 -0
- package/dist/gitlab/gl-deployment.js.map +1 -0
- package/dist/gitlab/gl-repo.d.ts +4 -0
- package/dist/gitlab/gl-repo.d.ts.map +1 -0
- package/dist/gitlab/gl-repo.js +61 -0
- package/dist/gitlab/gl-repo.js.map +1 -0
- package/dist/host/host.d.ts +4 -0
- package/dist/host/host.d.ts.map +1 -0
- package/dist/host/host.js +48 -0
- package/dist/host/host.js.map +1 -0
- package/dist/host/workspace.d.ts +4 -0
- package/dist/host/workspace.d.ts.map +1 -0
- package/dist/host/workspace.js +152 -0
- package/dist/host/workspace.js.map +1 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/discord-api.d.ts +31 -0
- package/dist/integrations/discord-api.d.ts.map +1 -0
- package/dist/integrations/discord-api.js +85 -0
- package/dist/integrations/discord-api.js.map +1 -0
- package/dist/integrations/discord.d.ts +4 -0
- package/dist/integrations/discord.d.ts.map +1 -0
- package/dist/integrations/discord.js +133 -0
- package/dist/integrations/discord.js.map +1 -0
- package/dist/integrations/stripe-api.d.ts +8 -0
- package/dist/integrations/stripe-api.d.ts.map +1 -0
- package/dist/integrations/stripe-api.js +16 -0
- package/dist/integrations/stripe-api.js.map +1 -0
- package/dist/integrations/stripe.d.ts +4 -0
- package/dist/integrations/stripe.d.ts.map +1 -0
- package/dist/integrations/stripe.js +28 -0
- package/dist/integrations/stripe.js.map +1 -0
- package/dist/komodo/deployment.d.ts +4 -0
- package/dist/komodo/deployment.d.ts.map +1 -0
- package/dist/komodo/deployment.js +103 -0
- package/dist/komodo/deployment.js.map +1 -0
- package/dist/komodo/komodo-api.d.ts +150 -0
- package/dist/komodo/komodo-api.d.ts.map +1 -0
- package/dist/komodo/komodo-api.js +104 -0
- package/dist/komodo/komodo-api.js.map +1 -0
- package/dist/komodo/komodo-notify.d.ts +4 -0
- package/dist/komodo/komodo-notify.d.ts.map +1 -0
- package/dist/komodo/komodo-notify.js +88 -0
- package/dist/komodo/komodo-notify.js.map +1 -0
- package/dist/komodo/komodo-periphery.d.ts +4 -0
- package/dist/komodo/komodo-periphery.d.ts.map +1 -0
- package/dist/komodo/komodo-periphery.js +92 -0
- package/dist/komodo/komodo-periphery.js.map +1 -0
- package/dist/komodo/komodo-server.d.ts +4 -0
- package/dist/komodo/komodo-server.d.ts.map +1 -0
- package/dist/komodo/komodo-server.js +54 -0
- package/dist/komodo/komodo-server.js.map +1 -0
- package/dist/komodo/komodo-user.d.ts +4 -0
- package/dist/komodo/komodo-user.d.ts.map +1 -0
- package/dist/komodo/komodo-user.js +66 -0
- package/dist/komodo/komodo-user.js.map +1 -0
- package/dist/komodo/komodo.d.ts +4 -0
- package/dist/komodo/komodo.d.ts.map +1 -0
- package/dist/komodo/komodo.js +222 -0
- package/dist/komodo/komodo.js.map +1 -0
- package/dist/network/cf-route.d.ts +5 -0
- package/dist/network/cf-route.d.ts.map +1 -0
- package/dist/network/cf-route.js +74 -0
- package/dist/network/cf-route.js.map +1 -0
- package/dist/network/cloudflare-api.d.ts +85 -0
- package/dist/network/cloudflare-api.d.ts.map +1 -0
- package/dist/network/cloudflare-api.js +110 -0
- package/dist/network/cloudflare-api.js.map +1 -0
- package/dist/network/cloudflare.d.ts +4 -0
- package/dist/network/cloudflare.d.ts.map +1 -0
- package/dist/network/cloudflare.js +29 -0
- package/dist/network/cloudflare.js.map +1 -0
- package/dist/network/tunnel.d.ts +5 -0
- package/dist/network/tunnel.d.ts.map +1 -0
- package/dist/network/tunnel.js +127 -0
- package/dist/network/tunnel.js.map +1 -0
- package/dist/observability/signoz.d.ts +4 -0
- package/dist/observability/signoz.d.ts.map +1 -0
- package/dist/observability/signoz.js +391 -0
- package/dist/observability/signoz.js.map +1 -0
- package/dist/providers.d.ts +25 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +110 -0
- package/dist/providers.js.map +1 -0
- package/dist/services/compose-service.d.ts +34 -0
- package/dist/services/compose-service.d.ts.map +1 -0
- package/dist/services/compose-service.js +150 -0
- package/dist/services/compose-service.js.map +1 -0
- package/dist/services/infisical.d.ts +4 -0
- package/dist/services/infisical.d.ts.map +1 -0
- package/dist/services/infisical.js +72 -0
- package/dist/services/infisical.js.map +1 -0
- package/dist/services/invoiceninja.d.ts +4 -0
- package/dist/services/invoiceninja.d.ts.map +1 -0
- package/dist/services/invoiceninja.js +116 -0
- package/dist/services/invoiceninja.js.map +1 -0
- package/dist/services/openproject.d.ts +4 -0
- package/dist/services/openproject.d.ts.map +1 -0
- package/dist/services/openproject.js +45 -0
- package/dist/services/openproject.js.map +1 -0
- package/dist/services/outline.d.ts +4 -0
- package/dist/services/outline.d.ts.map +1 -0
- package/dist/services/outline.js +121 -0
- package/dist/services/outline.js.map +1 -0
- package/dist/services/paperless.d.ts +4 -0
- package/dist/services/paperless.d.ts.map +1 -0
- package/dist/services/paperless.js +48 -0
- package/dist/services/paperless.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { normalize, starterDockerfile } from "../core/ci-yaml.js";
|
|
3
|
+
import { parseInputs, registryImage } from "../core/inputs.js";
|
|
4
|
+
import { gitlabApi } from "./gitlab-api.js";
|
|
5
|
+
const glCiEnvSchema = z.object({
|
|
6
|
+
name: z.string(),
|
|
7
|
+
branch: z.string(),
|
|
8
|
+
tag: z.string(),
|
|
9
|
+
deploymentId: z.string(),
|
|
10
|
+
port: z.coerce.number(),
|
|
11
|
+
env: z.record(z.string(), z.unknown()).default({}),
|
|
12
|
+
});
|
|
13
|
+
const glCiSchema = z.object({
|
|
14
|
+
url: z.string(),
|
|
15
|
+
owner: z.string(),
|
|
16
|
+
repoName: z.string(),
|
|
17
|
+
token: z.string(),
|
|
18
|
+
registry: z.string(),
|
|
19
|
+
hostAddress: z.string(),
|
|
20
|
+
hostUser: z.string(),
|
|
21
|
+
hostSshKey: z.string(),
|
|
22
|
+
environments: z.array(glCiEnvSchema),
|
|
23
|
+
});
|
|
24
|
+
const parse = (inputs) => parseInputs(glCiSchema, inputs, "gl-ci");
|
|
25
|
+
const CI_FILE_PATH = ".gitlab-ci.yml";
|
|
26
|
+
const DOCKERFILE_PATH = "Dockerfile";
|
|
27
|
+
const VAR_SSH_KEY = "INTENTIC_HOST_SSH_KEY";
|
|
28
|
+
const VAR_HOST_ADDRESS = "INTENTIC_HOST_ADDRESS";
|
|
29
|
+
const VAR_HOST_USER = "INTENTIC_HOST_USER";
|
|
30
|
+
const shellQuote = (value) => `'${value.replace(/'/g, "'\\''")}'`;
|
|
31
|
+
const scriptLine = (command) => ` - ${JSON.stringify(command)}`;
|
|
32
|
+
const jobYaml = (parsed, environment) => {
|
|
33
|
+
const image = registryImage({ registry: parsed.registry, owner: parsed.owner, repoName: parsed.repoName, tag: environment.tag });
|
|
34
|
+
const shaImage = `${parsed.registry}/${parsed.owner}/${parsed.repoName}:$CI_COMMIT_SHA`;
|
|
35
|
+
const envFlags = Object.entries(environment.env)
|
|
36
|
+
.map(([key, value]) => `-e ${key}='${String(value)}'`)
|
|
37
|
+
.join(" ");
|
|
38
|
+
const envStr = envFlags.length > 0 ? ` ${envFlags}` : "";
|
|
39
|
+
const remote = [
|
|
40
|
+
`docker pull ${image}`,
|
|
41
|
+
`docker stop ${environment.deploymentId} || true`,
|
|
42
|
+
`docker rm ${environment.deploymentId} || true`,
|
|
43
|
+
`docker run -d --name ${environment.deploymentId} --restart unless-stopped -p ${environment.port}:${environment.port}${envStr} ${image}`,
|
|
44
|
+
].join(" && ");
|
|
45
|
+
return [
|
|
46
|
+
`deploy-${environment.name}:`,
|
|
47
|
+
" stage: deploy",
|
|
48
|
+
" image: docker:27",
|
|
49
|
+
" services:",
|
|
50
|
+
" - docker:27-dind",
|
|
51
|
+
" rules:",
|
|
52
|
+
` - if: '$CI_COMMIT_BRANCH == "${environment.branch}"'`,
|
|
53
|
+
" before_script:",
|
|
54
|
+
scriptLine('docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"'),
|
|
55
|
+
scriptLine("apk add --no-cache openssh-client"),
|
|
56
|
+
" script:",
|
|
57
|
+
scriptLine(`docker build -t ${image} -t ${shaImage} .`),
|
|
58
|
+
scriptLine(`docker push ${image}`),
|
|
59
|
+
scriptLine(`docker push ${shaImage}`),
|
|
60
|
+
scriptLine('mkdir -p ~/.ssh && printf \'%s\\n\' "$INTENTIC_HOST_SSH_KEY" > ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa'),
|
|
61
|
+
scriptLine(`ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa "$INTENTIC_HOST_USER@$INTENTIC_HOST_ADDRESS" ${shellQuote(remote)}`),
|
|
62
|
+
].join("\n");
|
|
63
|
+
};
|
|
64
|
+
const gitlabCiYaml = (parsed) => [
|
|
65
|
+
"# Generated by intentic: build → push to the GitLab Container Registry → deploy via SSH.",
|
|
66
|
+
"stages:",
|
|
67
|
+
" - deploy",
|
|
68
|
+
"",
|
|
69
|
+
...parsed.environments.map((environment) => jobYaml(parsed, environment)),
|
|
70
|
+
"",
|
|
71
|
+
].join("\n");
|
|
72
|
+
export const createGlCiProvider = (api = gitlabApi) => ({
|
|
73
|
+
read: async (inputs, ctx) => {
|
|
74
|
+
if (typeof inputs["token"] !== "string" || typeof inputs["owner"] !== "string") {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
const parsed = parse(inputs);
|
|
78
|
+
try {
|
|
79
|
+
const file = await api.readFile({
|
|
80
|
+
url: parsed.url,
|
|
81
|
+
token: parsed.token,
|
|
82
|
+
owner: parsed.owner,
|
|
83
|
+
name: parsed.repoName,
|
|
84
|
+
path: CI_FILE_PATH,
|
|
85
|
+
branch: parsed.environments[0]?.branch ?? "main",
|
|
86
|
+
});
|
|
87
|
+
if (file === undefined) {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
return { outputs: {}, detail: { ci: file.content } };
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
ctx.log(`gl-ci "${ctx.id}": GitLab not reachable yet: ${String(error)}`);
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
diff: (inputs, observed) => {
|
|
98
|
+
const ci = observed.detail?.["ci"];
|
|
99
|
+
if (typeof ci !== "string" || normalize(ci) !== normalize(gitlabCiYaml(parse(inputs)))) {
|
|
100
|
+
return { action: "update", reason: ".gitlab-ci.yml differs from desired" };
|
|
101
|
+
}
|
|
102
|
+
return { action: "noop" };
|
|
103
|
+
},
|
|
104
|
+
apply: async (inputs) => {
|
|
105
|
+
const parsed = parse(inputs);
|
|
106
|
+
const common = { url: parsed.url, token: parsed.token, owner: parsed.owner, name: parsed.repoName };
|
|
107
|
+
const branch = parsed.environments[0]?.branch ?? "main";
|
|
108
|
+
await api.setCiVariable({ ...common, key: VAR_SSH_KEY, value: parsed.hostSshKey });
|
|
109
|
+
await api.setCiVariable({ ...common, key: VAR_HOST_ADDRESS, value: parsed.hostAddress });
|
|
110
|
+
await api.setCiVariable({ ...common, key: VAR_HOST_USER, value: parsed.hostUser });
|
|
111
|
+
const dockerfile = await api.readFile({ ...common, path: DOCKERFILE_PATH, branch });
|
|
112
|
+
if (dockerfile === undefined) {
|
|
113
|
+
await api.commitFile({ ...common, path: DOCKERFILE_PATH, content: starterDockerfile(), branch, message: "intentic: starter Dockerfile" });
|
|
114
|
+
}
|
|
115
|
+
await api.commitFile({ ...common, path: CI_FILE_PATH, content: gitlabCiYaml(parsed), branch, message: "intentic: GitLab CI pipeline" });
|
|
116
|
+
return {};
|
|
117
|
+
},
|
|
118
|
+
delete: async (inputs) => {
|
|
119
|
+
if (typeof inputs["token"] !== "string" || typeof inputs["owner"] !== "string") {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const parsed = parse(inputs);
|
|
123
|
+
const common = { url: parsed.url, token: parsed.token, owner: parsed.owner, name: parsed.repoName };
|
|
124
|
+
await api.deleteFile({ ...common, path: CI_FILE_PATH, branch: parsed.environments[0]?.branch ?? "main", message: "intentic: remove CI pipeline" });
|
|
125
|
+
await api.deleteCiVariable({ ...common, key: VAR_SSH_KEY });
|
|
126
|
+
await api.deleteCiVariable({ ...common, key: VAR_HOST_ADDRESS });
|
|
127
|
+
await api.deleteCiVariable({ ...common, key: VAR_HOST_USER });
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
//# sourceMappingURL=gl-ci.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gl-ci.js","sourceRoot":"","sources":["../../src/gitlab/gl-ci.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gl-deployment.d.ts","sourceRoot":"","sources":["../../src/gitlab/gl-deployment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AA8BlD,eAAO,MAAM,0BAA0B,GAAI,MAAK,WAAyB,KAAG,QAmE1E,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { parseInputs, registryImage, sshSchema, sshTarget } from "../core/inputs.js";
|
|
3
|
+
import { sshExecutor } from "../core/ssh.js";
|
|
4
|
+
const glDeploymentSchema = z
|
|
5
|
+
.object({
|
|
6
|
+
owner: z.string(),
|
|
7
|
+
repoName: z.string(),
|
|
8
|
+
tag: z.string(),
|
|
9
|
+
registry: z.string(),
|
|
10
|
+
domain: z.string(),
|
|
11
|
+
internalIp: z.string(),
|
|
12
|
+
port: z.coerce.number(),
|
|
13
|
+
env: z.record(z.string(), z.unknown()).default({}),
|
|
14
|
+
})
|
|
15
|
+
.merge(sshSchema);
|
|
16
|
+
const parse = (inputs) => parseInputs(glDeploymentSchema, inputs, "gl-deployment");
|
|
17
|
+
const containerName = (ctx) => ctx.id;
|
|
18
|
+
const glImage = (parsed) => registryImage({ registry: parsed.registry, owner: parsed.owner, repoName: parsed.repoName, tag: parsed.tag });
|
|
19
|
+
const outputsFor = (parsed) => ({
|
|
20
|
+
url: `https://${parsed.domain}`,
|
|
21
|
+
internalUrl: `http://${parsed.internalIp}:${parsed.port}`,
|
|
22
|
+
});
|
|
23
|
+
export const createGlDeploymentProvider = (ssh = sshExecutor) => ({
|
|
24
|
+
read: async (inputs, ctx) => {
|
|
25
|
+
if (typeof inputs["address"] !== "string") {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
const parsed = parse(inputs);
|
|
29
|
+
const name = containerName(ctx);
|
|
30
|
+
try {
|
|
31
|
+
const session = await ssh.connect(sshTarget(parsed));
|
|
32
|
+
try {
|
|
33
|
+
const result = await session.exec(`docker inspect --format '{{.State.Running}}' ${name} 2>/dev/null || echo "not-found"`);
|
|
34
|
+
const output = result.stdout.trim();
|
|
35
|
+
if (output === "not-found" || output === "") {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
return { outputs: outputsFor(parsed), detail: { running: output === "true" } };
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
await session.dispose();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
ctx.log(`gl-deployment "${ctx.id}": host not reachable yet: ${String(error)}`);
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
diff: (inputs, observed) => {
|
|
50
|
+
if (observed.detail?.["running"] !== true) {
|
|
51
|
+
return { action: "update", reason: "container is not running" };
|
|
52
|
+
}
|
|
53
|
+
return { action: "noop" };
|
|
54
|
+
},
|
|
55
|
+
apply: async (inputs, _observed, ctx) => {
|
|
56
|
+
const parsed = parse(inputs);
|
|
57
|
+
const name = containerName(ctx);
|
|
58
|
+
const img = glImage(parsed);
|
|
59
|
+
const envFlags = Object.entries(parsed.env)
|
|
60
|
+
.map(([key, value]) => `-e ${key}='${String(value)}'`)
|
|
61
|
+
.join(" ");
|
|
62
|
+
const envStr = envFlags.length > 0 ? ` ${envFlags}` : "";
|
|
63
|
+
const script = [
|
|
64
|
+
`docker pull ${img}`,
|
|
65
|
+
`docker stop ${name} 2>/dev/null || true`,
|
|
66
|
+
`docker rm ${name} 2>/dev/null || true`,
|
|
67
|
+
`docker run -d --name ${name} --restart unless-stopped -p ${parsed.port}:${parsed.port}${envStr} ${img}`,
|
|
68
|
+
].join(" && ");
|
|
69
|
+
const session = await ssh.connect(sshTarget(parsed));
|
|
70
|
+
try {
|
|
71
|
+
await session.exec(script);
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
await session.dispose();
|
|
75
|
+
}
|
|
76
|
+
return outputsFor(parsed);
|
|
77
|
+
},
|
|
78
|
+
delete: async (inputs, ctx) => {
|
|
79
|
+
if (typeof inputs["address"] !== "string") {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const parsed = parse(inputs);
|
|
83
|
+
const name = containerName(ctx);
|
|
84
|
+
const session = await ssh.connect(sshTarget(parsed));
|
|
85
|
+
try {
|
|
86
|
+
await session.exec(`docker stop ${name} 2>/dev/null || true && docker rm ${name} 2>/dev/null || true`);
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
await session.dispose();
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=gl-deployment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gl-deployment.js","sourceRoot":"","sources":["../../src/gitlab/gl-deployment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAErF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,kBAAkB,GAAG,CAAC;KACvB,MAAM,CAAC;IACJ,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE;IACvB,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACrD,CAAC;KACD,KAAK,CAAC,SAAS,CAAC,CAAC;AAEtB,MAAM,KAAK,GAAG,CAAC,MAAsB,EAAsB,EAAE,CAAC,WAAW,CAAC,kBAAkB,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;AAEvH,MAAM,aAAa,GAAG,CAAC,GAAmB,EAAU,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AAC9D,MAAM,OAAO,GAAG,CAAC,MAA0B,EAAU,EAAE,CACnD,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AAElH,MAAM,UAAU,GAAG,CAAC,MAA0B,EAA2B,EAAE,CAAC,CAAC;IACzE,GAAG,EAAE,WAAW,MAAM,CAAC,MAAM,EAAE;IAC/B,WAAW,EAAE,UAAU,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,EAAE;CAC5D,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,MAAmB,WAAW,EAAY,EAAE,CAAC,CAAC;IACrF,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QACxB,IAAI,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC;YACxC,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,gDAAgD,IAAI,kCAAkC,CAAC,CAAC;gBAC1H,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpC,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;oBAC1C,OAAO,SAAS,CAAC;gBACrB,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,EAAE,CAAC;YACnF,CAAC;oBAAS,CAAC;gBACP,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YAC5B,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,GAAG,CAAC,GAAG,CAAC,kBAAkB,GAAG,CAAC,EAAE,8BAA8B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC/E,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;IACD,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;QACvB,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;YACxC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;QACpE,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC9B,CAAC;IACD,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;aACrD,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEzD,MAAM,MAAM,GAAG;YACX,eAAe,GAAG,EAAE;YACpB,eAAe,IAAI,sBAAsB;YACzC,aAAa,IAAI,sBAAsB;YACvC,wBAAwB,IAAI,gCAAgC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,IAAI,GAAG,EAAE;SAC3G,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEf,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC;YACD,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;gBAAS,CAAC;YACP,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;QACD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC1B,IAAI,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC;YACxC,OAAO;QACX,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC;YACD,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,qCAAqC,IAAI,sBAAsB,CAAC,CAAC;QAC3G,CAAC;gBAAS,CAAC;YACP,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;CACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gl-repo.d.ts","sourceRoot":"","sources":["../../src/gitlab/gl-repo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAGjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAwBjD,eAAO,MAAM,oBAAoB,GAAI,MAAK,SAAqB,KAAG,QA0ChE,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { parseInputs } from "../core/inputs.js";
|
|
3
|
+
import { gitlabApi } from "./gitlab-api.js";
|
|
4
|
+
const glRepoSchema = z.object({
|
|
5
|
+
name: z.string(),
|
|
6
|
+
owner: z.string(),
|
|
7
|
+
private: z.boolean(),
|
|
8
|
+
url: z.string(),
|
|
9
|
+
token: z.string(),
|
|
10
|
+
});
|
|
11
|
+
const parse = (inputs) => parseInputs(glRepoSchema, inputs, "gl-repo");
|
|
12
|
+
const hostOf = (url) => url.replace(/^https?:\/\//, "").replace(/\/+$/, "");
|
|
13
|
+
const outputsFor = (parsed) => ({
|
|
14
|
+
cloneUrl: `https://${hostOf(parsed.url)}/${parsed.owner}/${parsed.name}.git`,
|
|
15
|
+
sshUrl: `git@${hostOf(parsed.url)}:${parsed.owner}/${parsed.name}.git`,
|
|
16
|
+
});
|
|
17
|
+
export const createGlRepoProvider = (api = gitlabApi) => ({
|
|
18
|
+
read: async (inputs, ctx) => {
|
|
19
|
+
if (typeof inputs["token"] !== "string" || typeof inputs["owner"] !== "string") {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
const parsed = parse(inputs);
|
|
23
|
+
try {
|
|
24
|
+
const project = await api.findProject({ url: parsed.url, token: parsed.token, owner: parsed.owner, name: parsed.name });
|
|
25
|
+
if (project === undefined) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
return { outputs: outputsFor(parsed) };
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
ctx.log(`gl-repo "${ctx.id}": GitLab not reachable yet: ${String(error)}`);
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
diff: () => ({ action: "noop" }),
|
|
36
|
+
apply: async (inputs) => {
|
|
37
|
+
const parsed = parse(inputs);
|
|
38
|
+
const existing = await api.findProject({ url: parsed.url, token: parsed.token, owner: parsed.owner, name: parsed.name });
|
|
39
|
+
if (existing === undefined) {
|
|
40
|
+
const user = await api.getAuthenticatedUser({ url: parsed.url, token: parsed.token });
|
|
41
|
+
const ownerIsGroup = parsed.owner !== user.username;
|
|
42
|
+
await api.createProject({
|
|
43
|
+
url: parsed.url,
|
|
44
|
+
token: parsed.token,
|
|
45
|
+
owner: parsed.owner,
|
|
46
|
+
name: parsed.name,
|
|
47
|
+
private: parsed.private,
|
|
48
|
+
ownerIsGroup,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return outputsFor(parsed);
|
|
52
|
+
},
|
|
53
|
+
delete: async (inputs) => {
|
|
54
|
+
if (typeof inputs["token"] !== "string" || typeof inputs["owner"] !== "string") {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const parsed = parse(inputs);
|
|
58
|
+
await api.deleteProject({ url: parsed.url, token: parsed.token, owner: parsed.owner, name: parsed.name });
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=gl-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gl-repo.js","sourceRoot":"","sources":["../../src/gitlab/gl-repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/host/host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,gBAAgB,CAAC;AAyB9D,eAAO,MAAM,kBAAkB,GAAI,WAAU,WAAyB,KAAG,QA+BvE,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { parseInputs, sshSchema, sshTarget } from "../core/inputs.js";
|
|
2
|
+
import { sshExecutor } from "../core/ssh.js";
|
|
3
|
+
const parse = (inputs) => parseInputs(sshSchema, inputs, "host");
|
|
4
|
+
const gather = async (session, address) => {
|
|
5
|
+
const docker = await session.exec("docker version --format '{{.Server.Version}}'");
|
|
6
|
+
if (docker.code !== 0) {
|
|
7
|
+
throw new Error(`host is not Docker-ready: \`docker version\` exited ${docker.code}: ${docker.stderr.trim()}`);
|
|
8
|
+
}
|
|
9
|
+
const route = await session.exec("ip -4 -o route get 1.1.1.1 | awk '{print $7; exit}'");
|
|
10
|
+
if (route.code !== 0) {
|
|
11
|
+
throw new Error(`failed to read host internal ip: exited ${route.code}: ${route.stderr.trim()}`);
|
|
12
|
+
}
|
|
13
|
+
return { internalIp: route.stdout.trim(), publicIp: address };
|
|
14
|
+
};
|
|
15
|
+
export const createHostProvider = (executor = sshExecutor) => ({
|
|
16
|
+
read: async (inputs, ctx) => {
|
|
17
|
+
const parsed = parse(inputs);
|
|
18
|
+
let session;
|
|
19
|
+
try {
|
|
20
|
+
session = await executor.connect(sshTarget(parsed));
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
ctx.log(`host "${ctx.id}" is not reachable over SSH, treating as not-yet-created: ${String(error)}`);
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
return { outputs: await gather(session, parsed.address) };
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
await session.dispose();
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
diff: () => ({ action: "noop" }),
|
|
34
|
+
apply: async (inputs) => {
|
|
35
|
+
const parsed = parse(inputs);
|
|
36
|
+
const session = await executor.connect(sshTarget(parsed));
|
|
37
|
+
try {
|
|
38
|
+
return await gather(session, parsed.address);
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
await session.dispose();
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
delete: async (_inputs, ctx) => {
|
|
45
|
+
ctx.log(`host "${ctx.id}" removed from desired state — owned infra is never torn down by intentic`);
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/host/host.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7C,MAAM,KAAK,GAAG,CAAC,MAAsB,EAAc,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAK7F,MAAM,MAAM,GAAG,KAAK,EAAE,OAAmB,EAAE,OAAe,EAAoC,EAAE;IAC5F,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IACnF,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,uDAAuD,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnH,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACxF,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAClE,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,WAAwB,WAAW,EAAY,EAAE,CAAC,CAAC;IAClF,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,OAAmB,CAAC;QACxB,IAAI,CAAC;YACD,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,GAAG,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,6DAA6D,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACrG,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,IAAI,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,CAAC;gBAAS,CAAC;YACP,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IACD,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAChC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACpB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC;YACD,OAAO,MAAM,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC;gBAAS,CAAC;YACP,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IAGD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;QAC3B,GAAG,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,2EAA2E,CAAC,CAAC;IACxG,CAAC;CACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/host/workspace.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,gBAAgB,CAAC;AAsG9D,eAAO,MAAM,uBAAuB,GAAI,WAAU,WAAyB,KAAG,QA6G5E,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { parseInputs, sshSchema, sshTarget } from "../core/inputs.js";
|
|
4
|
+
import { sshExecutor } from "../core/ssh.js";
|
|
5
|
+
const toolSchema = z.object({ name: z.string(), url: z.string(), token: z.string() });
|
|
6
|
+
const workspaceSchema = sshSchema.extend({
|
|
7
|
+
internalIp: z.string(),
|
|
8
|
+
domain: z.string(),
|
|
9
|
+
zone: z.string(),
|
|
10
|
+
previewPort: z.coerce.number(),
|
|
11
|
+
daemonPort: z.coerce.number(),
|
|
12
|
+
network: z.string(),
|
|
13
|
+
image: z.string(),
|
|
14
|
+
agentBaseUrl: z.string().optional(),
|
|
15
|
+
tools: z.array(toolSchema).optional(),
|
|
16
|
+
dockerfile: z.string().optional(),
|
|
17
|
+
});
|
|
18
|
+
const parse = (inputs) => parseInputs(workspaceSchema, inputs, "workspace");
|
|
19
|
+
const CONTAINER = "intentic-sandbox-workspace";
|
|
20
|
+
const WORKSPACE_VOLUME = "intentic-workspace-workspace";
|
|
21
|
+
const toolsDigest = (tools) => tools === undefined || tools.length === 0 ? "" : createHash("sha256").update(JSON.stringify(tools)).digest("hex").slice(0, 16);
|
|
22
|
+
const environmentDigest = (dockerfile) => createHash("sha256").update(dockerfile).digest("hex");
|
|
23
|
+
const desiredImage = (parsed) => parsed.dockerfile === undefined ? parsed.image : `intentic-sandbox-env:${environmentDigest(parsed.dockerfile).slice(0, 12)}`;
|
|
24
|
+
const RUNTIME_ALLOWLIST = new Set(["--device=/dev/net/tun", "--cap-add=NET_ADMIN"]);
|
|
25
|
+
const RUNTIME_DIRECTIVE = "# intentic:runtime ";
|
|
26
|
+
const runtimeFlags = (dockerfile) => {
|
|
27
|
+
if (dockerfile === undefined) {
|
|
28
|
+
return "";
|
|
29
|
+
}
|
|
30
|
+
const flags = new Set();
|
|
31
|
+
for (const line of dockerfile.split("\n")) {
|
|
32
|
+
if (!line.startsWith(RUNTIME_DIRECTIVE)) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
for (const token of line.slice(RUNTIME_DIRECTIVE.length).trim().split(/\s+/)) {
|
|
36
|
+
if (!RUNTIME_ALLOWLIST.has(token)) {
|
|
37
|
+
throw new Error(`unsupported runtime directive in the workspace overlay: ${token}`);
|
|
38
|
+
}
|
|
39
|
+
flags.add(token);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return flags.size === 0 ? "" : `${[...flags].join(" ")} `;
|
|
43
|
+
};
|
|
44
|
+
const internalUrl = (parsed) => `http://${parsed.internalIp}:${parsed.daemonPort}`;
|
|
45
|
+
const outputsFor = (parsed) => ({
|
|
46
|
+
internalUrl: internalUrl(parsed),
|
|
47
|
+
healthUrl: `${internalUrl(parsed)}/health`,
|
|
48
|
+
previewBase: parsed.zone,
|
|
49
|
+
});
|
|
50
|
+
const running = async (session) => {
|
|
51
|
+
const result = await session.exec(`docker ps --filter "name=^${CONTAINER}$" --format '{{.Names}}'`);
|
|
52
|
+
return result.stdout.trim() === CONTAINER;
|
|
53
|
+
};
|
|
54
|
+
const runningImage = async (session) => {
|
|
55
|
+
const result = await session.exec(`docker inspect --format '{{.Config.Image}}' ${CONTAINER} 2>/dev/null || true`);
|
|
56
|
+
return result.stdout.trim();
|
|
57
|
+
};
|
|
58
|
+
const runningToolsDigest = async (session) => {
|
|
59
|
+
const result = await session.exec(`docker inspect --format '{{index .Config.Labels "intentic.tools"}}' ${CONTAINER} 2>/dev/null || true`);
|
|
60
|
+
return result.stdout.trim();
|
|
61
|
+
};
|
|
62
|
+
export const createWorkspaceProvider = (executor = sshExecutor) => ({
|
|
63
|
+
read: async (inputs, ctx) => {
|
|
64
|
+
const parsed = parse(inputs);
|
|
65
|
+
let session;
|
|
66
|
+
try {
|
|
67
|
+
session = await executor.connect(sshTarget(parsed));
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
ctx.log(`workspace "${ctx.id}": host not reachable over SSH, treating as not-yet-created: ${String(error)}`);
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
if (!(await running(session))) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
return { outputs: outputsFor(parsed), detail: { image: await runningImage(session), tools: await runningToolsDigest(session) } };
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
await session.dispose();
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
diff: (inputs, observed) => {
|
|
84
|
+
const parsed = parse(inputs);
|
|
85
|
+
const image = desiredImage(parsed);
|
|
86
|
+
if (observed.detail?.["image"] !== image) {
|
|
87
|
+
return {
|
|
88
|
+
action: "update",
|
|
89
|
+
reason: `workspace sandbox image differs (running ${String(observed.detail?.["image"])}, want ${image})`,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const wantTools = toolsDigest(parsed.tools);
|
|
93
|
+
if (observed.detail?.["tools"] !== wantTools) {
|
|
94
|
+
return {
|
|
95
|
+
action: "update",
|
|
96
|
+
reason: `workspace agent tools changed (running ${String(observed.detail?.["tools"])}, want ${wantTools})`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
return { action: "noop" };
|
|
100
|
+
},
|
|
101
|
+
apply: async (inputs, _observed, ctx) => {
|
|
102
|
+
const parsed = parse(inputs);
|
|
103
|
+
const runtime = runtimeFlags(parsed.dockerfile);
|
|
104
|
+
const session = await executor.connect(sshTarget(parsed));
|
|
105
|
+
try {
|
|
106
|
+
const image = desiredImage(parsed);
|
|
107
|
+
let environmentEnv = ``;
|
|
108
|
+
if (parsed.dockerfile !== undefined) {
|
|
109
|
+
const build = await session.exec(`printf '%s' ${Buffer.from(parsed.dockerfile).toString("base64")} | base64 -d | docker build -t ${image} -`);
|
|
110
|
+
if (build.code !== 0) {
|
|
111
|
+
throw new Error(`failed to build the workspace overlay image on host: exited ${build.code}: ${build.stderr.trim()}`);
|
|
112
|
+
}
|
|
113
|
+
environmentEnv = ` -e SANDBOX_ENVIRONMENT_HASH=${environmentDigest(parsed.dockerfile)}`;
|
|
114
|
+
}
|
|
115
|
+
await session.exec(`docker network inspect ${parsed.network} >/dev/null 2>&1 || docker network create ${parsed.network}`);
|
|
116
|
+
const agentEnv = parsed.agentBaseUrl !== undefined ? ` -e ANTHROPIC_BASE_URL=${parsed.agentBaseUrl}` : ``;
|
|
117
|
+
const digest = toolsDigest(parsed.tools);
|
|
118
|
+
const toolsEnv = parsed.tools !== undefined && parsed.tools.length > 0
|
|
119
|
+
? ` -e INTENTIC_AGENT_TOOLS=${Buffer.from(JSON.stringify(parsed.tools)).toString("base64")}`
|
|
120
|
+
: ``;
|
|
121
|
+
const run = await session.exec(`(docker logs --tail 2000 ${CONTAINER} > /opt/intentic/workspace-previous.log 2>&1 || true) && ` +
|
|
122
|
+
`(docker rm -f ${CONTAINER} 2>/dev/null || true) && ` +
|
|
123
|
+
`docker run -d --restart unless-stopped --name ${CONTAINER} --label intentic.id=${ctx.id} --label intentic.tools=${digest} ` +
|
|
124
|
+
`--network ${parsed.network} --add-host host.docker.internal:host-gateway ` +
|
|
125
|
+
`--log-opt max-size=10m --log-opt max-file=3 ` +
|
|
126
|
+
runtime +
|
|
127
|
+
`-p ${parsed.internalIp}:${parsed.previewPort}:${parsed.previewPort} -p ${parsed.internalIp}:${parsed.daemonPort}:${parsed.daemonPort} ` +
|
|
128
|
+
`-v ${WORKSPACE_VOLUME}:/work ` +
|
|
129
|
+
`-e WORKSPACE_ROOT=/work -e SANDBOX_HOST=0.0.0.0 -e SANDBOX_PORT=${parsed.daemonPort} ` +
|
|
130
|
+
`-e PREVIEW_PORT=${parsed.previewPort} ` +
|
|
131
|
+
`-e SANDBOX_NAME=${CONTAINER} -e SANDBOX_IMAGE=${image}${environmentEnv}${agentEnv}${toolsEnv} ${image}`);
|
|
132
|
+
if (run.code !== 0) {
|
|
133
|
+
throw new Error(`failed to start workspace sandbox on host: exited ${run.code}: ${run.stderr.trim()}`);
|
|
134
|
+
}
|
|
135
|
+
return outputsFor(parsed);
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
await session.dispose();
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
delete: async (inputs) => {
|
|
142
|
+
const parsed = parse(inputs);
|
|
143
|
+
const session = await executor.connect(sshTarget(parsed));
|
|
144
|
+
try {
|
|
145
|
+
await session.exec(`docker rm -f ${CONTAINER} 2>/dev/null || true`);
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
await session.dispose();
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/host/workspace.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export { createAuthentikProvider } from "./auth/authentik.js";
|
|
2
|
+
export { type AuthentikApi, authentikApi } from "./auth/authentik-api.js";
|
|
3
|
+
export { createAuthentikClientProvider } from "./auth/authentik-client.js";
|
|
4
|
+
export { createBackupProvider, isLocalRepo } from "./backup/backup.js";
|
|
5
|
+
export { type RestoreArgs, type RestoreScope, restoreBackup } from "./backup/backup-restore.js";
|
|
6
|
+
export { managedContainers, quiesceHost, snapshotNow, streamRepoVolume } from "./backup/migrate-host.js";
|
|
7
|
+
export { parseInputs, sshSchema, sshTarget } from "./core/inputs.js";
|
|
8
|
+
export type { HostKeyStore, SshExecutor, SshResult, SshSession, SshTarget } from "./core/ssh.js";
|
|
9
|
+
export { createSshExecutor, inMemoryHostKeyStore, sshExecutor, verifyHostKey } from "./core/ssh.js";
|
|
10
|
+
export { createSshProbe, hostTarget } from "./core/ssh-probe.js";
|
|
11
|
+
export { createGarageProvider } from "./data/garage.js";
|
|
12
|
+
export { createGarageBucketProvider } from "./data/garage-bucket.js";
|
|
13
|
+
export { createCiProvider } from "./forgejo/ci.js";
|
|
14
|
+
export { createForgejoProvider } from "./forgejo/forgejo.js";
|
|
15
|
+
export { fakeForgejoApi } from "./forgejo/forgejo-api.fake.js";
|
|
16
|
+
export type { ForgejoApi, ForgejoHook, ForgejoRepo } from "./forgejo/forgejo-api.js";
|
|
17
|
+
export { forgejoApi } from "./forgejo/forgejo-api.js";
|
|
18
|
+
export { createForgejoNotifyProvider } from "./forgejo/forgejo-notify.js";
|
|
19
|
+
export { createForgejoRunnerProvider } from "./forgejo/forgejo-runner.js";
|
|
20
|
+
export { createRepoProvider } from "./forgejo/repo.js";
|
|
21
|
+
export { createGhCiProvider } from "./github/gh-ci.js";
|
|
22
|
+
export { createGhDeploymentProvider } from "./github/gh-deployment.js";
|
|
23
|
+
export { createGhRepoProvider } from "./github/gh-repo.js";
|
|
24
|
+
export { createGitHubProvider } from "./github/github.js";
|
|
25
|
+
export type { GitHubApi } from "./github/github-api.js";
|
|
26
|
+
export { githubApi } from "./github/github-api.js";
|
|
27
|
+
export { createGlCiProvider } from "./gitlab/gl-ci.js";
|
|
28
|
+
export { createGlDeploymentProvider } from "./gitlab/gl-deployment.js";
|
|
29
|
+
export { createGlRepoProvider } from "./gitlab/gl-repo.js";
|
|
30
|
+
export { createGitLabProvider } from "./gitlab/gitlab.js";
|
|
31
|
+
export type { GitLabApi } from "./gitlab/gitlab-api.js";
|
|
32
|
+
export { gitlabApi } from "./gitlab/gitlab-api.js";
|
|
33
|
+
export { createHostProvider } from "./host/host.js";
|
|
34
|
+
export { createDiscordProvider } from "./integrations/discord.js";
|
|
35
|
+
export type { DiscordApi, DiscordChannel, DiscordGuild, DiscordWebhook } from "./integrations/discord-api.js";
|
|
36
|
+
export { discordApi } from "./integrations/discord-api.js";
|
|
37
|
+
export { createStripeProvider } from "./integrations/stripe.js";
|
|
38
|
+
export { type StripeAccount, type StripeApi, stripeApi } from "./integrations/stripe-api.js";
|
|
39
|
+
export { createDeploymentProvider } from "./komodo/deployment.js";
|
|
40
|
+
export { createKomodoProvider } from "./komodo/komodo.js";
|
|
41
|
+
export type { AlerterConfig, AlerterEndpoint, DeploymentConfig, KomodoApi, KomodoResource, ResourceTarget } from "./komodo/komodo-api.js";
|
|
42
|
+
export { komodoApi } from "./komodo/komodo-api.js";
|
|
43
|
+
export { createKomodoNotifyProvider } from "./komodo/komodo-notify.js";
|
|
44
|
+
export { createCfRouteProvider } from "./network/cf-route.js";
|
|
45
|
+
export { createCloudflareProvider } from "./network/cloudflare.js";
|
|
46
|
+
export type { CloudflareApi, IngressRule } from "./network/cloudflare-api.js";
|
|
47
|
+
export { cloudflareApi } from "./network/cloudflare-api.js";
|
|
48
|
+
export { createTunnelProvider } from "./network/tunnel.js";
|
|
49
|
+
export type { ProviderDeps } from "./providers.js";
|
|
50
|
+
export { createProviders } from "./providers.js";
|
|
51
|
+
//# sourceMappingURL=index.d.ts.map
|