Configuración de un entorno de ensayo

Es una práctica común trabajar localmente en un proyecto y enviar revisiones a un servidor de producción, pero el paso que la gente suele omitir es el servidor de prueba. Un servidor de pruebas es una mezcla entre producción y desarrollo; Tienes la oportunidad de probar tu aplicación como si estuviera en producción. Revisemos algunos de los problemas que tendrá que considerar, así como los pasos necesarios para replicar una plataforma de producción como un servicio (PAAS).

Ha ocurrido más de una vez: presento una revisión de mi aplicación en producción, solo para encontrar un problema después de que sea pública. Estos problemas pueden ser tan simples como olvidar agregar imágenes a su repositorio, o puede ser tan grande como cambiar la estructura de una base de datos localmente y olvidarse de actualizar la base de datos de producción. Los problemas les suceden a todos, especialmente cuando se han apresurado las fechas límite. En estas situaciones, es una buena idea configurar un entorno de prueba. La idea es tener un servidor que replique el entorno de producción para probar su aplicación antes de la publicación..

Los entornos de ensayo no solo detectan errores humanos, sino también problemas relacionados con el software.

Puede encontrar y solucionar estos problemas porque el área de preparación tiene el mismo software que su entorno de producción. Esto está en marcado contraste con su máquina local, donde puede tener diferentes versiones de software instaladas (por ejemplo, PHP 5.3 vs PHP 5.4) o incluso características diferentes. He empujado código que contiene llamadas a file_get_contents sólo para encontrar que el servidor de producción no era compatible con esa función.

Entonces, ¿cómo hacer para configurar un servidor de ensayo? Bueno, el primer paso es un pequeño reconocimiento..


Todo está en los detalles (en su mayoría)

Los problemas les suceden a todos, especialmente cuando se han apresurado las fechas límite.

La creación de un entorno de ensayo es específica de su entorno de producción. No hay una solución mágica que funcione en cada situación. Pero la mayoría de los casos siguen un patrón similar, y cubriré todos los puntos clave a medida que avanzamos.

Es justo asumir que la mayoría de las personas implementan sus aplicaciones con algún tipo de herramienta de control de versiones (como GIT). En la extraña posibilidad de que esté trabajando en un proyecto antiguo que aún usa FTP, sitios como ftploy.com o deployHQ.com pueden actuar como un búfer entre GIT y su servidor. Jeffrey Way armó un video informativo que detalla cómo configurar eso.

Además de GIT, debe pensar en los idiomas, el software y las características "especiales" que ofrecen sus servidores de producción. Utilizo un PAAS basado en PHP, llamado Fortrabbit, porque ofrecen compatibilidad actualizada con PHP, Apache y GIT. También brindan la posibilidad de agregar una palabra clave en su mensaje de confirmación GIT que hace que Composer instale las dependencias de su proyecto.

Este es el sistema que configuraré en el resto de este artículo. Su conjunto de características estándar, así como la característica especial de compositor, hacen que Fortrabbit sea perfecto para una gran variedad de hosts. Solo recuerde: esta no es una solución mágica, pero los pasos involucrados siguen el mismo patrón que usaría para configurar un entorno de prueba para la mayoría de los proyectos. Adapte el proceso a sus necesidades específicas.

Así que sin más preámbulos, vamos a saltar.


Creando el Servidor

Crear un entorno de prueba es específico para su entorno de producción.

Hay muchos sistemas operativos diferentes que puede ejecutar en un servidor. Fortrabbit ejecuta Debian Squeeze en sus servidores, y como estamos tratando de hacerlos coincidir, decidí ejecutarlo también.

Usaré Vagrant para configurar esto. No te preocupes si nunca has usado Vagrant; No haremos nada avanzado. Asegúrese de tener instalado VirtualBox y Vagrant (Vagrant es una CLI para VirtualBox; por lo tanto, se requiere VirtualBox).

Vagrant toma una instantánea virtual de un sistema operativo como una 'caja' base, y luego puede crear múltiples máquinas virtuales a partir de esa imagen. Así que primero, necesitamos descargar el cuadro base para Debian Squeeze. No estoy exactamente seguro de dónde proviene mi copia, así que lo subí a DropBox para que lo descargue y use. Para instalar, abre una ventana de terminal y escribe:

 vagrant box add debian https://dl.dropbox.com/u/30949096/debian.box

