A blog about data, information and Tech by Mario Alberich

        

jun. 18
2013

Phing (VI) - Llamadas entre tareas

Encapsular grupos de tareas


Es posible que a medida que se utiliza Phing, veamos que los targets generados sean reutilizables. Lógico, al fin y al cabo estamos utilizando Phing para automatizar tareas repetitivas. Pero la estructura del archivo build.xml empieza a ser excesiva, o bien los targets son muy extensos.  A pesar de la utilidad, el XML no es el formato al que está acostumbrado un programador:  el mantenimiento se dificulta y los problemas ofuscan la utilidad inicial.</p>

Para eso Phing incluye algunas tareas que permiten separar los archivos de proyectos, para luego llamarlos con diversos métodos. Aquí comento tres métodos, que tienen diferencias de matiz, pero puedes utilizar sin grandes diferencias.

phing


Esta llamada permite hacer operaciones como la siguiente:


Carga el archivo limpiar_codigo.xml, ejecuta el target quitaespacios.  Esta operación, sin más, permite tener un conjunto de targets para limpiar el código (convertir tabuladores en espacios, eliminar saltos de carro \r, cambiar el juego de caracteres), otra para auditar el código, y así hasta donde se considere oportuno.

En algunos de estos casos se deseará compartir el contexto de ejecución, para así utilizar las propiedades inicializadas en el target padre.  Para estos casos, se puede añadir el argumento inheritAll y asignarle el valor "true":


Pero, como en otras tareas de Phing, también es posible enviar valores de propiedades nuevas, así:





En este caso suponemos que el target quitaespacios tiene la opción de convertir los tabuladores en 4 espacios.

 

phingcall


Casi idéntico a phing, pero... para el proyecto actual. Es decir, phingcall se encarga de llamar a subrutinas, utilizadas en otros targets del mismo proyecto (o bien, utilizando la anterior tarea phing, llamable desde otros proyectos).

En este caso, el único parámetro es target. Y como en el caso de la tarea phing puede enviar propiedades a la tarea llamada:




La anterior llamada podría estar situada dentro del archivo limpiar_codigo.xml, y ser llamada, por ejemplo, desde el target quitaespacios.

 

import


Este caso es un intermedio: permite guardar los targets en otro archivo, pero no se realiza una llamada externa, porque en realidad los targets se están importando y se pueden ejecutar como si estuvieran en el mismo archivo.


  

Puede suceder que los dos archivos XML incluyan un target con el mismo nombre.  En ese caso, el target del archivo principal (el que realiza el import) tiene precedencia. Sin embargo, se puede llamar al target del archivo importado utilizando el nombre proyecto.target.

Por ejemplo, si limpiar_codigo.xml tiene como nombre de proyecto "limpiar_codigo", incluye la tarea tabtospaces, y el proyecto principal también tiene ese mismo nombre de tarea, puedes llamar a la tarea hija con una phingcall cuyo atributo target sea limpiar_codigo.tabtospaces.

Otro detalle clave en las importaciones es que un target importado utilizará las variables de entorno de su nuevo contexto de ejecución.  Por ejemplo, su ruta será la del proyecto padre, y las rutas relativas (por ejemplo para cargar archivos de propiedades) también tendrán ese comportamiento.

Read more »

jun. 12
2013

Phing (V) - Operaciones con el sistema de archivos

Creación y acceso a directorios


Algunas de las operaciones que puedes realizar con el sistema de archivos son:</p>

Operaciones con directorios


Para crear un directorio:</p>


</pre>
Lo anterior genera el archivo /tmp/sopadebits. Si se utiliza el segundo formato, se establecen los permisos de acceso (chmod) de ese directorio. El valor es octal y utiliza la misma estructura que el comando de consola chmod.</p>

Para absolutizar un path relativo:


Nos devuelve la ruta completa hasta el archivo test.txt.

Si lo que queremos es cambiar los permisos o el propietario/grupo de un archivo o directorio, tenemos las tareas chmod y chown:


