vip-site-template
vip-site-template copied to clipboard
Project template for WordPress VIP hosted websites with local development environment
WordPress VIP Site Template
Site setup, development environment and deploy tooling for WordPress VIP:
- Uses Composer for adding project dependencies, including plugins and themes.
- Uses Composer autoloader for using any of the popular PHP packages anywhere in the codebase.
- Includes a local development environment based on Docker with support for PHP Xdebug and a mail catcher.
- Includes automated build and deploy pipelines to WordPress VIP Go using Travis CI or GitHub Actions.
Links & Resources
Requirements
- PHP 8.2
- Composer
- Node.js version 18
- Docker with Docker Compose
- rsync for deployments
Install Dependencies
We suggest using Homebrew on macOS or Chocolatey for Windows to install the project dependencies.
brew install git [email protected] composer node@18 mkcert
brew install --cask docker
Code Editor and Git Client
This repository includes a list of suggested extensions for the Visual Studio Code editor and Xdebug support in the .vscode directory.
A user-friendly Git client such as GitHub Desktop or Tower enables smaller commits and simplifies merge conflict resolution.
Overview
- Project plugins and themes can be added as Composer dependencies or manualy to this repository under
plugins/your-pluginandthemes/your-theme. - Composer dependencies are placed under
plugins/vendorsince it has to be in the same location relative to the project root (which is not the case forvip-configwhich is mapped to the WP root directory on the server). - Composer autoloader
plugins/vendor/autoload.phpis included invip-config/vip-config.php.
Initial Setup
Important: This section can be deleted once you've completed the initial setup from the VIP Go Site template.
The site project generated from this template is designed to be hosted under the WP VIP GitHub organization which is why it uses Travis for deployments since VIP repositories currently don't support GitHub actions. It also includes a GitHub Action based workflow which can be used for projects hosted under any GitHub organization that does support GitHub Actions.
VIP Platform Configuration
The following configuration must be requested from VIP Go to use this site repository:
- Deployments from
*-builtbranches such asmaster-builtanddevelop-built. - Staging environment tracking the
develop-builtbranch.
VIP Repository Setup
-
Ensure that VIP has configured the site to deploy from the
*-builtbranches. -
Create a fresh local Git repository from this reference repository:
composer create-project xwp/vip-site-template --stability dev -
Add your theme and plugins as Composer dependencies:
composer require your/theme your/plugin another/pluginor by manually copying them to
themesorplugins. Remember to start tracking those directories by excluding them inthemes/.gitignoreandplugins/.gitignore. -
Adjust strings and URLs in all files match your project. Search and replace the following strings:
xwp/vip-site-template,wpcomvip/devgo-vip,XWP\Vip_Site_Template,local.wpenv.net. -
If hosting this source repository under the VIP GitHub organization, add the VIP Go upstream repository as another remote to this repository locally and force-push the current
masterto that upstream repository to override themasterbranch with this. Do the same for thedevelopbranch.For hosting this source repository under any other GitHub organization, simply push it to that repository.
-
Generate a fresh SSH key pair and add the private part to the Travis CI configuration or as a
DEPLOY_SSH_KEYGitHub Actions secret, and the public part as the Deploy key to the VIP GitHub repository.ssh-keygen -f deploy-key -t rsa -b 4096 -C "[email protected]"This provides Travis CI or GitHub Actions with access to the VIP repository for deployments.
-
Remove references to either Travis CI or GitHub actions from this README depending on which deploy strategy was selected.
-
Remove these initial setup instructions from the README after the initial project setup.
Consider using a dedicated GitHub machine user for deployments in case the deploy logic requires access to multiple private GitHub repositories as there can be only one custom key associated with the Travis CI repository and GitHub doesn't allow sharing the same deploy key accross multiple repositories.
Setup 🛠
-
Clone this repository:
git clone [email protected]:wpcomvip/devgo-vip.git -
Move into the project directory:
cd devgo-vip -
Install the project dependencies:
npm install -
Start the development environment using Docker:
npm run startand
npm run stopto stop the virtual environment at any time. Runnpm run start-debugto start the environment in debug mode where all output from containers is displayed. Runnpm run stop-allto stop all active Docker containers in case you're running into port conflicts. -
Install the local WordPress multisite environment:
npm run setupwith the configuration from
local/public/wp-cli.yml. -
Visit local.wpenv.net to view the development environment. WordPress username
devgoand passworddevgo. -
Visit mail.local.wpenv.net to view all emails sent by WordPress.
The local development environment uses a self-signed SSL sertificate for HTTPS so the "Your connection is not private" error can be ignored to visit the site.
Resolving Port Conflicts
Docker engine shares the networking interface with the host computer so all the ports used by the containers need to be free and unused by any other services such as a DNS resolver on port 53, MySQL service on port 3306 or another web server running on port 80.
Use the included npm run stop-all command to stop all containers running Docker containers on the host machine. Alternativelly, you can adjust the port mappings in docker-compose.yml to expose different ports on the host machine.
Contribute
-
Setup the local environment environment as described in the "Setup" section above.
-
Create a Git branch such as
feature/nameorfix/vertical-scrollwhen you start working on a feature or a bug fix. Commit your work to that branch until it's ready for quality assurance and testing. -
Open a pull request from your feature branch to the
developbranch or the staging environment. -
Review any feedback from the automated checks. Note that your local environment is configured to automatically check for any issues before each commit so there should be very few issues if you commit early and often.
-
Merge the feature branch into
developon GitHub if all check pass. The automated Travis CI workflow (see the "Deployments" section below for details) or GitHub Actions workflow will deploy it to thedevelop-builtbranch. -
Test your feature on the VIP Go staging server. Open a new pull request from the same feature branch to
developif any fixes or changes are necessary. -
Once the feature is ready for production, open a new pull request from the same feature branch to the
masterbranch. -
Ensure that all automated checks pass and merge in the pull request. The automated Travis CI workflow or GitHub Action workflow will deploy it to the
master-builtbranch.
Plugins and Themes
Add new themes and plugins as Composer dependencies:
composer require your/theme your/plugin another/plugin
or manually copy them to themes, plugins or client-mu-plugins directories. Remember to start tracking the directories copied manually by excluding them from being ignored in themes/.gitignore and plugins/.gitignore.
Use client-mu-plugins/plugin-loader.php to force-enable certain plugins.
To update plugins and themes added as Composer dependencies, use composer install package/name or composer install --dev package/name where package/name is the name of the plugin or theme package. Be sure to commit the updated composer.json with composer.lock to the GitHub repository.
For manually installed plugins and themes replace the directory with the updated set of files and commit them to the GitHub repository.
Local Development Environment
We use Docker containers to replicate the VIP Go production environment with all VIP dependencies added as Composer packages and mapped to specific directories inside the containers as defined in docker-compose.yml.
Requests to port 80 of the container host are captured by an Nginx proxy container that routes all requests to the necessary service container based on the HTTP host name.
Importing and Exporting Data
Use VIP dashboard or VIP-CLI to download the database data from the production environment.
-
Run
npm run vip -- export sql --output=local/public/wp/vip-export.sqlto download the latest available backup to your local computer. -
Run
npm run cli -- wp db exportto export and backup the database of your local development environment which will place a file likewordpress-2020-03-04-448b132.sqlin thelocal/public/wpdirectory. -
Run
npm run cli -- wp db import vip-export.sqlto importlocal/public/wp/vip-export.sqlinto your local development environment. -
Run
npm run cli -- bash -c "pv import.sql | wp db query"to import a large database filelocal/public/wp/vip-export.sqlwhile monitoring the progress withpvwhich is bundled with the WordPress container. Thebash -cprefix allows us to run multiple commands inside the container without affecting the mainnpm run clicommand.
Scripts 🧰
We use npm as the canonical task runner for things like linting files and creating release bundles. Composer scripts (defined in composer.json) are used only for PHP related tasks and they have a wrapper npm script in package.json for consistency with the rest of the registered tasks.
-
npm run startandnpm run stopto start and stop the local development environment. Runnpm run start-debugto start the environment in debug mode where all output from containers is displayed. Runnpm run stop-allto stop all active Docker containers in case you're running into port conflicts. Runnpm run stop -- --volumesto stop the project containers and delete the database data volume. -
npm run lintto check source code against the defined coding standards. -
npm run cli -- wp helpwherewp helpis any command to run inside the WordPress docker container. For example, runnpm run cli -- wp plugin listto list all of the available plugins ornpm run cli -- composer updateto update the Composer dependencies using the PHP binary in the container instead of your host machine. Runnpm run cli -- wp user create devgo [email protected] --role=administrator --user_pass=devgoto create a new administrator user withdevgoas username and password. -
npm run vipto run VIP CLI commands on staging and production environments.
Deployments 🚀
The deployment process always starts from the same clean state which enables reproducable builds accross different environments such as local development machines and continuous integration services.
Deployments to the VIP upstream repository are handled automatically by the Travis CI build process or GitHub Actions workflow after a feature branch is merged into master for production or develop for staging.
The CI process checks the code against the VIP coding standards, builds the release bundle and pushes the changes to the master-built branch for production or develop-built for staging deployment.
┌──────────┐ ┌───────────────────────────┐ ┌────────────────┐
│ master ├──►│ Travis / GitHub Actions ├──►│ master-built │
└──────────┘ └───────────────────────────┘ └────────────────┘
Internally it runs the local/scripts/deploy.sh script which does a clean checkout of the deploy source branch to local/deploy/src, runs the build process and copies the project files with the release artifects to deploy/dist using rsync. It then commits the changes to the matching *-built branch which is then imported by the VIP Go servers.
NewRelic Deploy Markers
The repository includes support for publishing NewRelic deployment markers after each deploy, if the NEW_RELIC_API_KEY key is configured in the Travis CI or GitHub Actions environment. Note that we're not using the official NewRelic deployment marker GitHub action because it is harder to configure for multiple App GUIDs.
npm run newrelic-mark-deploy -- --search "*-production" --api_key "${{ secrets.NEW_RELIC_API_KEY }}" --commit "${{ github.sha }}" --user "${{ github.actor }}" --description "$(git log -1 --pretty=%B)"
where:
--searchis the search term to find the NewRelic app GUIDs by app name. The app names are set to$_SERVER['HTTP_HOST']-VIP_GO_APP_ENVIRONMENTinvip-config/vip-config.phpso we use a wildcard search for*-VIPENVNAMEwhereVIPENVNAMEis the environment name such asstagingorproduction.--api_keyis the API key to authenticate with New Relic.--commitis the commit hash to use for the deployment.--useris the user to associate with the deployment.--descriptionis the description to use for the deployment.