Esto agrega el cuadro a Vagrant con el nombre, 'debian'. Ahora podemos crear una instancia de este cuadro para nuestra área de preparación. Primero, vamos a crear una nueva carpeta:

 mkdir ~ / staging_server cd ~ / staging_server

A continuación, crea el archivo de configuración de Vagrant escribiendo:

 Vagante init Debian

Esto crea un archivo de configuración, llamado "VagrantFile", que contiene todas las configuraciones para su servidor. Parece bastante abarrotado cuando lo abres, pero la mayoría de las líneas son comentarios. Solo necesitas descomentar la línea que dice: config.vm.network: puenteado. Eliminar todos los demás comentarios te deja con un archivo que se ve así:

 Vagrant :: Config.run do | config | config.vm.box = "debian" config.vm.network: extremo con puente

Estas opciones le dicen a Vagrant que cree una nueva máquina virtual basada en nuestro cuadro base de Debian Squeeze. A continuación, establece el modo de red a 'puente'. Una VM con una red puenteada aparece como una nueva máquina física para su enrutador, por lo que recupera automáticamente su propia dirección IP. Esto le permite acceder a la máquina desde cualquier dispositivo en su red (posiblemente fuera de su red si configura su enrutador).

Ahora, podemos lanzar nuestra VM con el comando: "vagabundo" (sin las comillas).

Debería ver la salida de Vagrant creando su VM. Si su computadora tiene múltiples NIC conectadas a la red, Vagrant le pedirá que elija la NIC para puentear.

Usaremos SSH para iniciar sesión, pero tendremos que usar el incorporado de Vagrant "vagabundo ssh"comando para iniciar sesión. De acuerdo con las mejores prácticas de Vagrant, todas las casillas deben tener un usuario llamado" vagrant "con la contraseña, tanto para root como vagrant," vagrant ". El usuario vagrant se agrega como un sudo usuario que no necesita ingresar una contraseña, por lo que puede usar directamente sudo comandos.

Sigamos adelante y configuremos el software del servidor..


El software

La configuración de Fortrabbit incluye:

  • Apache 2.2
  • PHP 5.4
  • Compositor

Además, utilizan el repositorio dotdeb para instalar la mayor parte de él. Para aquellos que no están familiarizados, dotdeb es un proyecto de Guillaume Plessis que instala las versiones más actualizadas de los paquetes de servidores web populares..

Estamos listos para comenzar. Asegúrese de que la ventana de su terminal esté abierta e iniciada sesión en el servidor a través de SSH. Primero, agregue el repositorio dotdeb a APT (el administrador de paquetes) agregando un nuevo archivo a fuentes.d directorio:

 sudo vim /etc/apt/sources.list.d/dotdeb.list

Esto abre un nuevo archivo llamado dotdeb.list en vim (un editor de texto). El nombre no es importante porque todos los archivos en este directorio se leen en APT. Necesitamos agregar cuatro líneas a este archivo. Si nunca ha usado VIM, simplemente escriba "yo"para ingresar al modo de inserción y copiar / pegar las siguientes cuatro líneas:

 deb http://packages.dotdeb.org exprime all deb-src http://packages.dotdeb.org squeeze all deb http://packages.dotdeb.org squeeze-php54 all deb-src http: //packages.dotdeb .org exprimir-php54 todo

Para guardar, pulse la tecla Esc clave y tipo : wq. Ese es el comando para escribir y salir, que básicamente significa guardar y salir.

Presionando enter guarda el archivo y te regresa a la línea de comando.

Ahora hemos agregado los repositorios, pero aún necesitamos agregar la firma antes de poder usarlos. Escribe lo siguiente para agregar la clave GNU:

 curl http://www.dotdeb.org/dotdeb.gpg | Sudo apt-key add -

Esto descarga la clave dotdeb y la agrega como una fuente firmada. Ahora actualice APT para obtener el nuevo paquete escribiendo:

 sudo apt-get update