y:


Aunque pueda aparentar lo contrario, el atributo file permite tanto archivos como directorios.



En el primer caso establecemos los permisos de lectura y ejecución para todos los usuarios para el archivo test.txt, mientras que en el segundo lo hacemos sobre un directorio y solicitamos que la ejecución del comando muestre más detalles de la operación (verbose).

Manipulación de archivos


Para el caso, se puede resumir con los comandos Copy, Delete, Move, LoadFile, FileHash y Touch... Uno por uno funcionan de la siguiente manera:


Copia el archivo al directorio /tmp/sopadebits/, y lo sobreescribe si existe.



Lo primero borra el archivo que habíamos copiado con la tarea . Lo segundo borraría el directorio /tmp/sopadebits al completo.  Como en casos anteriores, hemos añadido la opción verbose para que nos facilite detalles de la operación.  Sin embargo, en este caso solicitamos que, en caso de error, la ejecución de la tarea finalice. Esto puede ser útil para evitar estropicios o tareas inútiles que requieran de este borrado.


En este caso Phing mueve el archivo test.txt al directorio temporal, sobreescribiendo la copia antigua si ésta existe.


Calcula el hash SHA1 de test.txt. Si no indicara hashtype, o indicara el valor 0, se calcularía el MD5. El valor de este hash se puede guardar en una variable, si se especifica el atributo propertyName:


En este caso, podré utilizar la varialbe ${myhash} para indicar el resultado de esta operación.  Pero lo cierto es que no es necesario indicar un nombre de variable. Por defecto, puedes utilizar la variable ${filehashvalue}, que es la variable donde se guarda este valor por defecto.

 

Y finalmente, operación touch, que permite modificar algunos atributos del archivo o directorio sin modificar le contenido:



Lo primero establece la fecha de modificación en base a los milisegundos transcurridos desde el Unix Epoch (1/1/1970 00:00:00). En el segundo caso establece la fecha de una forma más amigable.

Filesize:


Mide el tamaño de un archivo. Podemos indicar una variable que guarde ese dato indicando el atributo propertyname, pero por defecto se guarda en la variable ${filesize}.

Y hasta aquí las operaciones más habituales con ficheros que puedes hacer utilizando Phing. No son todas, ni mucho menos. Puedes continuar la lectura en la página de documentación de Phing.

 

Read more »

jun. 10
2013

Autenticación SSH por clave pública

Las operaciones de carga de contenidos y de gestión de servidores por SSH es imprescindible. La operativa implica el conocimiento de las claves de acceso, y cuando se llega a un determinado número de servidores distintos, cada uno con sus propias claves, la memoria empieza a fallar, se empiezan a apuntar las contraseñas en sitios no siempre seguros (al menos no tanto como nuestra memoria), y ni siquiera así las recordamos todas.

Así que, quizá, podríamos disponer de una sola clave para todas estas autenticaciones. O quizá ninguna clave, sólo un elemento que nos identifique en el servidor.

Una clave para todos los accesos


Afortunadamente SSH permite generar claves públicas. Una clave pública no es más que un pequeño archivo con un código derivado de nuestra clave SSH privada, y que permite que un servidor, mediante operaciones criptográficas, pueda confirmar que nosotros somos los creadores de ese archivo.

Pero entonces, contraseña, ¿Sí o no?


Pues no es necesario, pero sí muy recomendable.  Piensa que si alguien tiene acceso a tu equipo de trabajo (o al pendrive, o cualquier soporte donde estén esas claves), la contraseña es la única barrera entre éste y el acceso a ese servidor.

Lo cierto es que con la clave pública puedes utilizar unas pocas contraseñas (o una sola, eso depende de ti) para todas las claves públicas de acceso, y por ello ya no deberás que recordarlas. Pero entre eso y prescindir completamente de contraseñas, mejor usa unas pocas con criterio.

Bueno y ahora, basta de cháchara, vamos al grano.

Crear clave pública

