-
Notifications
You must be signed in to change notification settings - Fork 268
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Boot protocol #1398
Labels
Comments
The only two files Playground modifies during the boot sequence now are:
|
adamziel
added a commit
that referenced
this issue
May 15, 2024
Prevents creating a `wp-config.php` file in WordPress document root. Instead, creates it one level higher as WordPress falls back to loading it from there. Related to #1398. Similar to #1382 and #1401. ## Testing instructions Run `bun packages/playground/cli/src/cli.ts server --login` and confirm it loads an installed WordPress.
adamziel
added a commit
that referenced
this issue
May 15, 2024
Prevents creating a `wp-config.php` file in WordPress document root. Instead, creates it one level higher as WordPress falls back to loading it from there. Related to #1398. Similar to #1382 and #1401. ## Testing instructions Run `bun packages/playground/cli/src/cli.ts server --login` and confirm it loads an installed WordPress.
adamziel
added a commit
that referenced
this issue
May 16, 2024
With this PR, you can mount directories in Playground CLI before WordPress is installed. This enables creating the entire file structure in a local directory instead of VFS. This is just the first step. Eventually we'll have more `mount` switches and the name `mount` will just default to one of the options. ## Testing instructions Run this and confirm WordPress got installed in the local directory: ```shell bun packages/playground/cli/src/cli.ts run-blueprint --mount-before-install=`pwd`/new-wordpress-site:/wordpress ll new-wordpress-site ``` Related to #1398
This was referenced May 16, 2024
adamziel
added a commit
that referenced
this issue
May 16, 2024
Do not merge – explorations in progress Uses Playground CLI to produce a minified WordPress build, replacing the custom bash-based WordPres installation flow that relied on wget, unzip, sed, wp-cli etc. This is to dogfood Playground CLI and put the boot protocol to a practical use. With this PR, CLI Playground produces a minified WordPress version that is later used to boot the web Playground. Eventually, the minification logic could be just a Blueprint instead of a Dockerfile. For now, though, I didn't explore that. ## Remaining work To ship this PR, remote.html needs to use the same boot logic as the CLI Playground and, e.g., install the SQLite integration plugin in the `/internal` directory. In its current state, this PR just ships a minified WordPress without that plugin. ## Testing instructions Rebuild the latest WordPress with ```shell rm -rf packages/playground/wordpress-builds/public/wp-6.5 npx nx bundle-wordpress:major-and-beta playground-wordpress-builds ``` Then run `npm run dev` and confirm the local Playground loads without any issues. Related: #1398
4 tasks
adamziel
added a commit
that referenced
this issue
May 17, 2024
Do not merge – explorations in progress Uses Playground CLI to produce a minified WordPress build, replacing the custom bash-based WordPres installation flow that relied on wget, unzip, sed, wp-cli etc. This is to dogfood Playground CLI and put the boot protocol to a practical use. With this PR, CLI Playground produces a minified WordPress version that is later used to boot the web Playground. Eventually, the minification logic could be just a Blueprint instead of a Dockerfile. For now, though, I didn't explore that. ## Remaining work To ship this PR, remote.html needs to use the same boot logic as the CLI Playground and, e.g., install the SQLite integration plugin in the `/internal` directory. In its current state, this PR just ships a minified WordPress without that plugin. ## Testing instructions Rebuild the latest WordPress with ```shell rm -rf packages/playground/wordpress-builds/public/wp-6.5 npx nx bundle-wordpress:major-and-beta playground-wordpress-builds ``` Then run `npm run dev` and confirm the local Playground loads without any issues. Related: #1398
adamziel
added a commit
that referenced
this issue
May 17, 2024
Related to Boot protocol #1398 Ships the SQLite database integration in WordPress builds to make it accessible in remote.html and enable installing it separately in WordPress builds that don't ship it by default. No testing instructions – this only adds new code that's not used for anything yet.
adamziel
added a commit
that referenced
this issue
May 17, 2024
Related to Boot protocol #1398 Ships the SQLite database integration in WordPress builds to make it accessible in remote.html and enable installing it separately in WordPress builds that don't ship it by default. To test, run `rm packages/playground/wordpress-builds/src/sqlite-database-integration/sqlite-database-integration.zip` and then confirm this command refreshes the local SQLite database zip: ``` nx bundle-sqlite-database playground-wordpress-builds ```
This was referenced May 17, 2024
Merged
adamziel
added a commit
that referenced
this issue
May 18, 2024
…ld (without the SQLite integration plugin) Uses Playground CLI to produce a minified WordPress build, replacing the custom bash-based WordPress installation flow that relied on wget, unzip, sed, wp-cli etc. This is to dogfood Playground CLI and put the boot protocol to a practical use. With this PR, CLI Playground produces a minified WordPress version that is later used to boot the web Playground. Depends on #1423 #1423 #1425 ## Testing instructions Rebuild the latest WordPress with ```shell rm -rf packages/playground/wordpress-builds/public/wp-6.5 npx nx bundle-wordpress:major-and-beta playground-wordpress-builds ``` Then run npm run dev and confirm the local Playground loads without any issues. Related: #1398
adamziel
added a commit
that referenced
this issue
May 20, 2024
…d php.setPhpIniEntry() (#1423) Refactors PHP.ini management: * Removes the `php.setPhpIniEntry()` methods that only worked correctly when called before initializing the PHP runtime. * Hardcodes the php.ini path to `/internal/shared/php.ini`. The developer is welcome to override that file as needed, but they can't customize the path. Once changing the path becomes important, let's add that feature at the [Boot Protocol](#1398) level. * Provides `getPhpIniEntries()`, `setPhpIniEntries()`, and `withPHPIniValues()` helpers that work at any point of the PHP runtime lifecycle. * Moves a list of the default php.ini values from `php_wasm.c` to `base-php.ts` where it can be customized without rebuilding the wasm module. ## What problem is it solving? Working with php.ini is highly problematic as you could never be sure whether your `setPhpIni*` call would be effective. Then, at the API level, the `setPhpIni*` methods were also excluded from some TypeScript types but not from the others. ## Remaining work * Rebuild all the PHP modules ## Testing Instructions Confirm the CI tests pass.
adamziel
added a commit
that referenced
this issue
May 20, 2024
…if there's no custom db.php inside wp-content (#1424) This PR always preloads the SQLite plugin in remote.html, even if the provided WordPress already ships one. The preloaded plugin will only be used if no `wp-content/db.php` drop-in plugin is found in the filesystem. This change sets the stage for: * #1426, which ships a minified WordPress build without the SQLite plugin baked-in. * #1425, which runs the WordPress installation wizard if the site isn't installed yet Related to [Boot Protocol](#1398) ## Problem solved We want the official WordPress release `.zip` to just work in Playground. Currently it doesn't because remote.html expects a pre-processed build with the SQLite plugin already baked-in. This PR, in conjunction with #1425 and #1426, remove that requirement. ## Testing Instructions Confirm the CI checks pass.
adamziel
added a commit
that referenced
this issue
May 20, 2024
## What is this PR doing? Runs the WordPress installation process in remote.html when the loaded WordPress instance isn't installed yet. This is to enable the official WordPress release `.zip` to just work in Playground. Currently it doesn't because remote.html expects a pre-installed WordPress build with a pre-populated SQLite database already baked-in. This PR, in conjunction with #1425 and #1426, remove that requirement. Related to [Boot Protocol](#1398) ## Testing Instructions Confirm the CI checks pass.
This was referenced May 23, 2024
adamziel
added a commit
that referenced
this issue
May 23, 2024
Implements a `bootWordPress()` function aiming to provide a reliable and consistent boot pipeline for every Playground-based app, whether it's a browser app, server app, a VS Code extension, or anything else. As a nice side-effect, Playground can now boot not just from the custom minified WordPress builds, but also from the official WordPress releases! Related issue: #1398 ## How does it work? `bootWordPress()` ties together all the pieces from different Playground-based apps. [Boot flow diagram](#1379 (comment)) demonstrates the idea. A tl;dr pipeline is: * Mount resources (stage=before WordPress files) * Unzip WordPress, if that's requested * Mount resources (stage=before database setup) * Setup SQLite, MySQL (TODO), or rely on a mounted database * Run WordPress installer, if the site isn't installed yet Here's a usage example in a Node.js app: ```ts const requestHandler = await bootWordPress({ siteUrl: absoluteUrl, createPhpInstance() { return new NodePHP(); }, createPhpRuntime: async () => await NodePHP.loadRuntime(compiledBlueprint.versions.php), wordPressZip, sqliteIntegrationPluginZip: fetchSqliteIntegration(monitor), sapiName: 'cli', createFiles: { '/internal/shared/ca-bundle.crt': rootCertificates.join('\n'), }, phpIniEntries: { 'openssl.cafile': '/internal/shared/ca-bundle.crt', allow_url_fopen: '1', disable_functions: '', }, hooks: { async beforeWordPressFiles(php) { if (args.mountBeforeInstall) { mountResources(php, args.mountBeforeInstall); } }, }, }); ``` ## Testing instructions * Confirm all the CI checks work * Load the latest nightly **official WordPress build** into Playground: http://localhost:5400/website-server/?php=8.0&wp=http://localhost:5400/plugin-proxy.php?url=https://wordpress.org/nightly-builds/wordpress-latest.zip * Load the official WordPress 6.5 release into Playground: http://localhost:5400/website-server/?php=8.0&wp=http://localhost:5400/plugin-proxy.php?url=https://wordpress.org/latest.zip * Confirm Playground CLI still works: Run bun packages/playground/cli/src/cli.ts server --login and confirm it loads an installed WordPress. ## Follow-up work * Replace manual calls to `setupPlatformLevelMuPlugins()` in unit tests with `bootWordPress()` * Add unit tests to confirm boot works with minified WordPress build, official WordPress release, SQLite, MySQL. Test all the `BootOptions` and confirm PHP.ini directives are used, constants are created etc. * Remove the `createPhpInstance()` argument in favor of using just the `PHP` class – once #1457 merges * Figure out storing `debug.log` in the `configureErrorLogging` mu-plugin – right now it's stored in `/wordpress/wp-content` * Support more database modes: MySQL and `custom` where Playground relies on `db.php` brought in from * Replace hooks with a Mount data type that would have different implementations, like OPFS, Native FS, and Node FS – explorations started in #1457 * Once the API settles, document the usage for developers cc @brandonpayton @bgrgicak
adamziel
added a commit
that referenced
this issue
May 25, 2024
… "PHP" class (#1457) > [!WARNING] > This is breaking change! Review the description below to assess the impact on your app. Consolidates the `BasePHP`, `NodePHP`, and `WebPHP` classes into a single `PHP` class. This refactor reduces redundancy and clarifies the PHP handling process across different environments. ## Examples ### NodePHP **Before** ```ts import { NodePHP } from '@php-wasm/node'; const php = await NodePHP.load('8.0'); ``` **After** ```ts import { loadNodeRuntime } from '@php-wasm/node'; import { PHP } from '@php-wasm/universal'; const php = new PHP(await loadNodeRuntime('8.0')); ``` ### WebPHP **Before** ```ts import { WebPHP } from '@php-wasm/web'; const php = await WebPHP.loadRuntime('8.0'); ``` **After** ```ts import { loadWebRuntime } from '@php-wasm/web'; import { PHP } from '@php-wasm/universal'; const php = new PHP(await loadWebRuntime('8.0')); ``` ### Mounting **Before** ```ts php.useHostFilesystem(); // or php.mount( '/home/users/adam/my-dir', '/my-dir-in-vfs'); ``` **After** ```ts import { NodeFSMount, useHostFilesystem } from '@php-wasm/node'; useHostFilesystem( php ); php.mount( new NodeFSMount( '/home/users/adam/my-dir' ), '/my-dir-in-vfs' ); ``` Closes #1399 ## Motivation First, the public API surface of all the PHP classes and interfaces is [overly complex](#514). This PR is a step towards simplifying it. Second, in the [Boot Protocol](#1398), PR the `bootWordPress()` function requires separate `createPHP` and `createPHPRuntime` callbacks just because Playground uses different classes in node.js and in the browser. With this PR, `createPHP` callback will no longer be needed anymore as `bootWordPress()` will just always create a `new PHP()` instance. ## Public API Changes - Removes `BasePHP`, `NodePHP`, and `WebPHP` classes in favor of a single PHP class exported from `@php-wasm/universal` - `php.useHostFilesystem()` was removed in favor of a decoupled function `useHostFilesystem( php )` available in `@php-wasm/node`. - `PHP.mount()` signature changed from `mount( hostPath: string, vfsPath: string )` to `mount( mountable: Mountable, vfsPath: string )` - Moves WebPHPEndpoint from `@php-wasm/web` to `@php-wasm/universal` and renames it to `PHPWorker`. That class isn't specific to the web and could be easily used by Node workers. - Removes the `IsomorphicLocalPHP` interface. The PHP class is now the source of truth for all derived worker, client, etc. implementations. - Removes the `createPhpInstance()` option from `bootWordPress( options )` in favor of always using the PHP class. - Updates to Documentation: Adjusted examples and references in the documentation to reflect the new `PHP` class. - Refactoring of Test Suites: Updated tests to work with the new class structure. ## Testing instructions Confirm all the CI checks pass – this PR includes an extensive refactor of all the tests. Heads up @wojtekn @fluiddot @sejas
adamziel
added a commit
that referenced
this issue
May 28, 2024
…ld (without the SQLite integration plugin) (#1426) Uses Playground CLI to produce the minified WordPress builds: ```bash $ bun \ packages/playground/cli/src/cli.ts run-blueprint \ --wp=https://wordpress.org/6.5.zip \ --mount-before-install=./wordpress-site:/wordpress ``` Those new builds ships **without** the SQLite database integration plugin but **with** the SQLite database file containing all the data and tables created by a vanilla WordPress installation. Advantages: * Less code to maintain – Playground CLI replaces a custom bash script relying on wget, unzip, sed, wp-cli etc. * More testing for our internal tools – we're dogfooding Playground CLI and the boot protocol in the critical code path. ## Testing instructions * Confirm the CI checks passed – this is about as good of a testing as we can get. * Run `npm run dev` and confirm the local Playground loads without any issues. Run `bun packages/playground/cli/src/cli.ts server --login` and confirm it loads an installed WordPress. Related: #1398
We still need to address this one: #1486 |
This was referenced Jul 1, 2024
adamziel
added a commit
that referenced
this issue
Jul 3, 2024
Closes #1543 Playground exports before changes from the Boot Protocol (#1398) contained platform-level WordPress plugins and mu-plugins. The importer, then, removed them and replaced them with the latest version freshly sourced from the /wordpress directory. However, after the Boot Protocol changes, Playground no longer includes any platform-level plugins in the /wordpress directory. This means that things like SQLite database integration were being removed from the imported ZIP bundle but they were not restored. This PR removes this "remove & restore" mechanism. If the ZIP comes with its own SQLite database integration, that one will be used. If it doesn't, then Playground will fall back to the platform-level plugin. ## Testing instructions 1. Export Playground as zip and import it again. Confirm this worked. 2. Run [this Blueprint that imports an older ZIP bundle](https://playground.wordpress.net/builder/builder.html#{%22landingPage%22:%22/%22,%22preferredVersions%22:{%22php%22:%228.0%22,%22wp%22:%22latest%22},%22phpExtensionBundles%22:[%22kitchen-sink%22],%22features%22:{%22networking%22:true},%22steps%22:[{%22step%22:%22importWordPressFiles%22,%22wordPressFilesZip%22:{%22resource%22:%22url%22,%22url%22:%22https://kybernaut.cz/blueprints/pay-for-payment-playground.zip%22}},{%22step%22:%22login%22,%22username%22:%22admin%22,%22password%22:%22password%22},{%22step%22:%22installPlugin%22,%22pluginZipFile%22:{%22resource%22:%22wordpress.org/plugins%22,%22slug%22:%22woocommerce-pay-for-payment%22},%22options%22:{%22activate%22:true}}]}) and confirm it works CC @vyskoczilova
adamziel
added a commit
that referenced
this issue
Jul 3, 2024
## Motivation for the change, related issues Closes #1543 Fixes importing older Playground exports via the `importWordPressFiles` step. Playground exports before changes from the Boot Protocol (#1398) contained platform-level WordPress plugins and mu-plugins. The importer, then, removed them and replaced them with the latest version freshly sourced from the /wordpress directory. However, after the Boot Protocol changes, Playground no longer includes any platform-level plugins in the /wordpress directory. This means that things like SQLite database integration were being removed from the imported ZIP bundle but they were not restored. This PR ensures the `0-sqlite.php` mu-plugin file will not be imported. This way, we won't try to `require` files that the old export assumes to exist but that do not exist anymore. ## Other ideas I've initially tried removing the entire "remove & restore" files mechanism, but that resulted in the following error: ![CleanShot 2024-07-03 at 11 28 37@2x](https://github.com/WordPress/wordpress-playground/assets/205419/10f5f1d4-7ba1-40c7-9cec-cf3ec13b8cf6) It turned out every platform-level file **but** 0-sqlite.php was listed for removal. Eventually I would still like to adjust the import flow to remove this "remove & restore" dynamics and allow import bundles to ship their own SQLite database integration plugin, but this PR will have to do for now. ## Testing instructions 1. Export Playground as zip and import it again. Confirm this worked. 2. Run [this Blueprint that imports an older ZIP bundle](https://playground.wordpress.net/builder/builder.html#{%22landingPage%22:%22/%22,%22preferredVersions%22:{%22php%22:%228.0%22,%22wp%22:%22latest%22},%22phpExtensionBundles%22:[%22kitchen-sink%22],%22features%22:{%22networking%22:true},%22steps%22:[{%22step%22:%22importWordPressFiles%22,%22wordPressFilesZip%22:{%22resource%22:%22url%22,%22url%22:%22https://kybernaut.cz/blueprints/pay-for-payment-playground.zip%22}},{%22step%22:%22login%22,%22username%22:%22admin%22,%22password%22:%22password%22},{%22step%22:%22installPlugin%22,%22pluginZipFile%22:{%22resource%22:%22wordpress.org/plugins%22,%22slug%22:%22woocommerce-pay-for-payment%22},%22options%22:{%22activate%22:true}}]}) and confirm it works CC @vyskoczilova
Well, actually let's close this one as a project and treat #1486 as a bug. |
github-project-automation
bot
moved this from Project: Up soon
to Done
in Playground Board
Jul 31, 2024
brandonpayton
added a commit
that referenced
this issue
Aug 19, 2024
## Motivation for the change, related issues Refactors the `remote.html` and `worker-thread.ts` boot flows. * **Before this PR**, both files passed configuration using query arguments and relied on implicit logic surrounding the endpoint class * **After this PR**, both API Endpoint classes expose a `boot()` method that is strongly typed, accepts the configuration values, and explicitly orchestrates all the boot logic when it is called. This work may eventually enable: * A reusable, isomorphic Worker implementation that can be reused in the browser and in a local CLI setup. * Exposing `bootWordPress()` on a worker instance. * Hot-swapping the PHP runtime and WordPress instance (e.g. by killing the current worker and starting a new one). * Spawning new workers, not just PHP class instances, via PHPProcessManager. Related to #1398 ## Follow-up work * Explore spawning multiple workers for handling requests. This might also require: * Exposing the full boot protocol (`bootWordPress()`) on a worker instance instead of the simplified `boot()` method. * Load balancer across all workers handling the same site instance. * An OPFS Emscripten filesystem backend so that each worker can see the changes made by other workers. This is a potential blocker as Emscripten didn't seem to have a good way of doing that a few months ago. ## Testing Instructions (or ideally a Blueprint) * Confirm the tests are all green * Carefully review the changes, point out anything that seems off cc @brandonpayton @bgrgicak --------- Co-authored-by: Brandon Payton <brandon@happycode.net>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Playground needs a boot function with this signature:
bootWordPress :: Configuration -> Promise<PHPRequestHandler>
. It would be a single point of entry for all Playground-based applications on all platforms to get WordPress up and running. See the discussion for more context.Related resources
What will that unlock?
wp-content
locally without the rest of WP core (writing all the WordPress core files is super slow)Related issues this will solve:
Version 1 scope
A
bootWordPress
functionThere are tactical guidelines all over the discussion, for example this comment about conflicts between mount options and installing WordPress options. Refer to the discussion frequently when working on this.
/internal
directory structure to preload mu-plugins etc. from/tmp
,/internal/shared
, anddocumentRoot
to the primary PHP instance of the PHPRequestHandler/wordpress
if needed. It could be an official WordPress release, a minified build, or a "complete Playground export" withwp-admin
etc, but it can't be a "partial Playground export" with justwp-content
.db.php
fileis_blog_installed()
Platform-level enhancements
.ht.sqlite
database. On web boot install the sqlite plugin in/internal
. Ensure that previous ZIP exports and NativeFS mounts continue to work on playground.wordpress.net, ditto for new ZIP exports and NativeFS mounts.withPhpIniValues(callback)
to disable networking for the WordPress installation requestconfigureErrorLogging
platform-level mu-plugin – it createsdebug.log
file inwp-content
which means it potentially modifies a local mount.importWordPressFiles
andrunWpInstallationWizard
Blueprint steps as all these operations will be handled by the boot flow. Leave a no-op fallback in place and log a warning when it's used.Related PRs:
Remaining work:
Nice to haves
php.ini
values baked into WebAssembly PHP to something more useful for all runtimes, e.g. don'tdisable_functions
, allow network calls, set the memory limit to 256M etc. Basically compile with the same default values we're setting in runtime now.Assumptions
fetch()
requests to get the Base Snapshot, SQLite plugin etc. may be started before thebootWordPress()
call so the configuration should accept deferred resources..ht.sqlite
database – unless we'd offer a way of moving it to/internal/shared
wp-config-sample.php
towp-config.php
Out of scope for v1 (future work)
data.sql
and rewrite stale URLs on the fly. V1 would only accept input data in form of a.ht.sqlite
database.The text was updated successfully, but these errors were encountered: