From 6916ad3b31491ef2b8d8531a985727f04bcf67a8 Mon Sep 17 00:00:00 2001 From: whilefoo Date: Wed, 13 Nov 2024 13:12:37 +0100 Subject: [PATCH] feat: interactive setup --- bun.lockb | Bin 394027 -> 409318 bytes package.json | 11 +- scripts/deploy.ts | 230 ++++++++++++++++++++++ scripts/index.html | 39 ++++ scripts/redirect.html | 34 ++++ {deploy => scripts}/setup-kv-namespace.ts | 0 scripts/setup.ts | 168 ++++++++++++++++ 7 files changed, 480 insertions(+), 2 deletions(-) create mode 100644 scripts/deploy.ts create mode 100644 scripts/index.html create mode 100644 scripts/redirect.html rename {deploy => scripts}/setup-kv-namespace.ts (100%) create mode 100644 scripts/setup.ts diff --git a/bun.lockb b/bun.lockb index 6adfd2700b27b4b8e1e3e11a33d1f6a144679ae0..812bfba099444c430bc0a43167ac3216787461b5 100755 GIT binary patch delta 91242 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

cpc1 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 Gmij+3VCjbd diff --git a/package.json b/package.json index 398cb75..3b33b6e 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "format:prettier": "prettier --write .", "format:cspell": "cspell **/*", "prepare": "node .husky/install.mjs", + "deploy": "tsx ./scripts/deploy.ts", "deploy-dev": "wrangler deploy --env dev", "deploy-production": "wrangler deploy --env production", "worker": "wrangler dev --env dev --port 8787", @@ -30,7 +31,8 @@ "knip-ci": "knip --no-exit-code --reporter json --config .github/knip.ts", "jest:test": "jest --coverage", "plugin:hello-world": "tsx tests/__mocks__/hello-world-plugin.ts", - "setup-kv": "bun --env-file=.dev.vars deploy/setup-kv-namespace.ts" + "setup-kv": "bun --env-file=.dev.vars deploy/setup-kv-namespace.ts", + "setup": "tsx ./scripts/setup.ts" }, "keywords": [ "typescript", @@ -52,7 +54,7 @@ "@octokit/webhooks": "13.3.0", "@octokit/webhooks-types": "7.5.1", "@sinclair/typebox": "^0.33.20", - "@ubiquity-os/plugin-sdk": "^1.0.11", + "@ubiquity-os/plugin-sdk": "^1.0.11", "dotenv": "16.4.5", "typebox-validators": "0.3.5", "yaml": "2.4.5" @@ -65,6 +67,7 @@ "@cspell/dict-software-terms": "3.4.6", "@cspell/dict-typescript": "3.1.5", "@eslint/js": "9.7.0", + "@inquirer/prompts": "^7.1.0", "@jest/globals": "29.7.0", "@mswjs/data": "0.16.1", "@mswjs/http-middleware": "0.10.1", @@ -72,6 +75,7 @@ "@swc/jest": "0.2.36", "@types/jest": "29.5.12", "@types/node": "20.14.10", + "@types/node-rsa": "^1.1.4", "cspell": "8.9.0", "esbuild": "0.23.0", "eslint": "9.7.0", @@ -84,7 +88,10 @@ "jest-junit": "16.0.0", "knip": "5.26.0", "lint-staged": "15.2.7", + "node-rsa": "^1.1.1", "npm-run-all": "4.1.5", + "open": "^10.1.0", + "ora": "^8.1.1", "prettier": "3.3.3", "smee-client": "^2.0.4", "toml": "3.0.0", diff --git a/scripts/deploy.ts b/scripts/deploy.ts new file mode 100644 index 0000000..7d593a6 --- /dev/null +++ b/scripts/deploy.ts @@ -0,0 +1,230 @@ +import { confirm, input, select } from "@inquirer/prompts"; +import { exec, execSync, spawn } from "child_process"; +import { readFileSync, unlinkSync, writeFileSync } from "fs"; +import ora from "ora"; +import path from "path"; +import { parse } from "dotenv"; +import toml from "toml"; +// @ts-expect-error No typings exist for this package +import * as tomlify from "tomlify-j0.4"; + +interface WranglerConfiguration { + name: string; + env: { + [env: string]: { + kv_namespaces?: { + id: string; + binding: string; + }[]; + }; + }; + kv_namespaces: { + id: string; + binding: string; + }[]; +} + +const WRANGLER_PATH = path.resolve(__dirname, "..", "node_modules/.bin/wrangler"); +const WRANGLER_TOML_PATH = path.resolve(__dirname, "..", "wrangler.toml"); +const BINDING_NAME = "PLUGIN_CHAIN_STATE"; + +function checkIfWranglerInstalled() { + return new Promise((resolve) => { + exec(`${WRANGLER_PATH} --version`, (err, stdout, stderr) => { + if (err || stderr) { + resolve(false); + } + resolve(true); + }); + }); +} + +function checkIfWranglerIsLoggedIn() { + return new Promise((resolve, reject) => { + exec(`${WRANGLER_PATH} whoami`, (err, stdout, stderr) => { + if (err) { + reject(err); + } + if (stdout.includes("You are not authenticated") || stderr.includes("You are not authenticated")) { + resolve(false); + } else { + resolve(true); + } + }); + }); +} + +function wranglerLogin() { + return new Promise((resolve, reject) => { + const loginProcess = spawn(WRANGLER_PATH, ["login"], { stdio: "inherit" }); + + loginProcess.on("close", (code) => { + if (code !== 0) { + reject(); + } else { + resolve(); + } + }); + }); +} + +function wranglerBulkSecrets(env: string | null, filePath: string) { + return new Promise((resolve, reject) => { + const args = env ? ["--env", env] : []; + const process = spawn(WRANGLER_PATH, ["secret", "bulk", filePath, ...args], { stdio: "inherit" }); + + process.on("close", (code) => { + if (code !== 0) { + reject(); + } else { + resolve(); + } + }); + process.on("error", (err) => { + reject(err); + }); + }); +} + +function wranglerDeploy(env: string | null) { + return new Promise((resolve, reject) => { + const args = env ? ["--env", env] : []; + const process = spawn(WRANGLER_PATH, ["deploy", ...args], { stdio: "inherit" }); + + process.on("close", (code) => { + if (code !== 0) { + reject(); + } else { + resolve(); + } + }); + }); +} + +function wranglerKvNamespace(projectName: string, namespace: string) { + const kvList = JSON.parse(execSync(`${WRANGLER_PATH} kv namespace list`).toString()) as { id: string; title: string }[]; + const existingNamespace = kvList.find((o) => o.title === namespace || o.title === `${projectName}-${namespace}`); + if (existingNamespace) { + return existingNamespace.id; + } + + const res = execSync(`${WRANGLER_PATH} kv namespace create ${namespace}`).toString(); + + const newId = res.match(/id = \s*"([^"]+)"/)?.[1]; + if (!newId) { + console.log(res); + throw new Error(`The new ID could not be found.`); + } + return newId; +} + +void (async () => { + const spinner = ora("Checking if Wrangler is installed").start(); + const wranglerInstalled = await checkIfWranglerInstalled(); + if (!wranglerInstalled) { + spinner.fail("Wrangler is not installed. Please install it before running this script"); + process.exit(1); + } else { + spinner.succeed("Wrangler is installed"); + } + + spinner.start("Checking if Wrangler is logged in"); + const wranglerLoggedIn = await checkIfWranglerIsLoggedIn(); + if (!wranglerLoggedIn) { + spinner.warn("Wrangler is not logged in. Please login to Wrangler"); + await wranglerLogin(); + spinner.succeed("Wrangler is now logged in"); + } else { + spinner.succeed("Wrangler is logged in"); + } + + spinner.start("Searching environments in wrangler.toml"); + const wranglerToml: WranglerConfiguration = toml.parse(readFileSync(WRANGLER_TOML_PATH, "utf-8")); + if (!wranglerToml) { + spinner.fail("Error parsing wrangler.toml"); + process.exit(1); + } + const envs = Object.keys(wranglerToml.env ?? {}); + let selectedEnv: string | null = null; + if (envs.length === 0) { + spinner.warn("No environments found, choosing default environment"); + } else if (envs.length === 1) { + spinner.warn(`Only one environment found: ${envs[0]}`); + selectedEnv = envs[0]; + } else if (envs.length > 1) { + spinner.stop(); + selectedEnv = await select({ + message: "Select the environment to deploy to:", + choices: envs, + }); + } + + const willSetSecrets = await confirm({ + message: "Do you want to set secrets?", + default: true, + }); + if (willSetSecrets) { + const envFile = await input({ + message: "Enter the name of the env file to use:", + default: `.${selectedEnv}.vars`, + }); + const spinner = ora("Setting secrets").render(); + try { + const env = readFileSync(path.resolve(__dirname, "..", envFile), { encoding: "utf-8" }); + const parsedEnv = parse(env); + if (parsedEnv) { + const tmpPath = path.resolve(__dirname, "..", `${envFile}.json.tmp`); + writeFileSync(tmpPath, JSON.stringify(parsedEnv)); + await wranglerBulkSecrets(selectedEnv, tmpPath); + unlinkSync(tmpPath); // deletes the temporary file + spinner.succeed("Secrets set successfully"); + } + } catch (err) { + spinner.fail(`Error setting secrets: ${err}`); + process.exit(1); + } + } + + spinner.start("Setting up KV namespace"); + try { + const kvNamespace = selectedEnv ? `${selectedEnv}-plugin-chain-state` : `plugin-chain-state`; + const namespaceId = wranglerKvNamespace(wranglerToml.name, kvNamespace); + if (selectedEnv) { + const existingBinding = wranglerToml.env[selectedEnv]?.kv_namespaces?.find((o) => o.binding === BINDING_NAME); + if (!existingBinding) { + wranglerToml.env[selectedEnv] = wranglerToml.env[selectedEnv] ?? {}; + wranglerToml.env[selectedEnv].kv_namespaces = wranglerToml.env[selectedEnv].kv_namespaces ?? []; + wranglerToml.env[selectedEnv].kv_namespaces?.push({ + id: namespaceId, + binding: BINDING_NAME, + }); + } else { + existingBinding.id = namespaceId; + } + } else { + const existingBinding = wranglerToml.kv_namespaces.find((o) => o.binding === BINDING_NAME); + if (!existingBinding) { + wranglerToml.kv_namespaces.push({ + id: namespaceId, + binding: BINDING_NAME, + }); + } else { + existingBinding.id = namespaceId; + } + } + writeFileSync(WRANGLER_TOML_PATH, tomlify.toToml(wranglerToml)); + spinner.succeed(`Using KV namespace ${kvNamespace} with ID: ${namespaceId}`); + } catch (err) { + spinner.fail(`Error setting up KV namespace: ${err}`); + process.exit(1); + } + + spinner.start("Deploying to Cloudflare Workers").stopAndPersist(); + try { + await wranglerDeploy(selectedEnv); + spinner.succeed("Deployed successfully"); + } catch (err) { + spinner.fail(`Error deploying: ${err}`); + process.exit(1); + } +})(); diff --git a/scripts/index.html b/scripts/index.html new file mode 100644 index 0000000..9e7b2d9 --- /dev/null +++ b/scripts/index.html @@ -0,0 +1,39 @@ + + + + + + Register a Github App + + + +

+

Click on the button and follow instructions

+
+
+ +
+
+ + + + diff --git a/scripts/redirect.html b/scripts/redirect.html new file mode 100644 index 0000000..09706f2 --- /dev/null +++ b/scripts/redirect.html @@ -0,0 +1,34 @@ + + + + + + Register a Github App + + + +
+

Successfully created a Github App!

+ +
+ +
+
+ + diff --git a/deploy/setup-kv-namespace.ts b/scripts/setup-kv-namespace.ts similarity index 100% rename from deploy/setup-kv-namespace.ts rename to scripts/setup-kv-namespace.ts diff --git a/scripts/setup.ts b/scripts/setup.ts new file mode 100644 index 0000000..97a971f --- /dev/null +++ b/scripts/setup.ts @@ -0,0 +1,168 @@ +import http from "http"; +import fs from "fs"; +import path from "path"; +import open from "open"; +import ora, { Ora } from "ora"; +import NodeRSA from "node-rsa"; +import { Octokit } from "@octokit/core"; +import { confirm, input } from "@inquirer/prompts"; + +const PORT = 3000; +const DEV_ENV_FILE = ".dev.vars"; + +const manifestTemplate = { + url: "https://github.com/ubiquity-os/ubiquity-os-kernel", + hook_attributes: { + url: "", + }, + redirect_url: `http://localhost:${PORT}/redirect`, + public: true, + default_permissions: { + actions: "write", + issues: "write", + pull_requests: "write", + contents: "write", + members: "read", + }, + default_events: ["issues", "issue_comment", "label", "pull_request", "push", "repository", "repository_dispatch"], +}; + +class GithubAppSetup { + private _octokit: Octokit; + private _server: http.Server; + private _spinner: Ora; + private _url = new URL(`http://localhost:3000`); + private _env = { + ENVIRONMENT: "production", + APP_ID: "", + APP_PRIVATE_KEY: "", + APP_WEBHOOK_SECRET: "", + WEBHOOK_PROXY_URL: `https://smee.io/ubiquityos-kernel-${this.generateRandomString(16)}`, + }; + + constructor() { + this._octokit = new Octokit(); + this._server = http.createServer(this.handleRequest.bind(this)); + this._spinner = ora("Waiting for Github App creation"); + } + + start() { + this._server.listen(this._url.port, () => { + void open(this._url.toString()); + console.log(`If it doesn't open automatically, open this website and follow instructions: ${this._url}`); + this._spinner.start(); + }); + } + + stop() { + this._spinner.stop(); + this._server.close(); + } + + async handleRequest(req: http.IncomingMessage, res: http.ServerResponse) { + try { + const url = new URL(`http://localhost${req.url}`); + if (url.pathname === "/") { + await this.handleIndexRequest(url, req, res); + } else if (url.pathname === "/redirect" && req.method === "GET") { + await this.handleRedirectRequest(url, req, res); + } else { + this.send404Response(res); + } + } catch (error) { + console.error(error); + this.send500Response(res); + } + } + + send404Response(res: http.ServerResponse) { + res.writeHead(404, { "Content-Type": "text/plain" }); + res.end("404 Not Found"); + } + + send500Response(res: http.ServerResponse) { + res.writeHead(500, { "Content-Type": "text/plain" }); + res.end("Server Error"); + } + + sendHtml(res: http.ServerResponse, content: string) { + res.writeHead(500, { "Content-Type": "text/html" }); + res.end(content); + } + + fileExists(file: string) { + try { + fs.accessSync(file); + return true; + } catch (error) { + return false; + } + } + + generateRandomString(length: number) { + const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + let randomString = ""; + for (let i = 0; i < length; i++) { + randomString += chars.charAt(Math.floor(Math.random() * chars.length)); + } + return randomString; + } + + saveEnv(file: string, env: Record) { + const envContent = Object.entries(env) + .map(([key, value]) => `${key}=${value}`) + .join("\n"); + + fs.writeFileSync(path.join(__dirname, "..", file), envContent, { flag: "a" }); + } + + async handleIndexRequest(url: URL, req: http.IncomingMessage, res: http.ServerResponse) { + const manifest = { ...manifestTemplate }; + manifest.hook_attributes.url = this._env.WEBHOOK_PROXY_URL; + + const htmlContent = fs.readFileSync(path.join(__dirname, "index.html")).toString().replace("{{ MANIFEST }}", JSON.stringify(manifest)); + this.sendHtml(res, htmlContent); + } + + async handleRedirectRequest(url: URL, req: http.IncomingMessage, res: http.ServerResponse) { + const code = url.searchParams.get("code"); + if (!code) { + return this.send404Response(res); + } + + const { data } = await this._octokit.request("POST /app-manifests/{code}/conversions", { + code, + }); + + const htmlContent = fs.readFileSync(path.join(__dirname, "redirect.html")).toString().replace("{{ APP_URL }}", data.html_url); + this.sendHtml(res, htmlContent); + + this._server.close(); + this._spinner.succeed("Github App created successfully"); + + // convert from pkcs1 to pkcs8 + const privateKey = new NodeRSA(data.pem, "pkcs1-private-pem"); + const privateKeyPkcs8 = privateKey.exportKey("pkcs8-private-pem").replaceAll("\n", "\\n"); + + this._env.APP_ID = data.id.toString(); + this._env.APP_PRIVATE_KEY = privateKeyPkcs8; + this._env.APP_WEBHOOK_SECRET = data.webhook_secret ?? ""; + + const envFile = await input({ message: "Enter file name to save env:", default: DEV_ENV_FILE }); + if (this.fileExists(envFile) && !(await confirm({ message: "File already exist. Do you want to append to it?", default: false }))) { + return; + } + this.saveEnv(envFile, this._env); + + process.exit(); + } +} + +const setup = new GithubAppSetup(); +setup.start(); + +process.on("SIGINT", () => { + setup.stop(); + console.log("\nProcess interrupted. Exiting gracefully..."); + process.exit(); +});