~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mario/.ssh/id_dsa): mynewpubkey
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in mynewpubkey.
Your public key has been saved in mynewpubkey.pub.
The key fingerprint is: 60:d6:96:ba:40:11:72:78:f0:c4:xx:xx:xx:xx:xx:xx user@host
The key's randomart image is:
+--[ RSA 1024]----+
|  o+=o .         |
|  .=o.+. .       |
|   .oo+++        |
|   .+oE+         |
|    .=. S        |
|    ....         |
|     ..          |
|                 |
|                 |
+-----------------+

Así que ahora podemos encontrar los archivos mypubkey y mypubkey.pub. El primer archivo es la clave privada. Debemos copiarlo al directorio .ssh de nuestro usuario local, y cargar la clave pública al servidor al cual queremos acceder. Puedes tener varios archivos de claves en ese mismo directorio.

Autenticación indicando la clave


Es necesario cargar ese archivo de clave pública al servidor SSH al que queremos autenticarnos con clave pública. Para ello hay que acceder al directorio del usuario con el que nos identificaremos (supongamos que sea "myuser") y crear/modificar el archivo de claves aceptadas:

~$ cd /home/myuser/.ssh
# si ya existe, no es necesario crear el archivo 
~$ touch authorized_keys
~$ cat mypubkey.pub >>  authorized_keys

Lo anterior supone  que hemos cargado vía SCP el archivo mypubkey.pub al servidor que queremos conectar, y que lo hemos dejado en /home/myuser/.ssh/mypubkey.pub.

Después de cargar la clave, podemos conectarnos vía SSH. La contraseña que se nos pedirá es la de la clave SSH y no la del servidor, si es que hemos indicado contraseña de la clave.

Finalmente estamos dentro, y ya tenemos una contraseña menos que recordar ;-).

Read more »

jun. 8
2013

Versión visual del Teorema Central del Límite

Desde luego es una pequeña curiosidad visual. A veces intentar relacionar lo aplastante de los teoremas con la simple realidad es una tarea compleja, y muy preciada en estadística.

Por eso se agradece encontrar ejemplos tan sencillos y evidentes como éste, demostrando que la caída de bolas acaba formando una campana de Gauss

Read more »

jun. 7
2013

Ping (IV) - Condiciones y operadores de comparación

Los if's y else's no son muy diferentes en Phing que en el resto de lenguajes. Sí cambia el formato en el que se presentan, debido a la propia estructura del XML. Y en algunos casos es necesario atender a los detalles.

El if más simple


Aquí lo tienes. Poco más simple puede ser:


a = b


También puedes añadir un else...


a = b


a != b


O un elseif...

 


a = b



a = c


a != b


Entonces, ¿ya está? No, ahora se complica un pelín más, pero sólo un pelín.

Operadores booleanos en la comparación


A diferencia de otros muchas tareas (o tags, si lo prefieres) de Phing, if no lleva directamente argumentos, sino que todo se realiza mediante los tags hijos (nested elements en la documentación de Phing). Entonces, una comparación que incluya un operador OR se mostraría así:





...


Pues no parece tan difícil, ¿verdad? Pues a ver con un not...







...


Y entonces, un and dentro del or, ¿cómo queda?










...


Todo esto se puede ir complicando hasta ciertos límites.  Lo que sucede es que los mismos tags actúan como "paréntesis", definen el contexto de la comparación, por lo que está claro qué orden de comparaciones se ejecutarán en cada estado de la operación.

Al final, no resulta tan difícil, ¿verdad?

Operadores que podemos usar dentro de un if


Aquí tienes una lista de los nested operators que puedes utilizar dentro de un bloque if. échale un vistazo, seguro que se te ocurren cosas ;-).

Read more »

jun. 5
2013

Siege: extraer URLs reales de los logs (II)

Con el proceso anterior, ya teníamos las URIs, y nos faltaba añadir el host y el protocolo para tener una URL completa.  Esto se puede conseguir echando mano del comando sed:

~$ cat {archivo-de-log} | awk '{print $7}' | sort | uniq | sed -e 's/^/http:\/\/sopadebits/g'

Qué hace esto exactamente? Busca el inicio de la cadena (el carácter "^" es una expresión regular que indica eso) y le añade el dominio (en mi caso, el de este blog sin el ".com"). Es necesario escapar las barras (\/), como ya es habitual en las expresiones regulares.

Con lo anterior, nos sale una lista de URLs completas. Cambiando lo anterior, a punto para ser usadas con siege. Sólo falta guardarlas en un archivo de texto. Así que el proceso completo sería:

~$ cat {archivo-de-log} | awk '{print $7}' | sort | uniq | sed -e 's/^/http:\/\/sopadebits/g' > urls.txt

Ejecutar Siege con una lista de URLs


Con lo anterior, sólo queda indicar a Siege que queremos utilizar ese archivo "urls.txt" para que realice las pruebas. Esto es tan sencillo como:

~$ siege -c {concurrencia} -f ./urls.txt

¡Ahí tienes la ejecución! Dependiendo del número de URLs y usuarios concurrentes, el test tardará más o menos en ejecutarse y mostrará los resultados al final.

Filtrar/eliminar algunas URLs del listado


Si por ejemplo queremos limpiar las URLs que cargan CSS, o archivos JS o imágenes PNG, podemos utilizar la herramienta grep:

~$ grep -vE "\.(js|css|gif|png|kml)"

Integrándola en el conjunto de pipes anteriores, el resultado quedaría así:

~$ cat {archivo-de-log} | awk '{print $7}' | grep -vE "\.(js|css|gif|png)" | sort | uniq | sed -e 's/^/http:\/\/sopadebits/g' &gt; urls.txt

La opción "-v" de grep permite seleccionar las líneas que NO contengan la expresión indicada, y la opción "E" permite indicar una expresión regular. Con eso ya tenemos la lista de URLs limpias y podemos volver a ejecutar la prueba.

Read more »

jun. 3
2013

Siege: extraer URLs reales de los logs (I)

Siege es una herramienta de pruebas de carga, que permite simular el comportamiento de una web bajo condiciones extremas (el asedio del servidor).

Un número de peticiones altas, fuerte nivel de concurrencia, etc., son circunstancias a las que se enfrentará una web con una audiencia elevada, o a puntas de consultas, como por ejemplo debido a campañas publicitarias, eventos específicos, salida a la venta de nuevos productos, y otros.

Así que nos encontramos en esa situación, y decidimos que la herramienta es siege.  ¿qué más hay que hacer?

En ubuntu/debian, la instalación es sencilla, desde una terminal:

~$ sudo apt-get install siege

Con eso ya tendremos instalado siege, y podremos ejecutarlo.  Podemos ejecutar una prueba, contra la web que queremos testear:

~$ siege http://{host}/

o también:

~$ siege -c 30 http://{host}/

para simular 30 usuarios concurrentes.

Donde {host} es el nombre del dominio que se quiere probar. Obvia decir que esta prueba debe realizarse en un entorno controlado y bajo nuestra propia responsabilidad, y que en ningún caso se debe ejecutar sobre servidores y webs ajenas. Las consecuencias de ese uso impropio quedan bajo la responsabilidad del usuario.

Paso 1: Obtener las direcciones


Bien, si con lo anterior ya se puede realizar la prueba, ¿Para qué necesitamos más? Pues porque las simulaciones pueden requerir una variedad mayor de URLs, que cargan diversos componentes, tienen estrategias diversas de caché, o por lo que sea.

Y ¿de dónde sacamos esas URLs? Una de las opciones es un archivo de logs de Apache.  Si dispones de un log de apache con datos de navegación real, o se puede generar uno visitando la web.  Por ejemplo, se puede programar un crawler sencillo, tal como Httrack o similar. Lo que interesa no es la descarga de contenidos, sino que se navegue por la web para generar logs de Apache.

