From 20805880ed945afccf7077da107b152327ca1bd1 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Mon, 9 May 2022 13:29:59 +0200 Subject: [PATCH 1/6] scripts: ensure that create-app is bumped with every release. Signed-off-by: Johan Haals --- package.json | 2 +- scripts/bump-create-app.js | 84 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 1 deletion(-) create mode 100755 scripts/bump-create-app.js diff --git a/package.json b/package.json index 7752322535..129e50c95d 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "backstage-create": "backstage-cli create --scope backstage --no-private", "create-plugin": "yarn backstage-create --select plugin", "remove-plugin": "backstage-cli remove-plugin", - "release": "node scripts/prepare-release.js && changeset version && yarn diff --yes && yarn prettier --write '{packages,plugins}/*/{package.json,CHANGELOG.md}' '.changeset/*.json' && yarn install", + "release": "node scripts/bump-create-app.js && node scripts/prepare-release.js && changeset version && yarn diff --yes && yarn prettier --write '{packages,plugins}/*/{package.json,CHANGELOG.md}' '.changeset/*.json' && yarn install", "prettier:check": "prettier --check .", "lerna": "lerna", "storybook": "yarn --cwd storybook start", diff --git a/scripts/bump-create-app.js b/scripts/bump-create-app.js new file mode 100755 index 0000000000..2b552086af --- /dev/null +++ b/scripts/bump-create-app.js @@ -0,0 +1,84 @@ +#!/usr/bin/env node +/* + * Copyright 2020 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* eslint-disable import/no-extraneous-dependencies */ + +const { resolve: resolvePath } = require('path'); +const fs = require('fs-extra'); +const { default: parseChangeset } = require('@changesets/parse'); +const { execFile: execFileCb } = require('child_process'); +const { promisify } = require('util'); + +const exec = promisify(execFileCb); + +async function main() { + process.chdir(resolvePath(__dirname, '../.changeset')); + + const fileNames = await fs.readdir('.'); + const changesetNames = fileNames.filter( + name => name.endsWith('.md') && name !== 'README.md', + ); + + const changesets = await Promise.all( + changesetNames.map(async name => { + const content = await fs.readFile(name, 'utf8'); + return { name, ...parseChangeset(content) }; + }), + ); + + let excludeList = []; + if (await fs.pathExists('pre.json')) { + const data = await fs.readJSON('pre.json'); + excludeList = data.changesets.map(name => `${name}.md`); + } + const hasCreateAppChanges = changesets + .filter(({ name }) => !excludeList.includes(name)) + .map(changeset => + changeset.releases.some( + release => release.name === '@backstage/create-app', + ), + ) + .includes(true); + + if (hasCreateAppChanges) { + console.log( + 'Contains create-app changeset, no need to create additional changeset', + ); + return; + } + const ts = Math.round(new Date().getTime() / 1000); + const fileName = `create-app-${ts}.md`; + console.log(`Creating ${fileName}`); + const data = `--- +'@backstage/create-app': patch +---\n +Bumped create-app version.\n`; + await fs.writeFile(fileName, data); + await exec('git', ['config', 'user.name', `"github-actions[bot]"`]); + await exec('git', [ + 'config', + 'user.email', + `"github-actions[bot]@users.noreply.github.com"`, + ]); + await exec('git', ['add', fileName]); + await exec('git', ['commit', '-m', 'Add create-app changeset']); +} + +main().catch(error => { + console.error(error.stack); + process.exit(1); +}); From c9fc26c48f849f873aac138d6829aff428da51fb Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Mon, 9 May 2022 13:34:31 +0200 Subject: [PATCH 2/6] create-app: use version from package root Signed-off-by: Johan Haals --- packages/create-app/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/create-app/src/index.ts b/packages/create-app/src/index.ts index adb8560f31..216fab6740 100644 --- a/packages/create-app/src/index.ts +++ b/packages/create-app/src/index.ts @@ -22,7 +22,7 @@ import { program } from 'commander'; import { exitWithError } from './lib/errors'; -import { version } from '../package.json'; +import { version } from '../../../package.json'; import createApp from './createApp'; const main = (argv: string[]) => { From c00f5e89822cd91038fe2564b3157ddb94f81eb2 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Mon, 9 May 2022 15:17:13 +0200 Subject: [PATCH 3/6] chore: move bump-create-app to prepare-release Signed-off-by: Johan Haals --- package.json | 2 +- scripts/bump-create-app.js | 84 -------------------------------------- scripts/prepare-release.js | 51 +++++++++++++++++++++++ 3 files changed, 52 insertions(+), 85 deletions(-) delete mode 100755 scripts/bump-create-app.js diff --git a/package.json b/package.json index 129e50c95d..7752322535 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "backstage-create": "backstage-cli create --scope backstage --no-private", "create-plugin": "yarn backstage-create --select plugin", "remove-plugin": "backstage-cli remove-plugin", - "release": "node scripts/bump-create-app.js && node scripts/prepare-release.js && changeset version && yarn diff --yes && yarn prettier --write '{packages,plugins}/*/{package.json,CHANGELOG.md}' '.changeset/*.json' && yarn install", + "release": "node scripts/prepare-release.js && changeset version && yarn diff --yes && yarn prettier --write '{packages,plugins}/*/{package.json,CHANGELOG.md}' '.changeset/*.json' && yarn install", "prettier:check": "prettier --check .", "lerna": "lerna", "storybook": "yarn --cwd storybook start", diff --git a/scripts/bump-create-app.js b/scripts/bump-create-app.js deleted file mode 100755 index 2b552086af..0000000000 --- a/scripts/bump-create-app.js +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env node -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* eslint-disable import/no-extraneous-dependencies */ - -const { resolve: resolvePath } = require('path'); -const fs = require('fs-extra'); -const { default: parseChangeset } = require('@changesets/parse'); -const { execFile: execFileCb } = require('child_process'); -const { promisify } = require('util'); - -const exec = promisify(execFileCb); - -async function main() { - process.chdir(resolvePath(__dirname, '../.changeset')); - - const fileNames = await fs.readdir('.'); - const changesetNames = fileNames.filter( - name => name.endsWith('.md') && name !== 'README.md', - ); - - const changesets = await Promise.all( - changesetNames.map(async name => { - const content = await fs.readFile(name, 'utf8'); - return { name, ...parseChangeset(content) }; - }), - ); - - let excludeList = []; - if (await fs.pathExists('pre.json')) { - const data = await fs.readJSON('pre.json'); - excludeList = data.changesets.map(name => `${name}.md`); - } - const hasCreateAppChanges = changesets - .filter(({ name }) => !excludeList.includes(name)) - .map(changeset => - changeset.releases.some( - release => release.name === '@backstage/create-app', - ), - ) - .includes(true); - - if (hasCreateAppChanges) { - console.log( - 'Contains create-app changeset, no need to create additional changeset', - ); - return; - } - const ts = Math.round(new Date().getTime() / 1000); - const fileName = `create-app-${ts}.md`; - console.log(`Creating ${fileName}`); - const data = `--- -'@backstage/create-app': patch ----\n -Bumped create-app version.\n`; - await fs.writeFile(fileName, data); - await exec('git', ['config', 'user.name', `"github-actions[bot]"`]); - await exec('git', [ - 'config', - 'user.email', - `"github-actions[bot]@users.noreply.github.com"`, - ]); - await exec('git', ['add', fileName]); - await exec('git', ['commit', '-m', 'Add create-app changeset']); -} - -main().catch(error => { - console.error(error.stack); - process.exit(1); -}); diff --git a/scripts/prepare-release.js b/scripts/prepare-release.js index d5ad1842d4..a9b161a33a 100755 --- a/scripts/prepare-release.js +++ b/scripts/prepare-release.js @@ -22,6 +22,7 @@ const { getPackages } = require('@manypkg/get-packages'); const path = require('path'); const { execFile: execFileCb } = require('child_process'); const { promisify } = require('util'); +const { default: parseChangeset } = require('@changesets/parse'); const execFile = promisify(execFileCb); @@ -332,6 +333,55 @@ async function updateBackstageReleaseVersion(repo, type) { ); } +/** + * Ensures that the changesets include a version bump of create-app otherwise + * generates a new patch changeset for create-app. + */ +async function ensureCreateAppChangeset() { + process.chdir(path.resolve(__dirname, '../.changeset')); + + const fileNames = await fs.readdir('.'); + const changesetNames = fileNames.filter( + name => name.endsWith('.md') && name !== 'README.md', + ); + + const changesets = await Promise.all( + changesetNames.map(async name => { + const content = await fs.readFile(name, 'utf8'); + return { name, ...parseChangeset(content) }; + }), + ); + + let excludeList = []; + if (await fs.pathExists('pre.json')) { + const data = await fs.readJSON('pre.json'); + excludeList = data.changesets.map(name => `${name}.md`); + } + const hasCreateAppChanges = changesets + .filter(({ name }) => !excludeList.includes(name)) + .map(changeset => + changeset.releases.some( + release => release.name === '@backstage/create-app', + ), + ) + .includes(true); + + if (hasCreateAppChanges) { + console.log( + 'Contains create-app changeset, no need to create additional changeset', + ); + return; + } + const ts = Math.round(new Date().getTime() / 1000); + const fileName = `create-app-${ts}.md`; + console.log(`Creating ${fileName}`); + const data = `--- +'@backstage/create-app': patch +---\n +Bumped create-app version.\n`; + await fs.writeFile(fileName, data); +} + async function main() { const repo = await getPackages(__dirname); const branchName = await getCurrentBranch(repo); @@ -344,6 +394,7 @@ async function main() { } await updateBackstageReleaseVersion(repo, isMainBranch ? 'minor' : 'patch'); + await ensureCreateAppChangeset(); } main().catch(error => { From 935d8515dac6fcbde05af6a8c05b0b75abce507d Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Mon, 9 May 2022 15:21:49 +0200 Subject: [PATCH 4/6] add changeset Signed-off-by: Johan Haals --- .changeset/loud-walls-itch.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/loud-walls-itch.md diff --git a/.changeset/loud-walls-itch.md b/.changeset/loud-walls-itch.md new file mode 100644 index 0000000000..eff8c8b5c6 --- /dev/null +++ b/.changeset/loud-walls-itch.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Updated the `--version` flag to output the version of the current backstage release instead of the version of create-app. From a98427107074bc9c3dcd81c5ad4ca9027ad1e7e6 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Wed, 11 May 2022 13:36:44 +0200 Subject: [PATCH 5/6] Remove chdir. Only exclude in pre mode Signed-off-by: Johan Haals --- scripts/prepare-release.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/scripts/prepare-release.js b/scripts/prepare-release.js index a9b161a33a..fdf76f0a90 100755 --- a/scripts/prepare-release.js +++ b/scripts/prepare-release.js @@ -338,24 +338,26 @@ async function updateBackstageReleaseVersion(repo, type) { * generates a new patch changeset for create-app. */ async function ensureCreateAppChangeset() { - process.chdir(path.resolve(__dirname, '../.changeset')); - - const fileNames = await fs.readdir('.'); + const changesetPath = path.resolve(__dirname, '../.changeset'); + const fileNames = await fs.readdir(changesetPath); const changesetNames = fileNames.filter( name => name.endsWith('.md') && name !== 'README.md', ); const changesets = await Promise.all( changesetNames.map(async name => { - const content = await fs.readFile(name, 'utf8'); + const content = await fs.readFile(path.join(changesetPath, name), 'utf8'); return { name, ...parseChangeset(content) }; }), ); let excludeList = []; - if (await fs.pathExists('pre.json')) { - const data = await fs.readJSON('pre.json'); - excludeList = data.changesets.map(name => `${name}.md`); + const prePath = path.resolve(changesetPath, 'pre.json'); + if (await fs.pathExists(prePath)) { + const data = await fs.readJSON(prePath); + // Only exclude changesets in pre-release mode. + excludeList = + data.mode === 'pre' ? data.changesets.map(name => `${name}.md`) : []; } const hasCreateAppChanges = changesets .filter(({ name }) => !excludeList.includes(name)) @@ -379,7 +381,7 @@ async function ensureCreateAppChangeset() { '@backstage/create-app': patch ---\n Bumped create-app version.\n`; - await fs.writeFile(fileName, data); + await fs.writeFile(path.join(changesetPath, fileName), data); } async function main() { From e36176020266519cc57fa2f00a779000a9c2e3c1 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Fri, 13 May 2022 09:37:54 +0200 Subject: [PATCH 6/6] simplify exclude list filtering Signed-off-by: Johan Haals --- scripts/prepare-release.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/scripts/prepare-release.js b/scripts/prepare-release.js index fdf76f0a90..e4c987733d 100755 --- a/scripts/prepare-release.js +++ b/scripts/prepare-release.js @@ -351,22 +351,23 @@ async function ensureCreateAppChangeset() { }), ); - let excludeList = []; + const excludeList = []; const prePath = path.resolve(changesetPath, 'pre.json'); if (await fs.pathExists(prePath)) { const data = await fs.readJSON(prePath); // Only exclude changesets in pre-release mode. - excludeList = - data.mode === 'pre' ? data.changesets.map(name => `${name}.md`) : []; + if (data.mode === 'pre') { + excludeList.push(...data.changesets.map(name => `${name}.md`)); + } } + const hasCreateAppChanges = changesets .filter(({ name }) => !excludeList.includes(name)) - .map(changeset => + .some(changeset => changeset.releases.some( release => release.name === '@backstage/create-app', ), - ) - .includes(true); + ); if (hasCreateAppChanges) { console.log(