From db865012e66bce69f27130dfb9d0412cc8e61b12 Mon Sep 17 00:00:00 2001 From: Prozilla Date: Tue, 23 Jul 2024 16:51:43 +0200 Subject: [PATCH] scripts: Updated deploying + staging processes --- README.md | 11 ++--- package.json | 14 +++--- packages/demo/README.md | 1 - packages/demo/package.json | 3 +- packages/demo/scripts/deploy.ts | 27 ----------- packages/demo/scripts/stage.ts | 6 +-- packages/docs/README.md | 1 - packages/docs/package.json | 1 - packages/docs/scripts/stage.ts | 22 --------- .../{releasePackage.ts => createRelease.ts} | 10 ++--- scripts/publishSite.ts | 30 +++++++++++++ scripts/stageSite.ts | 45 +++++++++++++++++++ 12 files changed, 90 insertions(+), 81 deletions(-) delete mode 100644 packages/demo/scripts/deploy.ts delete mode 100644 packages/docs/scripts/stage.ts rename scripts/{releasePackage.ts => createRelease.ts} (83%) create mode 100644 scripts/publishSite.ts create mode 100644 scripts/stageSite.ts diff --git a/README.md b/README.md index 31f76c0..66ce280 100644 --- a/README.md +++ b/README.md @@ -63,16 +63,16 @@ ProzillaOS uses the package manager [pnpm](https://pnpm.io/) to run scripts. | Script | Description | | --- | --- | -|
pnpm run start
| Run [`pnpm run site:start`](#package-prozilla-os-demo). VSCode is configured to run this script whenever the project is opened. +|
pnpm run start
| Run [`pnpm run demo:start`](#package-prozilla-os-demo). VSCode is configured to run this script whenever the project is opened. |
pnpm run build
| Build every package in sequential order. -|
pnpm run deploy
| Clear the `dist` directory, build and stage each package that comprises the website, then deploy to GitHub pages. This should then trigger a GitHub Action that deploys the build to production. -|
pnpm run publish
| Publish the `dist` directory directly to GitHub pages. +|
pnpm run stage
| Copy and combine the build of each package that comprises the website in the `dist` directory at the root. +|
pnpm run deploy
| Clear the `dist` directory, stage each package that comprises the website, then deploy to GitHub pages. This should trigger a GitHub Action that deploys the build to production. ### Public packages | Script | Description | | --- | --- | -|
pnpm run packages:build
| Build all packages using Vite in sequential order and output to respective `dist` directories. +|
pnpm run packages:build
| Build all dependencies of the `prozilla-os` package in sequential order and output to respective `dist` directories. |
pnpm run packages:update
| Create a new changeset for packages and update their version accordingly. |
pnpm run packages:release
| Publish the latest versions of each package to the npm registry. @@ -87,7 +87,6 @@ ProzillaOS uses the package manager [pnpm](https://pnpm.io/) to run scripts. |
pnpm run demo:build
| See [`pnpm run build`](./packages/demo/README.md#scripts) |
pnpm run demo:preview
| See [`pnpm run preview`](./packages/demo/README.md#scripts) |
pnpm run demo:stage
| See [`pnpm run stage`](./packages/demo/README.md#scripts) -|
pnpm run demo:deploy
| See [`pnpm run deploy`](./packages/demo/README.md#scripts) |
pnpm run demo:fetch
| See [`pnpm run fetch`](./packages/demo/README.md#scripts) ### Internal package: `@prozilla-os/docs` @@ -97,8 +96,6 @@ ProzillaOS uses the package manager [pnpm](https://pnpm.io/) to run scripts. |
pnpm run docs:start
| See [`pnpm run start`](./packages/docs/README.md#scripts) |
pnpm run docs:build
| See [`pnpm run build`](./packages/docs/README.md#scripts) |
pnpm run docs:preview
| See [`pnpm run preview`](./packages/docs/README.md#scripts) -|
pnpm run docs:stage
| See [`pnpm run stage`](./packages/docs/README.md#scripts) -|
pnpm run docs:deploy
| Build and stage docs, then run `pnpm run publish`. |
pnpm run docs:generate
| See [`pnpm run generate`](./packages/docs/README.md#scripts) ## Links diff --git a/package.json b/package.json index fc9db32..3360ac2 100644 --- a/package.json +++ b/package.json @@ -12,26 +12,22 @@ "scripts": { "preinstall": "npx only-allow pnpm", "start": "pnpm run demo:start", - "prebuild": "rimraf dist", - "build": "pnpm run packages:build && pnpm run docs:build && pnpm run demo:build", - "predeploy": "rimraf dist", - "deploy": "pnpm run docs:build && pnpm run docs:stage && pnpm run demo:deploy", - "publish": "pnpm vite-node packages/demo/scripts/deploy", + "build": "pnpm -r --sequential build", + "stage": "pnpm vite-node scripts/stageSite.ts", + "predeploy": "rimraf dist && pnpm run stage", + "deploy": "pnpm vite-node scripts/publishSite.ts", "demo:start": "pnpm --filter @prozilla-os/demo run start", "demo:build": "pnpm --filter @prozilla-os/demo run build", "demo:preview": "pnpm --filter @prozilla-os/demo run preview", "demo:stage": "pnpm --filter @prozilla-os/demo run stage", - "demo:deploy": "pnpm --filter @prozilla-os/demo run deploy", "demo:fetch": "pnpm --filter @prozilla-os/demo run fetch", "docs:start": "pnpm --filter @prozilla-os/docs run start", "docs:build": "pnpm --filter @prozilla-os/docs run build", - "docs:stage": "pnpm --filter @prozilla-os/docs run stage", "docs:preview": "pnpm --filter @prozilla-os/docs run preview", - "docs:deploy": "pnpm run docs:build && pnpm run docs:stage && pnpm run publish", "docs:generate": "pnpm --filter @prozilla-os/docs run generate", "packages:build": "pnpm -r --sequential --filter prozilla-os... build", "packages:update": "npx changeset && pnpm changeset version", - "packages:release": "pnpm changeset publish && pnpm vite-node scripts/releasePackage.ts" + "packages:release": "pnpm changeset publish && pnpm vite-node scripts/createRelease.ts" }, "workspaces": [ "packages/*", diff --git a/packages/demo/README.md b/packages/demo/README.md index ddbda39..abce0b2 100644 --- a/packages/demo/README.md +++ b/packages/demo/README.md @@ -25,7 +25,6 @@ |
pnpm run build
| Compile project using TypeScript and bundle all files into the `dist` directory, or the directory specified in config file. This directory can be uploaded to a web server. |
pnpm run preview
| Start web server with preview of build at [localhost:8080](http://localhost:8080/). Can be useful for validating build before deploying. |
pnpm run stage
| Execute [stage.ts](./scripts/stage.ts), which stages the build and prepares it for deployment. Script will generate a sitemap, robots.txt and all other necessary files. -|
pnpm run deploy
| Run `pnpm run build && pnpm run stage`, then execute [deploy.ts](../scripts/deploy.ts), which uploads the staged build to GitHub Pages on branch called `gh-pages`. This should then trigger a GitHub Action that deploys the build to production. |
pnpm run fetch
| Fetch the repository tree using GitHub's API and store it as a JSON file that will be used to populate the virtual drive. More information can be found on the [virtual drive](./features/virtual-drive/README.md) page. ## Links diff --git a/packages/demo/package.json b/packages/demo/package.json index 73853e2..24e70bd 100644 --- a/packages/demo/package.json +++ b/packages/demo/package.json @@ -11,10 +11,9 @@ "scripts": { "start": "vite", "build": "tsc --project tsconfig.build.json && vite build", + "postbuild": "pnpm run stage", "preview": "vite preview --port 8080", "stage": "vite-node scripts/stage", - "predeploy": "pnpm run build && pnpm run stage", - "deploy": "vite-node scripts/deploy", "fetch": "vite-node scripts/fetchRepository" }, "repository": { diff --git a/packages/demo/scripts/deploy.ts b/packages/demo/scripts/deploy.ts deleted file mode 100644 index f91642c..0000000 --- a/packages/demo/scripts/deploy.ts +++ /dev/null @@ -1,27 +0,0 @@ -import ghpages from "gh-pages"; -import { ANSI } from "../../core/src/constants"; -import { BASE_URL, BUILD_DIR, COMMIT_MESSAGE, DOMAIN, REPO_URL } from "../src/config/deploy.config"; -import path from "node:path"; - -function deploy() { - console.log(`${ANSI.fg.yellow}Deploying to GitHub Pages...${ANSI.reset}`); - console.log(`Domain: ${ANSI.fg.cyan + DOMAIN + ANSI.reset}`); - console.log(`Commit message: ${ANSI.fg.cyan + COMMIT_MESSAGE + ANSI.reset}`); - console.log(`Repository: ${ANSI.fg.cyan + REPO_URL + ANSI.reset}\n`); - - void ghpages.publish(path.resolve(__dirname, "../../../", BUILD_DIR), { - repo: REPO_URL, - message: COMMIT_MESSAGE - }, (error) => { - if (error == null) - return; - - console.error(error); - console.log(`${ANSI.fg.red}⚠ Failed to deploy${ANSI.reset}`); - process.exit(1); - }).then(() => { - console.log(`${ANSI.fg.green}✓ Successfully deployed to ${ANSI.fg.cyan + BASE_URL + ANSI.reset}`); - }); -} - -deploy(); \ No newline at end of file diff --git a/packages/demo/scripts/stage.ts b/packages/demo/scripts/stage.ts index d827b82..87767e6 100644 --- a/packages/demo/scripts/stage.ts +++ b/packages/demo/scripts/stage.ts @@ -4,7 +4,6 @@ import { ANSI } from "../../core/src/constants"; import { NAME, TAG_LINE } from "../src/config/branding.config"; import { BASE_URL, BUILD_DIR, DOMAIN } from "../src/config/deploy.config"; import { skin } from "../src/config/skin.config"; -import path from "node:path"; import { name } from "../package.json"; const PATHS = { @@ -134,9 +133,8 @@ function stage() { files.forEach(([path, generateContent]) => { const directory = path.substring(0, path.lastIndexOf("/")); - if (directory != "" && !fs.existsSync(directory)){ + if (directory != "" && !fs.existsSync(directory)) fs.mkdirSync(directory, { recursive: true }); - } fs.writeFileSync(path, generateContent(), { flag: "w+" }); console.log(`- ${ANSI.fg.cyan}${path}${ANSI.reset}`); @@ -149,8 +147,6 @@ function stage() { generate404Page(template); generateAppPages(template); - - fs.cpSync(BUILD_DIR, path.resolve(__dirname, "../../../", BUILD_DIR), { recursive: true }); console.log(`\n${ANSI.fg.green}✓ Staging complete${ANSI.reset}`); } catch (error) { diff --git a/packages/docs/README.md b/packages/docs/README.md index 6fb3219..e9c9b18 100644 --- a/packages/docs/README.md +++ b/packages/docs/README.md @@ -24,7 +24,6 @@ |
pnpm run start
| Start VitePress dev server at [localhost:3000](http://localhost:3000/). Changes to module will dynamically be hot-reloaded, so normally there is no need for hard-refreshes. |
pnpm run build
| Compile project using VitePress and output to the `dist` directory. |
pnpm run preview
| Start web server with preview of build at [localhost:8080](http://localhost:8080/). Can be useful for validating build before deploying. -|
pnpm run stage
| Execute [stage.ts](./scripts/stage.ts), which copies the `./dist` directory of this package into the `/dist/docs` directory at the root, within the build of the demo site. |
pnpm run generate
| Generate basic information files in JSON format to use as a base for writing the documentation and output to the `data` directory. ## Links diff --git a/packages/docs/package.json b/packages/docs/package.json index cf482b9..fc2dcdd 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -12,7 +12,6 @@ "start": "vitepress --port 3000", "build": "vitepress build", "preview": "vitepress preview --port 8080", - "stage": "vite-node scripts/stage", "generate": "rimraf data && vite-node scripts/generateData" }, "repository": { diff --git a/packages/docs/scripts/stage.ts b/packages/docs/scripts/stage.ts deleted file mode 100644 index d518017..0000000 --- a/packages/docs/scripts/stage.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { ANSI } from "../../core/src/constants"; -import { name } from "../package.json"; -import fs from "node:fs"; -import { resolve } from "node:path"; - -const BUILD_DIR = "dist"; - -function stage() { - try { - console.log(`Context: ${ANSI.decoration.bold}${name}${ANSI.reset}\n`); - - console.log(`${ANSI.fg.yellow}Staging build...${ANSI.reset}`); - fs.cpSync(BUILD_DIR, resolve(__dirname, `../../../${BUILD_DIR}/docs/`), { recursive: true }); - console.log(`\n${ANSI.fg.green}✓ Staging complete${ANSI.reset}`); - } catch (error) { - console.error(error); - console.log(`${ANSI.fg.red}⚠ Staging failed${ANSI.reset}`); - process.exit(1); - } -} - -stage(); \ No newline at end of file diff --git a/scripts/releasePackage.ts b/scripts/createRelease.ts similarity index 83% rename from scripts/releasePackage.ts rename to scripts/createRelease.ts index c2e6ce6..1beba19 100644 --- a/scripts/releasePackage.ts +++ b/scripts/createRelease.ts @@ -33,19 +33,17 @@ const createGitHubRelease = (): void => { // Write changelog to a temporary file fs.writeFileSync(changelogFilePath, changelog); - // Push all tags, not recommended - console.log(`${ANSI.fg.yellow}Pushing tags...${ANSI.reset}`); - execSync("git push --tags", { + console.log(`${ANSI.fg.yellow}Pushing tag...${ANSI.reset}`); + execSync(`git push origin tag ${tagName}`, { stdio: "inherit" }); - // Create a new release console.log(`${ANSI.fg.yellow}Creating release...${ANSI.reset}`); execSync(`gh release create ${tagName} --title "${releaseTitle}" --notes-file "${changelogFilePath}"`, { stdio: "inherit" }); - console.log(`\n${ANSI.fg.green}✓ Release created:${ANSI.reset} ${releaseTitle}`); + console.log(`\n${ANSI.fg.green}✓ Release created: ${ANSI.fg.cyan + releaseTitle + ANSI.reset}`); } catch (error) { if ((error as Record).stdout) { console.error((error as Record).stdout.toString()); @@ -54,7 +52,7 @@ const createGitHubRelease = (): void => { console.error((error as Record).stderr.toString()); } - console.error(`${ANSI.fg.red}⚠ Failed to create release:${ANSI.reset} ${(error as Error).message}`); + console.error(`\n${ANSI.fg.red}⚠ Failed to create release: ${(error as Error).message}${ANSI.reset}`); process.exit(1); } finally { // Clean up the temporary file diff --git a/scripts/publishSite.ts b/scripts/publishSite.ts new file mode 100644 index 0000000..79ff05a --- /dev/null +++ b/scripts/publishSite.ts @@ -0,0 +1,30 @@ +import ghpages from "gh-pages"; +import { ANSI } from "../packages/core/src/constants"; +import { BASE_URL, BUILD_DIR, COMMIT_MESSAGE, DOMAIN, REPO_URL } from "../packages/demo/src/config/deploy.config"; +import path from "node:path"; +import { name } from "../package.json"; + +function publishSite() { + console.log(`Context: ${ANSI.decoration.bold}${name}${ANSI.reset}\n`); + + console.log(`${ANSI.fg.yellow}Publishing to GitHub Pages...${ANSI.reset}`); + console.log(`- Domain: ${ANSI.fg.cyan + DOMAIN + ANSI.reset}`); + console.log(`- Commit message: ${ANSI.fg.cyan + COMMIT_MESSAGE + ANSI.reset}`); + console.log(`- Repository: ${ANSI.fg.cyan + REPO_URL + ANSI.reset}\n`); + + void ghpages.publish(path.resolve(__dirname, "../", BUILD_DIR), { + repo: REPO_URL, + message: COMMIT_MESSAGE + }, (error) => { + if (error == null) + return; + + console.error(error); + console.log(`${ANSI.fg.red}⚠ Failed to publish${ANSI.reset}`); + process.exit(1); + }).then(() => { + console.log(`${ANSI.fg.green}✓ Published site: ${ANSI.fg.cyan + BASE_URL + ANSI.reset}`); + }); +} + +publishSite(); \ No newline at end of file diff --git a/scripts/stageSite.ts b/scripts/stageSite.ts new file mode 100644 index 0000000..5dd9587 --- /dev/null +++ b/scripts/stageSite.ts @@ -0,0 +1,45 @@ +import { ANSI } from "../packages/core/src/constants"; +import { name } from "../package.json"; +import fs from "node:fs"; +import { BUILD_DIR } from "packages/demo/src/config/deploy.config"; +import { resolve } from "node:path"; + +const PACKAGES = [ + { source: `../packages/demo/${BUILD_DIR}`, path: "/" }, + { source: `../packages/docs/${BUILD_DIR}`, path: "/docs" } +]; + +const TARGET = `../${BUILD_DIR}`; + +function stageSite() { + try { + console.log(`Context: ${ANSI.decoration.bold}${name}${ANSI.reset}\n`); + console.log(`${ANSI.fg.yellow}Staging site...${ANSI.reset}`); + + PACKAGES.forEach(({ source, path }) => { + const sourceDirectory = resolve(__dirname, source); + const targetDirectory = resolve(__dirname, TARGET, path.replace(/^\//, "")); + + if (!fs.existsSync(targetDirectory)) + fs.mkdirSync(targetDirectory, { recursive: true }); + + fs.cpSync(sourceDirectory, targetDirectory, { recursive: true }); + console.log(`- Copied ${ANSI.fg.cyan + source.replace(/^\.\.\//, "") + ANSI.reset} to ${ANSI.fg.cyan + path + ANSI.reset}`); + }); + + console.log(`\n${ANSI.fg.green}✓ Site staged: ${ANSI.fg.cyan}./${BUILD_DIR + ANSI.reset}`); + } catch (error) { + if ((error as Record).stdout) { + console.error((error as Record).stdout.toString()); + } + if ((error as Record).stderr) { + console.error((error as Record).stderr.toString()); + } + + console.error(error); + console.log(`${ANSI.fg.red}⚠ Staging failed${ANSI.reset}`); + process.exit(1); + } +} + +stageSite(); \ No newline at end of file