Skip to content

Commit c8520dc

Browse files
committed
Add ghcr source and add pullSecret
1 parent 1f0cf68 commit c8520dc

File tree

6 files changed

+389
-16
lines changed

6 files changed

+389
-16
lines changed

package-lock.json

Lines changed: 166 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"@auth/prisma-adapter": "^2.5.2",
1717
"@deploy-cat/heroicons-solid": "^2.1.1",
1818
"@kubernetes/client-node": "^0.18.1",
19+
"@octokit/rest": "^21.0.2",
1920
"@prisma/client": "^5.19.1",
2021
"@solid-mediakit/auth": "^2.1.3",
2122
"@solidjs/router": "^0.13.1",

src/components/cloud/CreateServiceForm.tsx

Lines changed: 65 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,63 @@ import { knative } from "~/lib/k8s";
44
import { EnvVarsInput } from "../EnvVarsInput";
55
import { ScalingInput } from "../ScalingInput";
66
import { ResourcesInput } from "../ResourcesInput";
7-
import { getUser } from "~/lib/auth";
7+
import { getUser, getAccount } from "~/lib/auth";
88
import type { Service } from "~/lib/knative";
99
import { toNumber } from "~/lib/knative";
10+
import { SourceInput } from "./service/SourceInput";
11+
import { k8sCore } from "~/lib/k8s";
12+
13+
const ensureGithubPullSecret = async (namespace: string) => {
14+
"use server";
15+
const secretName = "pull-secret-ghcr";
16+
try {
17+
await k8sCore.readNamespacedSecret(secretName, namespace);
18+
} catch (e) {
19+
const user = await getUser();
20+
const accout = await getAccount();
21+
22+
const username = user.name;
23+
const token = accout.access_token;
24+
const email = user.email;
25+
26+
await k8sCore.createNamespacedSecret(namespace, {
27+
apiVersion: "v1",
28+
kind: "Secret",
29+
metadata: {
30+
name: secretName,
31+
labels: {
32+
"app.kubernetes.io/managed-by": "deploycat",
33+
},
34+
},
35+
type: "kubernetes.io/dockerconfigjson",
36+
data: {
37+
".dockerconfigjson": Buffer.from(
38+
JSON.stringify({
39+
auths: {
40+
"ghcr.io": {
41+
username: username,
42+
password: token,
43+
email: email,
44+
auth: Buffer.from(`${username}:${token}`).toString("base64"),
45+
},
46+
},
47+
})
48+
).toString("base64"),
49+
},
50+
});
51+
}
52+
};
1053

1154
const createServiceFromForm = async (form: FormData) => {
1255
"use server";
1356
const service = {
1457
name: form.get("name") as string,
58+
source: form.get("source") as string,
1559
image: form.get("image") as string,
60+
ghPackage: form.get("ghPackage") as string,
61+
ghPackageTag: form.get("ghPackageTag") as string,
62+
ghPackageName: form.get("ghPackageName") as string,
63+
ghPackageOwner: form.get("ghPackageOwner") as string,
1664
port: Number(form.get("port")) as number,
1765
resources: {
1866
cpuLimit: toNumber(form.get("cpuLimit")),
@@ -25,7 +73,20 @@ const createServiceFromForm = async (form: FormData) => {
2573
envVars: JSON.parse(form.get("env") as string) as { [key: string]: string },
2674
} as Service;
2775
const user = await getUser();
28-
await knative.createService(service, user.name);
76+
if (service?.source === "ghcr") {
77+
try {
78+
await ensureGithubPullSecret(user.name);
79+
} catch (e) {
80+
console.error(e);
81+
}
82+
service.image = `ghcr.io/${service.ghPackageOwner}/${service.ghPackageName}:${service.ghPackageTag}`;
83+
service.pullSecret = "pull-secret-ghcr";
84+
}
85+
try {
86+
await knative.createService(service, user.name);
87+
} catch (e) {
88+
console.error(e);
89+
}
2990
};
3091

3192
const createServiceAction = action(createServiceFromForm, "createService");
@@ -54,18 +115,8 @@ export const CreateServiceForm = () => {
54115
class="input input-bordered w-full"
55116
/>
56117
</label>
57-
<label class="form-control w-full">
58-
<div class="label">
59-
<span class="label-text">Image</span>
60-
</div>
61-
<input
62-
type="text"
63-
name="image"
64-
required
65-
placeholder="traefik/whoami"
66-
class="input input-bordered w-full"
67-
/>
68-
</label>
118+
<SourceInput />
119+
69120
<label class="form-control w-full">
70121
<div class="label">
71122
<span class="label-text">Port</span>

0 commit comments

Comments
 (0)