From f7a88a8f8c22477d0ae7c17503786c001a3d9810 Mon Sep 17 00:00:00 2001 From: Sean Wu Date: Sat, 6 Apr 2024 20:22:51 +1100 Subject: [PATCH 1/3] chore: update release.yml to only run the new release script --- .github/workflows/release.yml | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 92729ed..afc385d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -67,22 +67,8 @@ jobs: env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: Pre core release - run: pnpm run prerelease - - - name: Release Core - run: pnpm run release - - - name: Pre wrapper release - run: pnpm run prerelease-wrappers - - - name: Release React - run: pnpm run release - working-directory: ./packages/react - - - name: Release Vue + - name: Release run: pnpm run release - working-directory: ./packages/vue docsite: name: Deploy docsite From a332116ddf838fa1370759f4a189549bc46f86c2 Mon Sep 17 00:00:00 2001 From: Sean Wu Date: Sun, 7 Apr 2024 11:06:01 +1000 Subject: [PATCH 2/3] chore: update release script --- .github/workflows/release.yml | 16 +++--- bin/release-prep.js | 52 ------------------ bin/release.js | 100 ++++++++++++++++++++++++++++++++++ package.json | 4 +- packages/core/package.json | 2 +- 5 files changed, 109 insertions(+), 65 deletions(-) create mode 100644 bin/release.js diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index afc385d..c795583 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,8 +1,6 @@ name: Release on: - push: - branches: [main] - # Allows you to run this workflow manually from the Actions tab + # Only run this workflow manually from the GitHub Actions tab workflow_dispatch: jobs: release: @@ -51,13 +49,13 @@ jobs: run: pnpm -r install --no-frozen-lockfile #TEST - # - name: Unit Test Core Components - # run: pnpm test.spec - # working-directory: packages/core + - name: Unit Test Core Components + run: pnpm test.spec + working-directory: packages/core - # - name: E2E Test Core Components - # run: pnpm test.e2e - # working-directory: packages/core + - name: E2E Test Core Components + run: pnpm test.e2e + working-directory: packages/core - name: Build run: pnpm run build.libs diff --git a/bin/release-prep.js b/bin/release-prep.js index d28ac90..e69de29 100644 --- a/bin/release-prep.js +++ b/bin/release-prep.js @@ -1,52 +0,0 @@ -/** - * replace workspace versions before releasing - * only to be ran in CI - */ -import fs from 'fs'; -import path from 'path'; -import { exec } from 'child_process'; - -function execAsync(command) { - return new Promise((resolve, reject) => { - exec(command, (error, stdout, stderr) => { - if (error) { - reject(error); - return; - } - resolve({ stdout, stderr }); - }); - }); -} - -async function getLatestVersion(packageName) { - try { - const { stdout } = await execAsync(`npm view ${packageName}@latest version`); - const version = stdout.trim(); - return version; - } catch (error) { - throw error; - } -} -const packages = ['core']; - -export default async function releasePrep(args) { - try { - const latestVer = await getLatestVersion('@go-ui/core'); - console.log({ latestVer }); - packages.map((pkg) => { - const pkgRoot = path.resolve(__dirname, `../packages/${pkg}`); - const pkgFile = path.resolve(pkgRoot, 'package.json'); - const content = fs.readFileSync(pkgFile, 'utf8'); - let json = JSON.parse(content); - // replace version number - json['version'] = latestVer; - const newContent = JSON.stringify(json, undefined, 2); - fs.writeFileSync(pkgFile, newContent); - console.log(`[${pkgFile}]`); - console.log(newContent); - }); - } catch (error) { - console.error('Error:', error); - exit(1); - } -} diff --git a/bin/release.js b/bin/release.js new file mode 100644 index 0000000..8a8c64c --- /dev/null +++ b/bin/release.js @@ -0,0 +1,100 @@ +#!/usr/bin/env node +const { execSync } = require('child_process'); +const fs = require('fs'); +const path = require('path'); + +const RELEASE_COMMAND = 'pnpm run release --dry-run'; + +function getLatestVersion(packageName) { + console.log(`> Getting latest version number from npm`); + try { + const output = execSync(`npm view ${packageName}@latest version`); + const version = output.toString().trim(); + return version; + } catch (error) { + console.error(`❎ Cannot get latest version for ${packageName}`); + throw error; + } +} + +function syncCurrentCoreVersion() { + console.log(`0️⃣STEP 0. Sync current core version in case it's not the latest`); + try { + const latestVer = getLatestVersion('@go-ui/core'); + // get package json from core + const pkgFile = path.resolve(__dirname, '../packages/core/package.json'); + const content = fs.readFileSync(pkgFile, 'utf8'); + let json = JSON.parse(content); + if (json.version === latestVer) { + console.log('✅ package.json in core is already up to date.'); + return; + } + // replace version number + json['version'] = latestVer; + const newContent = JSON.stringify(json, undefined, 2); + fs.writeFileSync(pkgFile, newContent); + console.log(`✅ package.json in core has been updated to ${latestVer}.`); + } catch (error) { + console.error('❎ Error:', error); + process.exit(1); + } +} + +/** + * Run release script in packages/core/package.json + */ +function releaseCore() { + console.log(`1️⃣ STEP 1. Release core`); + try { + // set working directory to ./packages/core + const cwd = path.resolve(__dirname, '../packages/core'); + execSync(RELEASE_COMMAND, { cwd, stdio: 'inherit' }); + console.log('✅ Core package has been released.'); + } catch (error) { + console.error('❎ Error:', error); + process.exit(1); + } +} + +/** + * make sure react and vue packages use the same version number as core + * run `pnpm run gg release-prep-wrappers` in root + */ +function syncVersionToWrappers() { + console.log(`2️⃣ STEP 2. Sync version to wrappers`); + try { + execSync('pnpm run release-prep-wrappers', { stdio: 'inherit' }); + console.log('✅ React and Vue packages have been synced.'); + } catch (error) { + console.error('❎ Error:', error); + process.exit(1); + } +} + +/** + * Run release script in packages/react/package.json and packages/vue/package.json + */ +function releaseWrappers() { + const wrapperLibs = ['react', 'vue']; + console.log(`3️⃣ STEP 3. Release wrappers, ${wrapperLibs.join(', ')}`); + try { + for (let i = 0; i < wrapperLibs.length; i++) { + const lib = wrapperLibs[i]; + const cwd = path.resolve(__dirname, `../packages/${lib}`); + execSync(RELEASE_COMMAND, { cwd, stdio: 'inherit' }); + console.log(`✅ ${lib} package have been released.`); + } + } catch (error) { + console.error('❎ Error:', error); + process.exit(1); + } +} + +function main() { + syncCurrentCoreVersion(); + releaseCore(); + syncVersionToWrappers(); + releaseWrappers(); +} + +main(); diff --git a/package.json b/package.json index 811d8ec..9e665ad 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,7 @@ "test.spec": "nx test.spec @go-ui/core", "test.e2e.watch": "nx test.e2e.watch @go-ui/core", "test.e2e": "nx test.e2e @go-ui/core", - "prerelease": "pnpm run gg release-prep", - "release": "pnpm run --stream -r --filter \"./packages/core\" release", - "prerelease-wrappers": "pnpm run gg release-prep-wrappers", + "release": "node ./bin/release.js", "gg": "node ./bin/index.js" }, "devDependencies": { diff --git a/packages/core/package.json b/packages/core/package.json index bd41b87..24cc731 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -89,4 +89,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file From 0546341aed2bf7263d3011d392b6a99a386fd483 Mon Sep 17 00:00:00 2001 From: Sean Wu Date: Sun, 7 Apr 2024 11:09:33 +1000 Subject: [PATCH 3/3] chore: fix script --- bin/release.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/release.js b/bin/release.js index 8a8c64c..bc35943 100644 --- a/bin/release.js +++ b/bin/release.js @@ -63,7 +63,7 @@ function releaseCore() { function syncVersionToWrappers() { console.log(`2️⃣ STEP 2. Sync version to wrappers`); try { - execSync('pnpm run release-prep-wrappers', { stdio: 'inherit' }); + execSync('pnpm run gg release-prep-wrappers', { stdio: 'inherit' }); console.log('✅ React and Vue packages have been synced.'); } catch (error) { console.error('❎ Error:', error);