Paso 2: Limpiar y preparar las URLs


El log de apache tiene un formato similar al siguiente:

189.147.178.214 - - [19/May/2013:06:41:18 +0200] "GET /wp-content/themes/retina/style.css HTTP/1.1" 200 5213 "http://www.sopadebits.com/patrones-organizativos-gestion-informacion" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31"

Podemos identificar:

  • Dirección IP
  • Fecha y hora de acceso
  • Método de acceso (GET), URI (sin dominio) y versión del protocolo
  • resultado de la petición (200 = Ok) y tamaño del contenido retornado (5213 bytes)
  • URL desde donde se ha llegado (el referer)
  • Firma del navegador, y sistema operativo.


Lo que nos interesa es la URI, a la que posteriormente deberemos añadir el dominio completo.

¿Cómo extraeremos esa URL? Con awk. Esto permite extraer los contenidos separándolos por espacios (entre infinidad de otras posibilidades, vale la pena echarle un ojo).  En nuestro caso, la instrucción en consola puede ser:

~$ cat {archivo-de-log} | awk '{print $7}'

Bien, eso genera un listado considerable de URLs, muchas de ellas repetidas. Las ordenaremos y obtendremos la lista única de URIs:

~$ cat {archivo-de-log} | awk '{print $7}' | sort | uniq

Voilà! Aquí tienes una lista de URIs únicas, casi ya lo tenemos. Sólo queda añadir el protocolo y el nombre del host. Se puede conseguir echando mano del comando sed:

~$ cat {archivo-de-log} | awk '{print $7}' | sort | uniq | sed -e 's/^/http:\/\/sopadebits/g'

Qué hace esto exactamente? Busca el inicio de la cadena (el carácter "^" es una expresión regular que indica eso) y le añade el dominio (en mi caso, el de este blog sin el ".com"). Es necesario escapar las barras (\/), como ya es habitual en las expresiones regulares.

Read more »

may. 31
2013

Phing (III) - Crear variables y ejecutar comandos shell

En el último artículo de Phing nos habíamos quedado en la introducción de datos, y con la posibilidad de definir las opciones que tiene el usuario. Vamos a ver dos funcionalidades más de Phing.

Propiedades (variables)

Creación


Puedes utilizar dos formas generales. Para empezar la más simple, utilizando el tag , o propertyTask. Esto se indica así:


Otra opción es utilizar la introducción de datos, tal como lo vimos en el segundo ejemplo:

Valor de variable1

Con cualquiera de estas opciones estás inicializando una variable que podrás utilizar.

El contexto de las variables es el mismo que el de su creación: es decir, una variable creada en un target sólo estará disponible en su propio target. Si se crea en el contexto , estará disponible en todas las operaciones del proyecto (el archivo XML), pero no estará disponible en otros proyectos llamados desde éste.

Invocación


Las variables en Phing se invocan utilizando el formato ${nombre-variable}:

...

Variable1 has value ${var1}
...

Así que ahora ya puedes generar y utilizar variables en los builds.

Archivos de propiedades


En algunos casos, en vez de indicar los valores en tags o solicitándolos al usuario, te puede interesar indicarlos en un archivo de propiedades.  Estos archivos deben tener un nombre acabado en ".properties".

El contenido de un archivo de propiedades al que, por ejemplo, puede tener un archivo INI. Es decir, un conjunto de claves y valores, pero sin apartados [separados por títulos con claves].

# Los archivos de propiedades contienen pares clave/valor
# Los valores de propiedades pueden contener:
# 1. caracteres alfanuméricos
# 2. y puntos
# Pero no pueden contener caracteres especiales
# Aprovecha para crear "namespaces" de variables
myapp.cache.enable=1
myapp.cache.ttl=500
myapp.session.save=1

Así que ahora puedes cargar este archivo (supongamos que se llama file.properties y está en el mismo directorio que el archivo build.xml), en el proyecto (o el target) que lo necesiten, con la instrucción:

...

...

Esto permite diferenciar los datos del proceso, y por ello simplifica la parametrización de algunas operaciones, como por ejemplo:

  • cargar ciertas configuraciones según el sistema operativo.
  • Solicitar un al usuario y obtener las propiedades de su archivo específico.


Supongo que ya ves por dónde va el tema: reutilizar más fácilmente el proceso, con sólo variar las configuraciones.

Propiedades disponibles proporcionadas por Phing


La siguiente es una lista de las propiedades, tal como constan en la documentación de Phing. Estas variables están disponibles desde cualquier punto de la ejecución:

























Propiedad Contenido
application.startdir Directorio actual de ejecución
env.* Variables de entorno extraídas de $_SERVER.
host.arch Arquitectura del sistema, ej. i586No disponible en equipos Windows
host.domain Nombre del dominio, ej. php.net. No disponible en equipos Windows
host.fstype Tipo de sistema de archivos. Los valores posibles son UNIXWINNTWIN32
host.name Nombre de host del sistema operativo, según lo retorna la función posix_uname()No disponible en equipos Windows.
host.os Descripción del sistema operativo, proporcionada por la variable PHP_OS
host.os.release Número de entrega del sistema operativo. No disponible en equipos Windows.
host.os.version Versión del sistema operativo i.e. #4 Tue Jul 20 17:01:36 MEST 1999No disponible en equipos Windows
line.separator Caracter(es) que marcan el final de línea, "\n" para Linux, "\r\n" para Windows, "\r" para Macintosh.
os.name Descripción del sistema operativo, proporcionada por la variable PHP_OS
phing.file Ruta completa hasta el archivo build.
phing.dir Ruta que contiene el buildfile actual.
phing.home Directorio de instalación de Phing, no indicado en las instalaciones desde PEAR.
phing.version Versión actual de Phing.
phing.project.name Nombre del proyecto que se procesa en este momento.
php.classpath Valor de la variable de entorno PHP_CLASSPATH.
php.version Versión del intérprete PHP. El mismo que la constante PHP_VERSION.
project.basedir El directorio base actual.
user.home Valor de la variable de entorno HOME.

Ejecuciones de comandos shell

Por ejemplo, uno muy sencillito: obtener el nombre del usuario que está ejecutando el script:

El comando whoami nos devuelve el nombre de usuario que está autenticado en la consola.  Puedes ejecutarlo directamente en una consola y verificar que retorna los mismos valores.

Con esta opción tan sencilla, tendremos una variable llamada username que tendrá el nombre del usuario. Y podremos ejecutar algo así como:

El usuario ${username} está ejecutando el script

El comando tiene otras varias opciones que te recomiendo conocer. Por ahora lo dejamos aquí.

Read more »

may. 29
2013

Automatizar con Phing (II) - projects y targets

En un artículo anterior, Phing quedó instalado y listo para probar. Así que ahora toca ponerlo en marcha, manos a la obra. Crearemos un directorio llamado "phingtest", donde crearemos un archivo llamado build.xml.  Introduciremos el siguiente contenido en el XML:


Esto es un primer comentario
¿Te ha gustado?
Tu respuesta es '${like}'


Ahora, guardando y abriendo un terminal, podemos dirigirnos a la carpeta phingtest y teclear:

~$ phing

Cuyo resultado es:

[echo] Esto es un primer comentario
[input] ¿Te ha gustado? Sí
[echo] Tu respuesta es 'Sí'

Builds y targets


En el archivo XML (que en Phing se denomina buildfile) podemos ver que el tag raíz es .  Todas las operaciones disponibles para un archivo de build estarán dentro de este tag.

El tag project contiene dos atributos:

  • name: Identifica el proyecto de forma única.
  • default: Es el target que se ejecutarà por defecto.


Pero ¿Qué es un target? Pues son las tareas programadas que se pueden realizar. A excepción que indiquemos lo contrario, todas los targets se pueden ejecutar directamente, y se pueden entender como pequeños procesos batch (o interactivos si añadimos inputs).  En otros contextos serían comandos complejos, macros o scripts, formados por tareas (tasks en la documentación de Phing).

Pero el caso es que, y esto es lo importante, las tareas son clases PHP, y lo que hace Phing es ahorrarnos la programación a medida para situaciones que no requieren de tal complejidad.

Eso siempre con el permiso de la sintaxis XML. Pero es relativamente fácil acostumbrarse, para el esfuerzo que te ahorras ;-).

Ejemplo: introducción de datos

En el ejemplo inicial todo es muy simple: dos echos y la entrada de texto. Pero vamos a mejorarlo un poco. Vamos a establecer un valor por defecto al input. Abrimos el archivo y lo editamos para que quede así:


Esto es un primer comentario&lt;/echo>
¿Te ha gustado?
Tu respuesta es '${like}'

Así que ya tenemos un valor por defecto. Si lo ejecutas, verás que aparece entre corchetes el texto que hemos indicado.  Pero en realidad queremos que el usuario sólo pueda escoger entre dos opciones: Sí o No. ¿Podemos? Sí, y resulta bastante fácil. Sólo hay que añadir lo siguiente:


Esto es un primer comentario&lt;/echo>
¿Te ha gustado?
Tu respuesta es '${like}'

Si el usuario ahora intenta introducir un valor distinto a los dos indicados, no podrá seguir. Si deja el valor vacío, se asumirá el valor por defecto (Sí).

Es probable que con estas dos opciones ya empieces a ver cómo se simplifican ciertas tareas. En este caso es la validación de la introducción de datos. Pero hay más, en ejemplos posteriores lo iremos viendo.


Read more »

may. 27
2013

Automatizar con Phing (I) Objetivos e instalación

Phing es una herramienta desarrollada en PHP que permite la automatización de tareas. Si has oído hablar de Apache Ant, Phing es la herramienta análoga para el PHP.  Phing permite, mediante la generación de archivos XML (que a pesar del formato, son programas simples), facilitar la automatización de tareas.

Tareas que pueden ayudar


Las tareas más habituales (pero no las únicas) son:

  • Despliegues/actualizaciones de aplicaciones (entornos locales y remotos, tanto vía FTP com SSH).
  • Documentación de código.
  • Testeo e integración continua.
  • Checkouts de repositorios de código.
  • Deploys de bases de datos.


Las tareas más habituales acostumbran a ser tareas repetitivas, con poco valor añadido, poco creativas, y en las que resulta fácil equivocarse por errores humanos. En situaciones así, ¿Por qué no automatizar?

Instalación


Para  instalar Phing, se puede realizar utilizando la herramienta Pear. Si no la tienes instalada, puedes hacerlo instalando el paquete php-pear:

~$ sudo apt-get install php-pear

Una vez instalado, puedes añadir el canal de Phing:

~$ sudo pear channel-discover pear.phing.info

Y después ya puedes instalarlo:

~$ sudo pear install --alldeps phing/phing

Bien, esto te facilita la disponibilidad de Phing, pero algunas de funcionalidades de serie sólo estarán disponibles en versiones más avanzadas. Si es tu caso, será necesario hacer un pequeño añadido:

~$ sudo pear config-set preferred_state alpha
~$ sudo pear install --alldeps phing/phing
~$ sudo pear config-set preferred_state stable

Con esto, podremos instalar Phing con las opciones más actuales (y también inestables) para luego volver a instalar versiones estables de paquetes pear.

Con este proceso, ya puedes empezar a utilizar Phing.  Comentaré algunos ejemplos en artículos posteriores. Puedes echar un vistazo a esta presentación en Slideshare, que introduce los conceptos básicos de los componentes de Phing:

[slideshare id=11755071&doc=phingphpuk2012-120226083028-phpapp02]

Read more »

© 2007 and beyond Mario Alberich, licensed under CC-BY-SA unless stated otherwise.