From 2386a14d7a76f89653a13de3a0d86e1bf55934d5 Mon Sep 17 00:00:00 2001 From: Cowch Date: Sat, 12 Jul 2025 16:31:13 -0500 Subject: [PATCH] fix(release): corrections --- scripts/create-gitea-release.js | 136 +++++++++----------------------- 1 file changed, 37 insertions(+), 99 deletions(-) diff --git a/scripts/create-gitea-release.js b/scripts/create-gitea-release.js index ca10351..f240767 100644 --- a/scripts/create-gitea-release.js +++ b/scripts/create-gitea-release.js @@ -3,6 +3,7 @@ if (!version) { console.error("Version not passed to create-gitea-release.js"); process.exit(1); } + import fs from "fs-extra"; import path from "path"; import { spawnSync } from "child_process"; @@ -11,15 +12,6 @@ import fetch from "node-fetch"; import dotenv from "dotenv"; dotenv.config({ path: "./.env" }); -// Load package.json version -// const pkg = await fs.readJson('package.json'); -// const version = pkg.version; - -if (!version) { - console.error("Version not found in package.json"); - process.exit(1); -} - // Resolve the directory of the current script const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -32,47 +24,64 @@ let buildNumber = "0"; try { const rawBuild = fs.readFileSync(buildNumberPath, "utf8"); console.log("Raw build", rawBuild); - if (rawBuild) { - // const [numPart, namePart] = rawBuild.split("-"); - // const num = parseInt(numPart, 10); - - // if (!isNaN(num) && namePart) { - // buildNumber = `${num - 1}-${namePart}`; - // } - buildNumber = rawBuild.trim(); - } + buildNumber = rawBuild.trim(); } catch (e) { console.log(e); console.warn("BUILD_NUMBER file not found, defaulting to 0"); } -// Compose full version string with build number const fullVersion = `${version}.${buildNumber}`; const { GITEA_URL, GITEA_USERNAME, GITEA_REPO, GITEA_TOKEN } = process.env; - if (!GITEA_URL || !GITEA_USERNAME || !GITEA_REPO || !GITEA_TOKEN) { - console.error( - "Missing required environment variables (GITEA_URL, GITEA_USERNAME, GITEA_REPO, GITEA_TOKEN)" - ); + console.error("Missing required environment variables"); process.exit(1); } +// Step 1: Generate or update CHANGELOG.md +console.log("Generating CHANGELOG.md..."); +const result = spawnSync( + "npx", + [ + "conventional-changelog", + "-p", + "conventionalcommits", + "-i", + "CHANGELOG.md", + "-s", + "-r", + "0", + ], + { stdio: "inherit", shell: true } +); + +if (result.status !== 0) { + console.error("Failed to generate changelog"); + process.exit(1); +} + +// Step 2: Read changelog content for current version +const changelog = await fs.readFile("CHANGELOG.md", "utf8"); +const regex = new RegExp(`## \\[${version}\\][\\s\\S]*?(?=## \\[|$)`, "m"); +const releaseNotes = changelog.match(regex)?.[0] || changelog; + +console.log(`Release notes for v${version} saved.`); + +// Step 3: Create or update Gitea release const createOrUpdateRelease = async () => { const tagName = `v${version}`; const apiBase = `https://${GITEA_URL}/api/v1/repos/${GITEA_USERNAME}/${GITEA_REPO}`; - // Check if release exists const existing = await fetch(`${apiBase}/releases/tags/${tagName}`, { headers: { Authorization: `token ${GITEA_TOKEN}` }, }); let release; + if (existing.ok) { const existingRelease = await existing.json(); console.log(`Release ${tagName} already exists. Updating it.`); - // Update existing release const updateResponse = await fetch( `${apiBase}/releases/${existingRelease.id}`, { @@ -100,7 +109,6 @@ const createOrUpdateRelease = async () => { release = await updateResponse.json(); console.log("Release updated:", release.html_url || release.url); } else if (existing.status === 404) { - // Release doesn't exist — create it const createResponse = await fetch(`${apiBase}/releases`, { method: "POST", headers: { @@ -135,78 +143,7 @@ const createOrUpdateRelease = async () => { return release; }; -const release = await createOrUpdateRelease(); - -if (release) { - console.log( - `Release with tag ${tagName} already exists. Updating release...` - ); - // Optionally update release body or assets here instead of creating a new release - return release; -} - -// 1) Generate or update CHANGELOG.md using conventional-changelog CLI -console.log("Generating CHANGELOG.md..."); -const result = spawnSync( - "npx", - [ - "conventional-changelog", - "-p", - "conventionalcommits", - "-i", - "CHANGELOG.md", - "-s", - "-r", - "0", - ], - { stdio: "inherit", shell: true } -); - -if (result.status !== 0) { - console.error("Failed to generate changelog"); - process.exit(1); -} - -// 2) Read changelog content for the current version -const changelog = await fs.readFile("CHANGELOG.md", "utf8"); -const regex = new RegExp(`## \\[${version}\\][\\s\\S]*?(?=## \\[|$)`, "m"); -const releaseNotes = changelog.match(regex)?.[0] || changelog; - -console.log(`Release notes for v${version} saved`); - -// 3) Create Gitea release -const createRelease = async () => { - const apiUrl = `https://${GITEA_URL}/api/v1/repos/${GITEA_USERNAME}/${GITEA_REPO}/releases`; - const releaseData = { - tag_name: `v${version}`, - name: `v${version}`, - body: releaseNotes, - draft: false, - prerelease: true, - }; - - const response = await fetch(apiUrl, { - method: "POST", - headers: { - Authorization: `token ${GITEA_TOKEN}`, - "Content-Type": "application/json", - }, - body: JSON.stringify(releaseData), - }); - - if (!response.ok) { - const errorText = await response.text(); - throw new Error( - `Failed to create release: ${response.status} - ${errorText}` - ); - } - - const release = await response.json(); - console.log("Release created:", release.html_url || release.url); - return release; -}; - -// 4) Upload release zip asset +// Step 4: Upload asset const uploadAsset = async (release) => { const apiUrl = `https://${GITEA_URL}/api/v1/repos/${GITEA_USERNAME}/${GITEA_REPO}/releases/assets?tag=${release.tag_name}`; const filePath = `releases/release-${fullVersion}.zip`; @@ -241,9 +178,10 @@ const uploadAsset = async (release) => { console.log("Asset uploaded:", asset.browser_download_url || asset.url); }; +// Run everything (async () => { try { - const release = await createRelease(); + const release = await createOrUpdateRelease(); await uploadAsset(release); } catch (err) { console.error(err);