Esto puede demorar un minuto, pero tendrá todos los paquetes dotdeb listados en APT cuando finalice. Debido a cómo se configura dotdeb y cómo se cargan las dependencias de APT, podemos instalar Apache y PHP al mismo tiempo escribiendo:

 sudo apt-get install php5

Con esta línea única, APT instala y configura Apache2 y PHP5. Si usa el complemento memcache de Fortrabbit, entonces puede instalarlo con:

sudo apt-get install memcached

Pero no voy a entrar en memcache en nuestro ejemplo en este artículo.

Ahora necesitamos instalar las extensiones que usa Fortrabbit. Ejecuta el siguiente comando:

 sudo apt-get install php5-xdebug php5-tidy php5-sqlite php5-redis php5-pgsql \ php5-mysqlnd php5-memcache php5-memcached php5-mcrypt php5-pp / php5-pppppppp las personas más grandes de la naturaleza -apc php5-intl

Lo último que necesitamos instalar es Composer. Lo voy a instalar globalmente porque lo usaremos en algunas ubicaciones diferentes. Los comandos para instalar globalmente Composer son:

 curl -s https://getcomposer.org/installer | php sudo mv composer.phar / usr / local / bin / composer

El primer comando descarga y ejecuta el instalador; el segundo comando mueve Composer a la carpeta bin para que podamos usarlo sin declarar la ruta. Vayamos a la configuración..


Configurando Apache

Es probable que esté trabajando en más de un proyecto. Si este es el caso, tener un servidor de prueba para cada proyecto crea una gran cantidad de gastos generales. Para permitir múltiples sitios en un solo servidor, debemos agregar hosts virtuales basados ​​en nombres a Apache, y deberíamos separar los directorios y repositorios de cada proyecto..

Empecemos con un host virtual..

Voy a continuar usando vim, pero sepa que si desea trabajar en sus propios programas, puede copiarlo y pegarlo o guardarlo en el staging_server carpeta que creaste en tu computadora.

Esa carpeta está compartida con su máquina virtual, y puede acceder a los archivos en el vagabundo directorio raíz. A continuación, puede utilizar: sudo cp / vagrant / file newfile o sudo mv / vagrant / filee newfile para copiar o mover los archivos, respectivamente.

Para crear un nuevo host virtual, necesitamos crear un archivo en el / etc / apache2 / sites-available / directorio. Para hacer esto con VIM, escriba lo siguiente:

 sudo vim /etc/apache2/sites-available/demo.site

Dentro, ingrese lo siguiente (recuerde presionar "yo"para el modo de inserción):

  ServerAdmin [email protected] ServerName demo.dev DocumentRoot / var / www / demo  Índices de opciones FollowSymLinks MultiViews AllowOverride TODA la orden permitir, negar permitir de todas  ErrorLog $ APACHE_LOG_DIR /demo.log LogLevel debug 

La primera línea declara un host virtual que escucha las solicitudes en cualquier IP en el puerto 80. A continuación, configuramos el correo electrónico de administración del servidor y el nombre del servidor. El correo electrónico es para fines de informe de errores, y la opción de nombre del servidor le dice a Apache cuándo leer este host virtual. Los hosts virtuales regulares trabajan fuera de IPs. Por ejemplo, cada vhost escucha en una IP diferente; Así es como Apache los diferencia..

Como probablemente solo tenga una IP, podemos usar hosts virtuales basados ​​en nombres, lo que le permite proporcionar un nombre diferente en la misma IP.

En nuestro ejemplo, cualquier solicitud dirigida a demo.dev es recogida por este host virtual.

La siguiente línea establece la carpeta raíz del documento. Aquí es donde Apache recupera archivos para este vhost. Las declaraciones dentro del Directorio directiva establece permisos para este vhost. No voy a entrar en demasiados detalles, pero primero establecemos las opciones de Apache de los directorios, luego configuramos lo que se puede anular en un archivo .htaccess, y finalmente establecemos quién puede acceder al sitio (todos pueden hacerlo en nuestro caso).

