From 6ea3c759ddb5cd262fea60a34ae1c7bfa4118243 Mon Sep 17 00:00:00 2001 From: Bero Date: Tue, 29 Oct 2024 10:52:13 +0100 Subject: [PATCH 01/11] Skip commit and deploy if build fails --- .../refresh-wordpress-major-and-beta.yml | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/.github/workflows/refresh-wordpress-major-and-beta.yml b/.github/workflows/refresh-wordpress-major-and-beta.yml index f9a614e49f..c15e487357 100644 --- a/.github/workflows/refresh-wordpress-major-and-beta.yml +++ b/.github/workflows/refresh-wordpress-major-and-beta.yml @@ -12,8 +12,8 @@ on: - cron: '*/20 * * * *' jobs: - build_and_deploy: - # Only run this workflow from the trunk branch and when it's triggered by dmsnell OR adamziel + build_wordpress_major_and_beta_push_to_github_and_deploy_website: + # Only run this workflow from the trunk branch and when it's triggered by a maintainer listed below if: > github.ref == 'refs/heads/trunk' && ( github.actor == 'adamziel' || @@ -42,19 +42,29 @@ jobs: shell: bash env: FORCE_REBUILD: ${{ github.event.inputs.force_rebuild }} - run: PATH="${PATH}:${HOME}/.bun/bin" npx nx bundle-wordpress:major-and-beta playground-wordpress-builds + run: | + PATH="${PATH}:${HOME}/.bun/bin" npx nx bundle-wordpress:major-and-beta playground-wordpress-builds + if [ $? -eq 0 ]; then + echo "WordPress build succeeded" + echo 'BUILD_FAILED=0' >> $GITHUB_OUTPUT + else + echo "WordPress build failed" + echo 'BUILD_FAILED=1' >> $GITHUB_OUTPUT + fi - name: Check for uncommitted changes + # Prevent commit if the build failed to avoid polluting the commit history + if: steps.changes.outputs.BUILD_FAILED == '0' id: changes run: | if [ -z "$(git status --porcelain)" ]; then echo "No changes" - echo 'CHANGES=0' >> $GITHUB_OUTPUT + echo 'COMMIT_CHANGES=0' >> $GITHUB_OUTPUT else echo "Changes detected" - echo 'CHANGES=1' >> $GITHUB_OUTPUT + echo 'COMMIT_CHANGES=1' >> $GITHUB_OUTPUT fi - name: Push rebuilt WordPress to GitHub - if: steps.changes.outputs.CHANGES == '1' + if: steps.changes.outputs.COMMIT_CHANGES == '1' run: | git config --global user.name "deployment_bot" git config --global user.email "deployment_bot@users.noreply.github.com" @@ -67,7 +77,7 @@ jobs: git push origin HEAD:trunk fi; - name: Deploy website - if: steps.changes.outputs.CHANGES == '1' + if: steps.changes.outputs.COMMIT_CHANGES == '1' uses: benc-uk/workflow-dispatch@v1 with: workflow: build-website.yml From 117725b11f59c72611687de3f36b153e540323dd Mon Sep 17 00:00:00 2001 From: Bero Date: Wed, 30 Oct 2024 08:43:29 +0100 Subject: [PATCH 02/11] Use outcome to prevent commits --- .github/workflows/refresh-wordpress-major-and-beta.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/refresh-wordpress-major-and-beta.yml b/.github/workflows/refresh-wordpress-major-and-beta.yml index c15e487357..7cbc31ec9d 100644 --- a/.github/workflows/refresh-wordpress-major-and-beta.yml +++ b/.github/workflows/refresh-wordpress-major-and-beta.yml @@ -39,21 +39,15 @@ jobs: curl -fsSL https://bun.sh/install | bash - uses: ./.github/actions/prepare-playground - name: 'Recompile WordPress' + id: build shell: bash env: FORCE_REBUILD: ${{ github.event.inputs.force_rebuild }} run: | PATH="${PATH}:${HOME}/.bun/bin" npx nx bundle-wordpress:major-and-beta playground-wordpress-builds - if [ $? -eq 0 ]; then - echo "WordPress build succeeded" - echo 'BUILD_FAILED=0' >> $GITHUB_OUTPUT - else - echo "WordPress build failed" - echo 'BUILD_FAILED=1' >> $GITHUB_OUTPUT - fi - name: Check for uncommitted changes # Prevent commit if the build failed to avoid polluting the commit history - if: steps.changes.outputs.BUILD_FAILED == '0' + if: steps.build.outcome == 'success' id: changes run: | if [ -z "$(git status --porcelain)" ]; then From 464c8b3f7ae2bf3c8a43dd917cca99660d760ac3 Mon Sep 17 00:00:00 2001 From: Bero Date: Wed, 30 Oct 2024 08:44:11 +0100 Subject: [PATCH 03/11] Cleanup --- .github/workflows/refresh-wordpress-major-and-beta.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/refresh-wordpress-major-and-beta.yml b/.github/workflows/refresh-wordpress-major-and-beta.yml index 7cbc31ec9d..65a74eb3db 100644 --- a/.github/workflows/refresh-wordpress-major-and-beta.yml +++ b/.github/workflows/refresh-wordpress-major-and-beta.yml @@ -43,8 +43,7 @@ jobs: shell: bash env: FORCE_REBUILD: ${{ github.event.inputs.force_rebuild }} - run: | - PATH="${PATH}:${HOME}/.bun/bin" npx nx bundle-wordpress:major-and-beta playground-wordpress-builds + run: PATH="${PATH}:${HOME}/.bun/bin" npx nx bundle-wordpress:major-and-beta playground-wordpress-builds - name: Check for uncommitted changes # Prevent commit if the build failed to avoid polluting the commit history if: steps.build.outcome == 'success' From 995dc17c2a545321b6e6fb2c33502850f61b1ebb Mon Sep 17 00:00:00 2001 From: Bero Date: Thu, 31 Oct 2024 07:26:17 +0100 Subject: [PATCH 04/11] Use the current date as the nightly version number --- packages/playground/wordpress-builds/build/build.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/playground/wordpress-builds/build/build.js b/packages/playground/wordpress-builds/build/build.js index 4d62bc445d..d2366f5c82 100644 --- a/packages/playground/wordpress-builds/build/build.js +++ b/packages/playground/wordpress-builds/build/build.js @@ -61,7 +61,11 @@ let versionInfo = {}; if (args.wpVersion === 'nightly') { versionInfo.url = 'https://wordpress.org/nightly-builds/wordpress-latest.zip'; - versionInfo.version = 'nightly'; + /** + * Nightly versions don't have a version number, so we use the date instead. + * This allows us to determine if the nightly version was already built. + */ + versionInfo.version = `nightly-${new Date().toISOString().split('T')[0]}`; versionInfo.majorVersion = 'nightly'; versionInfo.slug = 'nightly'; } else if (args.wpVersion === 'beta') { From 4f3964c8ef475a9e8154df1dd8ed6dcd01091ad0 Mon Sep 17 00:00:00 2001 From: Bero Date: Thu, 31 Oct 2024 08:12:33 +0100 Subject: [PATCH 05/11] build only the latest patch version --- .../wordpress-builds/build/build.js | 66 ++++++++++++++----- 1 file changed, 51 insertions(+), 15 deletions(-) diff --git a/packages/playground/wordpress-builds/build/build.js b/packages/playground/wordpress-builds/build/build.js index d2366f5c82..6a0c2270b3 100644 --- a/packages/playground/wordpress-builds/build/build.js +++ b/packages/playground/wordpress-builds/build/build.js @@ -1,8 +1,8 @@ - import path, { join } from 'path'; import { spawn } from 'child_process'; import yargs from 'yargs'; import { promises as fs, statSync } from 'fs'; +import semver from 'semver'; const parser = yargs(process.argv.slice(2)) .usage('Usage: $0 [options]') @@ -25,27 +25,57 @@ const parser = yargs(process.argv.slice(2)) }, force: { type: 'boolean', - description: 'Force rebuild even if the version is already downloaded', + description: + 'Force rebuild even if the version is already downloaded', default: process.env.FORCE_REBUILD === 'true', }, }); const args = parser.argv; -let latestVersions = await fetch('https://api.wordpress.org/core/version-check/1.7/?channel=beta') - .then((res) => res.json()) +let wpVersions = await fetch( + 'https://api.wordpress.org/core/version-check/1.7/?channel=beta' +).then((res) => res.json()); -latestVersions = latestVersions - .offers - .filter((v) => v.response === 'autoupdate') +wpVersions = wpVersions.offers.filter((v) => v.response === 'autoupdate'); let beta = null; -if (latestVersions[0].current.includes('beta') || latestVersions[0].current.toLowerCase().includes('rc')) { - beta = latestVersions[0]; - latestVersions = latestVersions.slice(1); +if ( + wpVersions[0].current.includes('beta') || + wpVersions[0].current.toLowerCase().includes('rc') +) { + beta = wpVersions[0]; + wpVersions = wpVersions.slice(1); } -function toVersionInfo(apiVersion, slug=null) { +/** + * Create a list of the latest patch versions for each major.minor version. + * + * Sometimes the API may include multiple patch versions for the same major.minor version. + * Playground builds only the latest patch version. + */ +const latestVersions = wpVersions.reduce((versionAccumulator, wpVersion) => { + const [major, minor] = wpVersion.version.split('.'); + const majorMinor = `${major}.${minor}`; + + const existingVersion = versionAccumulator.find((v) => + v.version.startsWith(majorMinor) + ); + if ( + !existingVersion || + semver.gt(wpVersion.version, existingVersion.version) + ) { + return [ + ...versionAccumulator.filter( + (v) => !v.version.startsWith(majorMinor) + ), + wpVersion, + ]; + } + return versionAccumulator; +}, []); + +function toVersionInfo(apiVersion, slug = null) { if (!apiVersion) { return {}; } @@ -79,11 +109,13 @@ if (args.wpVersion === 'nightly') { }[args.wpVersion]; versionInfo = toVersionInfo(relevantApiVersion); } else if (args.wpVersion.match(/\d\.\d/)) { - const relevantApiVersion = latestVersions.find((v) => v.version.startsWith(args.wpVersion)); + const relevantApiVersion = latestVersions.find((v) => + v.version.startsWith(args.wpVersion) + ); versionInfo = toVersionInfo(relevantApiVersion); } -if(!versionInfo.url) { +if (!versionInfo.url) { process.stdout.write(`WP version ${args.wpVersion} is not supported\n`); process.stdout.write(await parser.getHelp()); process.exit(1); @@ -105,7 +137,11 @@ try { versions = {}; } -if (!args.force && versionInfo.slug !== 'nightly' && versions[versionInfo.slug] === versionInfo.version) { +if ( + !args.force && + versionInfo.slug !== 'nightly' && + versions[versionInfo.slug] === versionInfo.version +) { process.stdout.write( `The requested version was ${args.wpVersion}, but its latest release (${versionInfo.version}) is already downloaded\n` ); @@ -128,7 +164,7 @@ try { '../../cli/src/cli.ts', 'run-blueprint', `--wp=${versionInfo.url}`, - `--mount-before-install=${wordpressDir}:/wordpress` + `--mount-before-install=${wordpressDir}:/wordpress`, ], { cwd: sourceDir, stdio: 'inherit' } ); From 2eb981b4fc9f4096c2bf90113397829f7685fe5e Mon Sep 17 00:00:00 2001 From: Bero Date: Thu, 31 Oct 2024 08:18:09 +0100 Subject: [PATCH 06/11] Remove Nightly version --- packages/playground/wordpress-builds/build/build.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/playground/wordpress-builds/build/build.js b/packages/playground/wordpress-builds/build/build.js index 6a0c2270b3..0fdf80ed69 100644 --- a/packages/playground/wordpress-builds/build/build.js +++ b/packages/playground/wordpress-builds/build/build.js @@ -91,11 +91,7 @@ let versionInfo = {}; if (args.wpVersion === 'nightly') { versionInfo.url = 'https://wordpress.org/nightly-builds/wordpress-latest.zip'; - /** - * Nightly versions don't have a version number, so we use the date instead. - * This allows us to determine if the nightly version was already built. - */ - versionInfo.version = `nightly-${new Date().toISOString().split('T')[0]}`; + versionInfo.version = 'nightly'; versionInfo.majorVersion = 'nightly'; versionInfo.slug = 'nightly'; } else if (args.wpVersion === 'beta') { From fafe7637ce8f1b9bc0560c43e807dd8177f44597 Mon Sep 17 00:00:00 2001 From: Bero Date: Thu, 31 Oct 2024 08:56:55 +0100 Subject: [PATCH 07/11] Simplify latest version filter --- .../wordpress-builds/build/build.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/playground/wordpress-builds/build/build.js b/packages/playground/wordpress-builds/build/build.js index 0fdf80ed69..e0915e2d1d 100644 --- a/packages/playground/wordpress-builds/build/build.js +++ b/packages/playground/wordpress-builds/build/build.js @@ -58,19 +58,18 @@ const latestVersions = wpVersions.reduce((versionAccumulator, wpVersion) => { const [major, minor] = wpVersion.version.split('.'); const majorMinor = `${major}.${minor}`; - const existingVersion = versionAccumulator.find((v) => + const currentVersionIndex = versionAccumulator.findIndex((v) => v.version.startsWith(majorMinor) ); - if ( - !existingVersion || - semver.gt(wpVersion.version, existingVersion.version) + if (-1 === currentVersionIndex) { + return [...versionAccumulator, wpVersion]; + } else if ( + semver.gt( + wpVersion.version, + versionAccumulator[currentVersionIndex].version + ) ) { - return [ - ...versionAccumulator.filter( - (v) => !v.version.startsWith(majorMinor) - ), - wpVersion, - ]; + return versionAccumulator.splice(currentVersionIndex, 1, wpVersion); } return versionAccumulator; }, []); From 7cad147c6f0a3b2ea15ea64c15573bedccf727b0 Mon Sep 17 00:00:00 2001 From: Bero Date: Fri, 1 Nov 2024 08:35:10 +0100 Subject: [PATCH 08/11] Update .github/workflows/refresh-wordpress-major-and-beta.yml --- .github/workflows/refresh-wordpress-major-and-beta.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/refresh-wordpress-major-and-beta.yml b/.github/workflows/refresh-wordpress-major-and-beta.yml index 65a74eb3db..0eb2d9466f 100644 --- a/.github/workflows/refresh-wordpress-major-and-beta.yml +++ b/.github/workflows/refresh-wordpress-major-and-beta.yml @@ -46,7 +46,6 @@ jobs: run: PATH="${PATH}:${HOME}/.bun/bin" npx nx bundle-wordpress:major-and-beta playground-wordpress-builds - name: Check for uncommitted changes # Prevent commit if the build failed to avoid polluting the commit history - if: steps.build.outcome == 'success' id: changes run: | if [ -z "$(git status --porcelain)" ]; then From 70939dac3494d8c79de2f87c5a1024ac84b3adee Mon Sep 17 00:00:00 2001 From: Bero Date: Fri, 1 Nov 2024 08:35:50 +0100 Subject: [PATCH 09/11] Update .github/workflows/refresh-wordpress-major-and-beta.yml --- .github/workflows/refresh-wordpress-major-and-beta.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/refresh-wordpress-major-and-beta.yml b/.github/workflows/refresh-wordpress-major-and-beta.yml index 0eb2d9466f..86a70e5d2d 100644 --- a/.github/workflows/refresh-wordpress-major-and-beta.yml +++ b/.github/workflows/refresh-wordpress-major-and-beta.yml @@ -45,7 +45,6 @@ jobs: FORCE_REBUILD: ${{ github.event.inputs.force_rebuild }} run: PATH="${PATH}:${HOME}/.bun/bin" npx nx bundle-wordpress:major-and-beta playground-wordpress-builds - name: Check for uncommitted changes - # Prevent commit if the build failed to avoid polluting the commit history id: changes run: | if [ -z "$(git status --porcelain)" ]; then From 3a98021e96a67f2807b4071ca26cad4e2cd8e1cc Mon Sep 17 00:00:00 2001 From: Bero Date: Fri, 1 Nov 2024 08:39:25 +0100 Subject: [PATCH 10/11] Fix change version bug --- packages/playground/wordpress-builds/build/build.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/playground/wordpress-builds/build/build.js b/packages/playground/wordpress-builds/build/build.js index e0915e2d1d..5edf571e42 100644 --- a/packages/playground/wordpress-builds/build/build.js +++ b/packages/playground/wordpress-builds/build/build.js @@ -69,7 +69,8 @@ const latestVersions = wpVersions.reduce((versionAccumulator, wpVersion) => { versionAccumulator[currentVersionIndex].version ) ) { - return versionAccumulator.splice(currentVersionIndex, 1, wpVersion); + versionAccumulator[currentVersionIndex] = wpVersion; + return versionAccumulator; } return versionAccumulator; }, []); From 122ecfaf8d574f5cea8bc30d727644a2b128acbb Mon Sep 17 00:00:00 2001 From: Bero Date: Fri, 1 Nov 2024 08:45:52 +0100 Subject: [PATCH 11/11] Return only once --- packages/playground/wordpress-builds/build/build.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/playground/wordpress-builds/build/build.js b/packages/playground/wordpress-builds/build/build.js index 5edf571e42..c8fb12be4c 100644 --- a/packages/playground/wordpress-builds/build/build.js +++ b/packages/playground/wordpress-builds/build/build.js @@ -62,7 +62,7 @@ const latestVersions = wpVersions.reduce((versionAccumulator, wpVersion) => { v.version.startsWith(majorMinor) ); if (-1 === currentVersionIndex) { - return [...versionAccumulator, wpVersion]; + versionAccumulator.push(wpVersion); } else if ( semver.gt( wpVersion.version, @@ -70,7 +70,6 @@ const latestVersions = wpVersions.reduce((versionAccumulator, wpVersion) => { ) ) { versionAccumulator[currentVersionIndex] = wpVersion; - return versionAccumulator; } return versionAccumulator; }, []);