Última revisión: 26 de enero de 2022
Las empresas de hosting pueden tener alojados centenares de sitos web con WordPress, y por eso es importante que su configuración sea lo más compatible posible con el software.
Para verificar esta compatibilidad, el equipo de la Comunidad Hosting de WordPress pone a disposición una serie de pruebas PHPUnit con las que poder comprobar el funcionamiento de WordPress en cualquier entorno.
Requisitos
El objetivo de estas pruebas es el de comprobar y validar que las próximas actualizaciones de WordPress funcionan correctamente en tu entorno, por lo que lo ideal es tener un alojamiento lo más parecido al que le ofreces a tus clientes.
Esto significa que necesitaremos, al menos:
- Una base de datos (se creará y eliminarán sus contenidos). Puedes usar MySQL, MariaDB o cualquier sistema compatible.
- Una carpeta donde alojar el software (no público).
- Una carpeta temporal donde se generarán y eliminarán contenidos.
Además de esto, de forma extra, se necesitarán los siguientes elementos:
- npm (para usar Node.js)
- Composer 2.x
- Git
Instalación en Ubuntu (ejemplo)
npm en Ubuntu
apt-get -y install npm
Composer 2.x en Ubuntu
cd
curl -sS https://getcomposer.org/installer -o composer-setup.php
php composer-setup.php --install-dir=/usr/local/bin --filename=composer
Git en Ubuntu
apt-get -y install git
Instalando el phpunit-test-runner
El phpunit-test-runner es una pequeña pieza de pruebas de PHPUnit específicamente pensada para empresas de hosting. Existe toda una documentación sobre esta herramienta. Además, si lo quieres, puedes hacer aparecer los resultados de tus pruebas en la página de Host Test Results de WordPress.
La herramienta se puede ejecutar de forma manual o a través de un sistema automatizado. Para ver el funcionamiento y el objetivo de este documento haremos las pruebas de forma manual, y al final añadiremos un sistema de automatización.
Instalación del Runner
Lo primero que haremos será descargar y sincronizar la herramienta.
cd /home/wordpressbot/
git clone https://github.com/WordPress/phpunit-test-runner.git wordpress-test
cd /home/wordpressbot/wordpress-test/
El siguiente paso será el de configurar el entorno. Para ello primero haremos una copia del fichero de ejemplo y posteriormente lo configuraremos.
cp .env.default .env
vim .env
El contenido (de forma resumida) puede ser algo así:
export WPT_PREPARE_DIR=/tmp/wp-test-runner
export WPT_TEST_DIR=/tmp/wp-test-runner
export WPT_REPORT_API_KEY=
export WPT_REPORT_URL=
export WPT_DB_NAME=wordpressdatabase
export WPT_DB_USER=wordpressusername
export WPT_DB_PASSWORD=wordpresspassword
export WPT_DB_HOST=localhost
export WPT_TABLE_PREFIX=${WPT_TABLE_PREFIX-wptests_}
export WPT_PHP_EXECUTABLE=${WPT_PHP_EXECUTABLE-php}
export WPT_PHPUNIT_CMD=
export WPT_RM_TEST_DIR_CMD=
export WPT_SSH_CONNECT=
export WPT_SSH_OPTIONS=
export WPT_SSH_PRIVATE_KEY_BASE64=
export WPT_DEBUG=
Configuraremos la carpeta donde se harán las pruebas de descarga del software de WordPress y los accesos de la base de datos para poder preparar las pruebas.
Para este ejemplo, usaremos una carpeta de pruebas del sistema como puede ser /tmp/wp-test-runner
. Se puede usar una carpeta temporal o una existente para ese mismo usuario, por ejemplo. Configuraremos esta ruta completa en:
export WPT_PREPARE_DIR=/tmp/wp-test-runner
export WPT_TEST_DIR=/tmp/wp-test-runner
Lo siguiente será incluir la configuración de la base de datos que hayamos creado previamente. Por ejemplo podemos crearla con este comando:
CREATE DATABASE wordpressdatabase CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
GRANT ALL ON wordpressdatabase.* TO 'wordpressusername'@'localhost' IDENTIFIED BY 'wordpresspassword';
FLUSH PRIVILEGES;
Esta base de datos no debe utilizarse para nada más que no sea el uso de estas pruebas.
Posteriormente, configuraremos los datos en el fichero de configuración:
export WPT_DB_NAME=wordpressdatabase
export WPT_DB_USER=wordpressusername
export WPT_DB_PASSWORD=wordpresspassword
export WPT_DB_HOST=localhost
Con esto debería ser suficiente para la ejecución de las pruebas.
Ahora que ya tenemos la configuración lista, podemos hacer la primera prueba para validar que todo funciona correctamente.
Probando el test
Antes de hacer las pruebas actualizaremos todo lo necesario a la última versión y activaremos la configuración del entorno.
cd /home/wordpressbot/wordpress-test/
git pull
npm update
source .env
Entraremos en la carpeta donde tenemos el software de pruebas y lo actualizamos descargando la última versión. También actualizaremos el npm por si hay actualizaciones, y finalmente, cargaremos la configuración.
A partir de aquí, sólo hemos de ejecutar los 4 ficheros que hacen el conjunto de las pruebas.
El primero de ellos es el sistema que verifica que el entorno está listo para funcionar.
php prepare.php
El segundo de ellos es el que realiza las pruebas en sí.
php test.php
Una vez acaben las pruebas, se puede generar el reporte. Si has configurado un usuario y contraseña se enviará a WordPress.org.
php report.php
Este sistema genera dos ficheros en los que está la información de lo que se mandará como respuesta a las pruebas que se están analizando. Puedes ver el contenido de los ficheros fácilmente.
cat /tmp/wp-test-runner/env.json
cat /tmp/wp-test-runner/junit.xml
El primero de ellos incluye la información de todos los elementos necesarios para WordPress, como son PHP y sus extensiones y versiones, y la base de datos, con su versión.
El segundo de los ficheros es un rsumen de todos los tests lanzados con sus resultados y que, si se mandan a WordPress.org, se mostrarán los que han fallado en la página de resultados, para así poder trabajarlos, tanto si son elementos a solucionar por parte del hosting, como si son errores que afectan a desarrollo y el Core.
Y, para acabar, una vez tienes el sistema terminado, solo hemos de limpiar los ficheros y la base de datos para poder realizar una siguiente prueba en otro momento.
php cleanup.php
Creando tu bot para WordPress.org
Si quieres que los resultados de las pruebas aparezcan en la página de WordPress.org puedes crear un usuario para ello.
Lo primero será crear un usuario en WordPress.org. Si tu empresa se llama, por ejemplo, Somos Hosting, S.L., puedes llamar a tu usuario algo como somoshostingbot
. Ten en cuenta que la cuenta de correo asociada debe verificarse con frecuencia, ya que llegarán correos respecto al posible funcionamiento de las pruebas.
Crea una issue en la página del test pidiendo la inclusión del bot en la página de resultados como «Test Reporter request», indicando la cuenta de correo que has usado con ese usuario.
Cuando se haya creado el usuario en el sistema se te dará acceso a una contraseña de forma que puedas configurar que el sistema mande la información de forma automática. Tendrás que entrar en Users -> Your Profile y allí generar la contraseña de aplicación. Posteriormente podrás modificar la constante del entorno con algo similar a export WPT_REPORT_API_KEY='somoshostingbot:ABCD 1234 abcd 4567 EFGH efgh'
.
Automatizando el bot
Si va a enviar la información a WordPress.org quizá quieras automatizar el sistema para que mande los informes cuando haya novedades.
En este caso vamos a utilizar una serie de scripts y sistemas para esta automatización, con el objetivo de reducir la cantidad de ejecuciones, y solo lanzarlas cuando sea necesario.
Seguramente hay formas más optimizadas de realizar este sistema, pero este es el que yo he probado y funciona.
Tener una copia de WordPress
cd /home/wordpressbot/
git clone https://github.com/WordPress/wordpress-develop.git wordpress-develop
cd /home/wordpressbot/wordpress-develop/
git pull
git log -n1 --format=format:"%H" > /home/wordpressbot/wordpress-develop.log
Dentro de la carpeta de nuestro usuario haremos una copia del repositorio del WordPress que se usa para desarrollo (y haremos una prueba para validar que se descarga y actualiza correctamente).
Posteriormente (la última línea) generará un fichero en el que se incluirá el identificador del último commit realizado.
Ficheros de control
Crearemos dos ficheros de control.
echo '' > /home/wordpressbot/wordpress-tested.log
echo 0 > /home/wordpressbot/wordpress-running.log
La primera línea crea un fichero sin contenido en la que guardaremos la versión del último test que se ha lanzado.
La segunda línea guardará el estado binario (0 o 1) para saber si se está ejecutando un test o no, a modo de semáforo.
Instalación del runner
Esto no es necesario si ya lo has hecho antes.
cd /home/wordpressbot/
git clone https://github.com/WordPress/phpunit-test-runner.git wordpress-test
cd /home/wordpressbot/wordpress-test/
git pull
Descargamos el PHPUnit test runner, y validamos que se realizan bien las actualizaciones.
Configuramos el entorno. Para ello primero haremos una copia del fichero de ejemplo y posteriormente lo configuraremos.
cp .env.default .env
vim .env
El contenido (de forma resumida) puede ser algo así:
export WPT_PREPARE_DIR=/home/wordpressbot/wp-test-runner
export WPT_TEST_DIR=/home/wordpressbot/wp-test-runner
export WPT_REPORT_API_KEY=somoshostingbot:ABCD1234abcd4567EFGHefgh
export WPT_REPORT_URL=
export WPT_DB_NAME=wordpressdatabase
export WPT_DB_USER=wordpressusername
export WPT_DB_PASSWORD=wordpresspassword
export WPT_DB_HOST=localhost
export WPT_TABLE_PREFIX=${WPT_TABLE_PREFIX-wptests_}
export WPT_PHP_EXECUTABLE=${WPT_PHP_EXECUTABLE-php}
export WPT_PHPUNIT_CMD=
export WPT_RM_TEST_DIR_CMD=
export WPT_SSH_CONNECT=
export WPT_SSH_OPTIONS=
export WPT_SSH_PRIVATE_KEY_BASE64=
export WPT_DEBUG=
A diferencia que en el caso anterior, la configuración de la ruta de las pruebas también es en el mismo usuario. De esta forma, cuando se lancen los test habrá 3 carpetas:
/home/wordpressbot/wordpress-develop/
: Una copia del Git de desarrollo de WordPress./home/wordpressbot/wordpress-test/
: Una copia del Git de la herramienta de test./home/wordpressbot/wp-test-runner/
: WordPress y ficheros donde se realizarán las pruebas.
El script que ejecuta todo
cat > /home/wordpressbot/wordpressbot.sh << EOF
#!/bin/bash
echo ''
echo '[*] Launching the WordPress testing tool for hosting.'
echo ''
echo '[+] Detecting changes.'
echo ''
cd /home/wordpressbot/wordpress-develop/
git pull
git log -n1 --format=format:"%H" > /home/wordpressbot/wordpress-develop.log
estado=`cat /home/wordpressbot/wordpress-running.log`
if [ "\$estado" -eq 0 ]; then
echo ''
echo '[+] Preparing test.'
echo ''
cd /home/wordpressbot/wpsabot-test/
git pull
npm update
file1="/home/wordpressbot/wordpress-develop.log"
file2="/home/wordpressbot/wordpress-tested.log"
if cmp -s "\$file1" "\$file2"; then
echo ''
echo 'Nothing to do. The last test is the same.'
echo ''
else
echo ''
echo '[+] Starting test.'
echo ''
echo 1 > /home/wordpressbot/wordpress-running.log
cp /home/wordpressbot/wordpress-develop.log /home/wordpressbot/wordpress-tested.log
cd /home/wordpressbot/wpsabot-test/
source .env
php prepare.php
php test.php
php report.php
cat /home/wordpressbot/wp-test-runner/env.json
php cleanup.php
echo 0 > /home/wordpressbot/wordpress-running.log
fi
else
echo ''
echo '[+] Test already in progress.'
echo ''
fi
echo ''
echo '[*] The End.'
echo ''
EOF
Primero lanzaremos el fichero donde vamos a guardar el script.
cat > /home/wordpressbot/wordpressbot.sh << EOF
Descargaremos la última actualización del WordPress de desarrollo. Guardaremos, en el fichero de log, el identificador del último commit que se ha ejecutado.
cd /home/wordpressbot/wordpress-develop/
git pull
git log -n1 --format=format:"%H" > /home/wordpressbot/wordpress-develop.log
Miraremos si se está ejecutando en este momento un test o no. En caso de que se esté ejecutando actualmente una prueba, no haremos nada (y esperaremos a que acabe).
estado=`cat /home/wordpressbot/wordpress-running.log`
if [ "$estado" -eq 0 ]; then
...
else
echo ''
echo '[+] Test already in progress.'
echo ''
fi
Si no hay prueba ejecutándose, haremos una actualización de la última versión del software de test.
echo ''
echo '[+] Preparing test.'
echo ''
cd /home/wordpressbot/wpsabot-test/
git pull
npm update
Comprobaremos si hay alguna actualización en el software de desarrollo con respecto a la última prueba.
file1="/home/wordpressbot/wordpress-develop.log"
file2="/home/wordpressbot/wordpress-tested.log"
if cmp -s "$file1" "$file2"; then
...
fi
Si el último commit del software de desarrollo es el mismo sobre el que hicimos ya una prueba, no volveremos a lanzarlo.
echo ''
echo 'Nothing to do. The last test is the same.'
echo ''
Si la prueba es nueva, entonces sí que tendremos que hacer la prueba. Lo primero será establecer los ficheros de configuración. Le diremos al sistema que estamos ejecutando una prueba, y almacenaremos el identificador de la prueba que vamos a realizar (commit).
echo ''
echo '[+] Starting test.'
echo ''
echo 1 > /home/wordpressbot/wordpress-running.log
cp /home/wordpressbot/wordpress-develop.log /home/wordpressbot/wordpress-tested.log
Haremos la prueba.
cd /home/wordpressbot/wpsabot-test/
source .env
php prepare.php
php test.php
php report.php
cat /home/wordpressbot/wp-test-runner/env.json
php cleanup.php
Y, finalmente, le diremos al sistema que hemos acabado la prueba.
echo 0 > /home/wordpressbot/wordpress-running.log
Y se acabará el test.
echo ''
echo '[*] The End.'
echo ''
Ahora que tenemos el script, lo primero será lanzarlo manualmente al menos una vez para comprobar que funciona correctamente.
bash /home/wordpressbot/wordpressbot.sh
Programando las pruebas (cron)
Ahora que tenemos un script que lo hace todo, podemos programar un cron que, cada minuto, ejecute todo el sistema.
Como el script tiene un sistema de semáforo para no ejecutarse más de una vez en paralelo, se puede lanzar con mucha frecuencia.
* * * * * bash /webs/wpsabot/wpsabot.sh >/dev/null 2>&1
Pruebas completas
Si quieres hacer una prueba completa en una configuración desde cero, tienes algunas opciones:
Mejorando la configuración
No hay que olvidar que el objetivo de esta herramientas es la verificación de que nuestro entorno e infraestructura es la oóptima para que WordPress funcione, por lo que, siguiendo el ejemplo de antes, podríamos hacer varias mejoras como la instalación de la extensión de bcmath
, gd
, libsodium
, mcrypt
, mod_xml
y imagick
o utilidades como ghostscript
y imagemagick
.
¿El objetivo? Que no haya errores y tener luz verde para la configuración perfecta.
Equipo de Hosting en la Comunidad WordPress
SI eres una empresa que de alguna manera está en el día a día de ofrecer servicios relacionados con WordPress te recomiendo que sigas atento a las publicaciones del equipo Hosting de la Comunidad WordPress, además de seguir atentamente las conversaciones del canal de Slack #hosting-community (ver los horarios de reuniones del equipo), donde podrás estar en contacto con los responsables de otras empresas de hosting.
Sobre este documento
Este documento está regulado por la licencia EUPL v1.2, publicado en WP SysAdmin y creado por Javier Casares. Por favor, si utilizas este contenido en tu sitio web, tu presentación o cualquier material que distribuyas, recuerda hacer una mención a este sitio o a su autor, y teniendo que poner el material que crees bajo licencia EUPL.