Las dos últimas líneas le dicen a Apache cómo nombrar el archivo de registro y qué escribir en el registro. Nuestro archivo de registro se llama demo.log en la carpeta de registro de Apache ubicada en / var / log / apache2 / en esta máquina virtual.

Para habilitar este host virtual, escriba lo siguiente:

 sudo a2ensite demo.site

Esto crea un enlace simbólico entre el archivo en la carpeta de sitios disponibles a un archivo en la carpeta de sitios habilitados. Después de ejecutar este comando, se le pedirá que reinicie Apache. Recibirá un error si intenta reiniciar Apache porque no hemos creado el directorio del sitio. Esto se arregla fácilmente comprando creando el manifestación carpeta a la que hicimos referencia en el archivo vhost:

 sudo mkdir / var / www / demo

No queremos que el usuario root sea el propietario de la carpeta, así que cámbielo al usuario errante con la Chown mando:

 sudo chown -R vagrant: vagrant / var / www / demo

Ahora reinicie Apache:

 sudo servicio apache2 reinicio

Nuestro nuevo sitio ahora debería ser completamente funcional. Nuestro siguiente paso es configurar GIT..


Siguiendo con algo de magia GIT

Asegúrese de estar en el directorio de inicio escribiendo cd ~. Crea una nueva carpeta para el repositorio: mkdir demo.git, ingrese a la carpeta e inicialice un nuevo repositorio GIT:

 cd demo.git git init --bare

Un repositorio simple es esencialmente un repositorio estándar sin un directorio de trabajo. Si desea obtener más información sobre GIT, consulte la serie de videos de Andrew Burgess.

Ahora necesitamos la capacidad de insertar código en la carpeta del sitio, y hay muchas maneras de lograrlo. Pero me gusta hacer que las cosas se vean lo más cerca posible del servicio que estoy emulando. Aquí hay una foto del proceso de git de fortrabbit tomada de su sitio:

Puedes ver que el proceso de empuje pasa por tres pasos. Muestra un mensaje de actualización cuando se conecta y despliega el sitio en el directorio. El paso final instala todo si el mensaje de confirmación contiene las palabras clave "[trigger: composer]". Luego, después de que estos tres pasos terminen, se muestra ">> All Done <

Antes de crear los ganchos, quiero hablar de colores..

Realizo la mayor parte de mi trabajo en el terminal, y la mayoría de las veces, las aplicaciones de terminal dejan todo del mismo color. Agregar diferentes colores a su aplicación no solo aumenta la legibilidad, sino que también aumenta la posibilidad de obtener la misma. Así que también se difunden mejor las "prácticas de color" en las aplicaciones de terminal, me tomaré un momento para discutir cómo funcionan.


Colores terminales

Los terminales vienen con dieciséis colores ANSI que se pueden configurar y usar en todo el terminal. Aquí hay una imagen de la pantalla de configuración de iTerm2, que muestra las dieciséis ranuras de color:

Puede acceder a ellos en el terminal escribiendo el carácter de escape, seguido del corchete abierto y luego el código del color. Puede ver en esta imagen que los colores se dividen en dos líneas: una etiquetada como "Normal" y la otra "Brillante". Los códigos para los colores normales son los números 30-37 seguidos de la letra "m", y los colores brillantes son de 90-97 nuevamente, seguidos de una m. Puedes probar esto en tu ventana de terminal usando eco. Para crear el carácter de escape, escriba ctrl-v seguido por ctrl- [. Obtendrás un personaje que parece ^ [, pero no funcionará si simplemente escribe "^ [" (shift-6 y luego abre el corchete). Así que en el tipo de ventana de terminal:

 echo "^ [[31m Hello World ^ [[0m"

De nuevo, la primera ^ [ No fue escrito sino que fue creado con ctrl-v y entonces ctrl- [. los 0m código de carácter es el código de reinicio; elimina todo el formato. Esto se debe a que los códigos de color no terminan después de la siguiente palabra, continúan hasta que reciben un código diferente.

Si se hace correctamente, el código anterior muestra las palabras "hola mundo" en rojo (a menos que tenga esa ranura configurada en un color diferente).

A lo largo del resto del tutorial, agregaré colores a los comandos. Siéntase libre de seguirlos u omitirlos; no son estrictamente requeridos Pero si desea usar colores, siéntase libre de usar mi clase de ayuda de color. Ahora, volvamos a escribir los ganchos..


Creando los ganchos

Si vuelve a mirar la imagen de Fortrabbit, verá que muestra el mensaje "Paso 1: Actualización del repositorio" antes de actualizar el repositorio. Para hacer esto correctamente, tenemos que poner este mensaje en el enlace de recepción previa, que se ejecuta antes de que se actualice el repositorio. En el tipo de ventana de terminal:

 vim ~ / demo.git / hooks / pre-receive

Esto abre el gancho para la edición. Agregue el siguiente código:

 #! / usr / bin / php 

La primera línea le dice al sistema operativo que este es un archivo PHP y que lo ejecute como tal. Luego asignamos un color y la secuencia de reinicio a las variables. El último paso ecos la linea.

El siguiente gancho es un poco más complicado porque maneja el resto de las acciones. Lo llevaremos paso a paso, así que guarde el primer enlace (: wq) y abra el siguiente enlace:

 vim ~ / demo.git / hooks / post-receive

El enganche posterior a la recepción se ejecuta después de actualizar el repositorio. Primero debemos actualizar el sitio y luego verificar el desencadenador de Composer. Aquí hay un esqueleto de nuestro programa, dejando de lado cualquier nueva lógica:

 #! / usr / bin / php  ". $ cyan." OK ". $ blank." \ n "; echo $ yellow." Step2: Deploying ". $ blank." \ n "; / * TODO: Implementar en el sitio * / echo" -> ". $ cyan. "OK". $ blank. "\ n"; / * TODO: Compruebe si la confirmación tiene un desencadenante * / echo $ yellow. ">> Todo listo <<" . $blank . "\n"; ?>

Esto es sólo un esquema para trabajar. Lo primero que debemos poner es la función para colocar la nueva versión del repositorio en el directorio del sitio. Tradicionalmente, simplemente escribiría lo siguiente si estuviera en la carpeta:

 git fetch origen git reset - hard origin / master

Podrías usar algo como git pull, pero hacerlo puede causar errores. Si un archivo se modificó directamente, o si perdió una confirmación, entonces git pull Tampoco te permitirá tirar o eliminar tus archivos sin seguimiento.

Estos son dos comandos simples, pero obtendrás un error si intentas ejecutarlos desde el gancho.

GIT establece algunas variables de entorno antes de ejecutar los ganchos. Puede sortear esto con una de dos soluciones, y le mostraré ambas.

La primera es anular las variables de entorno, pasando la información directamente. El segundo borra completamente las variables. Usaré la primera opción en este ejemplo y la segunda opción cuando trabajemos en el activador del compositor. Reemplace el comentario que agregué anteriormente donde dice "TODO Deploy to site" con lo siguiente:

 $ git = "git --git-dir = / var / www / demo / .git / --work-tree = / var / www / demo /"; exec ("$ git fetch -q origin"); exec ("$ git reset - hard origin / master");

Esto anula las variables de entorno y llama a las funciones antes mencionadas. El agregado -q El parámetro le dice a GIT que esté "tranquilo", lo que impide que GIT se haga eco de cualquier mensaje.

Ahora tenemos que comprobar el disparador del compositor. Vamos a romper esto en dos pasos. Primero verificamos el disparador, y luego ejecutamos Composer. Reemplace el segundo comentario TODO con lo siguiente:

 $ msg = exec ("$ git log -n 1 --format = format:% s% b"); if (strpos ($ msg, "[trigger: composer]")! == false) echo $ yellow. "Paso 3: Composer Hook". $ en blanco. "\norte"; echo "-> Desencadenando la instalación - obtener un". $ cyan. "café" . $ en blanco. "\norte"; // ejecutar compositor echo "->". $ cyan. "OKAY" . $ en blanco. "\norte"; 

La primera línea recupera el mensaje de confirmación utilizando registro de git Manda y pasa en un formato especial para excluir cualquier información adicional. A continuación, verificamos si la cadena tiene la palabra desencadenante especial, y repetimos el tercer paso y el mensaje OK. Estamos comprobando la palabra clave Compositor, pero puede implementar varias palabras clave para otras funciones como: migrar en Laravel o ejecutar pruebas unitarias. Agrega cualquier cosa para mejorar tu flujo de trabajo.

El último paso es ejecutar Composer. El compositor tiene dos comandos: instalación del compositor y actualización del compositor.

El comando de instalación no lee el compositor.json archivo si encuentra un composer.lock, y porque algunas personas podrían agregar composer.lock a su archivo .gitignore, es más seguro ejecutar actualización del compositor (siempre mira al compositor.json expediente.

El segundo problema es que, en ocasiones, Composer usa GIT para descargar paquetes, y estos intentos fallan debido a las variables de entorno. Así que aquí es un buen lugar para eliminar la variable de entorno "GIT_DIR". Reemplace el comentario para ejecutar Composer con lo siguiente:

 chdir ("/ var / www / demo"); putenv ("GIT_DIR"); exec ("actualización del compositor");

Este código es sencillo. Movemos el proceso de PHP a la carpeta del sitio, y luego eliminamos el GIT_DIR Variable de entorno para que GIT funcione normalmente. La última línea ejecuta compositor..


Atar los extremos sueltos

Ahora tenemos ambos ganchos de configuración, pero no estamos completamente listos para comenzar a usar nuestro servidor. Primero, necesitamos hacer estos ganchos ejecutables:

 chmod a + x ~ / demo.git / hooks / pre-recibir chmod a + x ~ / demo.git / hooks / post-receive

A continuación, crea un repositorio GIT en la carpeta del sitio. Obtendríamos un error si intentamos ejecutar nuestros ganchos porque la carpeta del sitio no es un repositorio de GIT. Para arreglar este tipo:

 cd / var / www / demo git init git remoto agregar origen /home/vagrant/demo.git

Las dos primeras líneas crean el repositorio, y luego agregamos el repositorio simple como el origen de este repositorio..

También debe agregar su clave pública a los hosts autorizados de este servidor para que pueda acceder al servidor a través de GIT sin una contraseña. Puede copiar su clave pública escribiendo en su computadora (no en la VM):

 cat ~ / .ssh / id_rsa.pub | copia impresa

Luego, simplemente péguelo en el servidor en el archivo ~ / .ssh / authorized_keys:

 vim ~ / .ssh / authorized_keys

Solo agrégalo al archivo, pero deja lo que ya está dentro.

A continuación, debemos agregar la IP de este servidor a nuestro archivo de hosts. Para encontrar la IP, escriba:

 ip -4 -o addr mostrar etiqueta eth *

Esto le muestra la IP de todos los dispositivos de red en esta máquina virtual. Agregue el que se conecta a su red local. Si no puede determinar qué dirección IP usar, copie y pegue una en su navegador. Si se conecta, entonces tienes la dirección IP correcta.

Tome la IP y agréguela al archivo de hosts de su computadora (no al archivo de hosts de la VM). El archivo de hosts en una Mac se encuentra en etc / hosts:

 sudo vim / etc / hosts

A continuación, agregue la siguiente línea:

 #Formato: dirección_IP nombre del sitio 192.168.0.110 demo.dev

Si esto funciona, podrás navegar a http://demo.dev en tu navegador Mientras esté en su Mac, cree una carpeta e inicie un repositorio GIT:

 mkdir ~ / demo cd ~ / demo git init echo "Hello World"> index.php git add. git commit -am "agregado index.php" git remoto agregar staging [email protected]: demo.git git push staging master

Si todo salió bien, debería ver una respuesta de nuestros ganchos GIT. Navegando a http://demo.dev debería aparecer el mensaje "Hello World" en su navegador.


Conclusión

Así es como puede crear un entorno de prueba que imita la funcionalidad de un PAAS típico. Si tuvo problemas para seguir adelante o si necesita configurar varios entornos de prueba, creé un script que automatiza completamente el proceso. Para obtener más información, puede visitar stagr.gmanricks.com.

Espero que hayas disfrutado el artículo. Siéntase libre de hacer cualquier pregunta que pueda tener en los comentarios. Gracias por leer.