Configuración de un ciclo de implementación / construcción / CI para proyectos PHP

200

Soy un desarrollador solitario la mayor parte de mi tiempo, trabajando en varios proyectos grandes, principalmente basados ​​en PHP. Quiero profesionalizar y automatizar la forma en que se manejan los cambios en la base del código, y crear un proceso de integración continua que haga posible la transición al trabajo en equipo sin tener que hacer cambios fundamentales.

Lo que estoy haciendo ahora es tener un entorno de prueba local para cada proyecto; Yo uso SVN para cada proyecto; los cambios se prueban localmente y luego se transfieren a la versión en línea, generalmente a través de FTP. La documentación de la API se genera manualmente desde el código fuente; Las pruebas unitarias son algo en lo que me estoy metiendo lentamente, y todavía no es parte de mi rutina diaria.

El "ciclo de construcción" que estoy imaginando haría lo siguiente:

  • Un conjunto de cambios se registra en SVN después de haber sido probado localmente.

  • Comienzo el proceso de construcción. La revisión de SVN HEAD se desprotege, se modifica si es necesario y se prepara para cargar.

  • La documentación de API se genera automáticamente; si aún no la configuré en detalle, utilizando una plantilla predeterminada, escaneando toda la base de código.

  • La nueva revisión se implementa en la ubicación remota a través de FTP (incluyendo algunos cambios de nombre de directorio, modificación de chmodding, importación de bases de datos y similares). Esto es algo por lo que ya me gusta mucho el phing , pero estoy abierto a alternativas, por supuesto.

  • Se ejecutan pruebas unitarias que residen en una ubicación predefinida. Me informan sobre su fracaso o éxito al utilizar el correo electrónico, RSS o (preferiblemente) la salida HTML que puedo obtener y poner en una página web.

  • (opcionalmente) un archivo de texto "changelog" de usuario final en una ubicación predefinida se actualiza con una parte predefinida del mensaje de confirmación ("Ahora es posible filtrar tanto" foo "como" bar "al mismo tiempo) tiempo). Este mensaje no es necesariamente idéntico al mensaje de confirmación SVN, que probablemente contiene mucha más información interna.

  • Cosas como métricas de código, verificación de estilo de código, etc., no son mi enfoque principal en este momento, pero a largo plazo, ciertamente lo serán. Las soluciones que traen esto de forma inmediata son muy amables.

Busco

  • Comentarios y experiencias de personas que están o estuvieron en una situación similar, y han implementado con éxito una solución para esto

  • Especialmente, buenos tutoriales paso a paso y tutoriales sobre cómo configurar esto

  • Soluciones que proporcionan la mayor automatización posible , por ejemplo, creando una API esqueleto, casos de prueba, etc. para cada nuevo proyecto.

y también

  • Recomendaciones de productos . Lo que sé hasta ahora es phing / ant para la construcción, y phpUnderControl o Hudson para la parte de informes. Me gustan todos hasta donde puedo ver, pero por supuesto no tengo experiencia detallada con ellos.

Estoy lleno de trabajo, por lo que tengo una fuerte inclinación hacia soluciones simples. Por otro lado, si falta una característica, lloraré por que sea demasiado limitada. :) Las soluciones de apuntar y hacer clic también son bienvenidas. También estoy a favor de las recomendaciones de productos comerciales que pueden funcionar con proyectos PHP.

Mi configuración

Estoy trabajando en Windows localmente (7, para ser exactos) y la mayoría de los proyectos de clientes se ejecutan en una pila LAMP, a menudo en un alojamiento compartido (= sin SSH remoto). Estoy buscando soluciones que pueda ejecutar en mi propio entorno. Estoy listo para configurar una máquina virtual Linux para esto, no hay problema. Las soluciones alojadas son interesantes para mí solo si proporcionan todos los aspectos descritos o si son lo suficientemente flexibles como para interactuar con las otras partes del proceso.

Recompensa Estoy aceptando la respuesta que siento me dará la mayor cantidad de millas. Aquí hay muchos comentarios excelentes, desearía poder aceptar más de una respuesta. ¡Gracias a todos!

Pekka 웃
fuente

Respuestas:

76

He pasado por buildbot , CruiseControl.net , CruiseControl y Hudson . Aunque realmente me gustó CruiseControl *, fue demasiado complicado con casos de dependencia realmente complejos. buildbot no es fácil de configurar, pero tiene un aura agradable (me gusta Python, eso es todo). Pero Hudson se ganó a los tres anteriores porque:

  1. Es fácil de configurar
  2. Es fácil de personalizar
  3. Se ve bien y tiene una buena funcionalidad general
  4. Obtuvo actualizaciones de apuntar y hacer clic, para sí mismo y para todos los complementos instalados. Esta es una característica realmente agradable, que aprecio cada vez más

Advertencia: solo utilicé Linux como base para los servidores de compilación mencionados anteriormente (CC.net se ejecutó en mono ), pero todos deberían, según los documentos, ejecutar multiplataforma.

Configurar un servidor Hudson

Prerrequisitos:

  • Java (1.5 te servirá muy bien)
  • Acceso de lectura al servidor de subversión (tengo una cuenta separada para el usuario de Hudson)

A partir de aquí, es solo:

java -jar hudson.war

Esto ejecutará una pequeña instancia de servidor directamente desde su consola, y debería poder explorar la instalación en su http://localhost:8080, si no tiene nada más ejecutándose en ese puerto de antemano (puede especificar otro puerto pasando la --httpPort=ANOTHER_HTTP_PORTopción al comando anterior) y todo salió bien en el proceso de 'instalación'.

Si va al directorio de complementos disponibles ( http://localhost:8080/pluginManager/available), encontrará complementos para admitir las tareas mencionadas anteriormente (el soporte de subversión está instalado por defecto).

Si eso le ha abierto el apetito, debe instalar un servidor de aplicaciones java, como tomcat o jetty . Las instrucciones de instalación están disponibles para todos los servidores de aplicaciones principales

Actualización : Kohsuke Kawaguchi ha construido un instalador de servicios de Windows para Hudson

Configurar un proyecto en Hudson

Los enlaces en el siguiente recorrido suponen una instancia de ejecución de hudson ubicada en http://localhost:8080

  1. Seleccione nuevo trabajo ( http://localhost:8080/view/All/newJob) en el menú de la izquierda
  2. Dé un nombre al trabajo y marque Build a free-style software projecten la lista
  3. Presionar 'ok' lo llevará a la página de configuración del trabajo. Todas las opciones tienen un pequeño signo de interrogación además de ellas. Al presionar esto, aparecerá un texto de ayuda sobre la opción.
  4. En el grupo de opciones 'Gestión del código fuente', estaría utilizando Subversion. Hudson acepta tanto el acceso a la URL como el acceso al módulo local
  5. Bajo el grupo de opciones 'Build Triggers', usarías 'Poll SCM'. La sintaxis utilizada aquí es la de cron, por lo que sondear el repositorio de subversión cada 5 minutos sería*/5 * * * *
  6. El proceso de construcción del proyecto se especifica en el grupo de opciones 'Construir'. Si ya tienes un archivo de compilación de hormigas con todos los objetivos que necesitas, estás de suerte. Simplemente elija 'Invocar hormiga' y escriba el nombre del objetivo. El grupo de opciones también admite comandos maven y shell listos para usar , pero también hay un complemento disponible para phing .
  7. Marque acciones de compilación adicionales en 'Publicar acciones de compilación', como notificaciones por correo electrónico o archivado de artefactos de compilación.

Para configurar procesos para los cuales Hudson no tiene complementos, puede llamarlos directamente a través de un script de shell desde la configuración de compilación, o puede escribir su propio complemento

Trampas:

  • Si tiene que producir artefactos de construcción, recuerde que hudson limpie después de sí mismo a intervalos regulares.
  • Si tiene más de 20 proyectos configurados, considere no mostrar su estado de compilación como la página principal predeterminada en hudson

¡Buena suerte!

Steen
fuente
2
Creo que hay un error con su sintaxis cron. Eso duraría el quinto minuto de cada hora. Si desea sondear el repositorio cada 5 minutos, necesitaría usar * / 5
Brian Wigginton
2
@BrianWigginton: tienes toda la razón. E incluso intenté corregir la publicación, pero no puedo guardarla porque tengo "una referencia a un nombre de host no válido", a saber, 'localhost'. Espero que la gente mire aquí para la corrección.
Steen
22

El término que está buscando es "integración continua".

Aquí hay un ejemplo de alguien que usa GIT + phpundercontrol: http://maff.ailoo.net/2009/09/continuous-integration-phpundercontrol-git/

CruiseControl (que es un servidor de CI) puede usar SVN / GIT alojado como fuente. Así que incluso puedes usarlo con GitHub o Beanstalk u otra cosa.

Luego puede integrar eso con el siguiente tipo de software:

  • PHPUnit
  • php-codesniffer
  • phpdocumentor
  • PHP Gcov
  • PHPXref
  • Yasca
  • etc.

También puede probar este CI alojado: http://www.php-ci.net/hosting/create-project

Sin embargo, tenga en cuenta que esas herramientas necesitan soporte personalizado si las integra usted mismo.

¿También ha pensado en la gestión de proyectos y la gestión de parches?

Puede usar Redmine para la gestión de proyectos. Tiene soporte integrado de integración continua, pero solo como cliente (no como servidor CI).

Intente usar un SVN / GIT / etc alojado. solución, porque cubrirán sus copias de seguridad y mantendrán sus servidores en funcionamiento, para que pueda concentrarse en el desarrollo.

Para ver un tutorial sobre cómo configurar Hudson, consulte: http://toptopic.wordpress.com/2009/02/26/php-and-hudson/

Michiel
fuente
2
Gracias por el enlace. Los productos con los que estoy familiarizado, lo que espero son más tutoriales estilo tutorial como el que usted proporcionó.
Pekka
Hola, a partir de octubre de 2012, ¿php-ci.net está caído o ya no está en servicio? Parece que no puedo conectarme a esa dirección, ni puedo encontrar nueva información del año pasado.
Ryan
@ Ryan, no sé qué pasó. Sí sé que puedes probar con otros. Tal vez podría intentar: CircleCI o podría consultar este tema: ¿ Integración continua alojada para PHP?
Michiel
@ Ryan, no, no está abajo, lo he estado usando por un tiempo. Se mudaron a phptesting.org
omrakhur
6

Utilizo el servidor de integración continua Bamboo de Atlassian para mi proyecto PHP principal (junto con sus otros productos como fisheye (navegación de repositorio), jira (rastreador de problemas) y trébol (cobertura de código)).

Es compatible con SVN y ahora es compatible con Git y tiene una excelente interfaz de usuario. Está disponible para Linux, Windows y Mac y puede ejecutarse de forma independiente en su propio servidor Tomcat, lo cual es ideal para personas (como yo) a quienes no les gusta tomarse días para configurar sus herramientas). Aunque puede parecer costoso, siendo un desarrollador solitario, compré la licencia del kit de inicio por 10 $ (10 $ por software). Esto es ideal para equipos pequeños y vale la pena verlo.

Steven Rosato
fuente
¿Cómo se puede configurar el bambú para admitir phing? Actualmente estoy usando hormiga, pero parece que el phing es más apropiado para el despliegue de php. Gracias
Vincent
5

PHPTesting PHPCI Este es un buen servidor de integración continua integrado en php.

Además, es de código libre y abierto. :)

tiene varios complementos ...

PHPCI incluye complementos de integración para:

  • Atoum
  • Behat
  • Hoguera
  • Codecepción
  • Compositor
  • Email
  • Gruñido
  • IRC
  • PHP
  • Hilas
  • MySQL
  • PDepend
  • PostgreSQL
  • Sniffer de código PHP
  • Detector de copiar / pegar PHP
  • Especificaciones PHP
  • Unidad PHP
  • Comandos de Shell
  • Tar / Zip
MarmiK
fuente
Aunque me gusta PHPCI, no lo recomiendo. Es increíblemente defectuoso y no confiable. Es triste que la funcionalidad básica común no se esté probando correctamente en la unidad, por lo que algo tan básico como agregar una URL de proyecto es difícil sin que se estropee.
Tek
@Tek, ¿cuál es su estrategia de CI para PHP?
omrakhur
1
@omrakhur Estoy atascado con PHPCI desafortunadamente. El resto del software es mucho más voluminoso y requiere mucho tiempo para configurarlo. Todo tiene sus pros y sus contras. Solo tienes que ir con lo que funciona mejor para ti.
Tek
3

Soy principalmente un administrador de sistemas, pero a veces también codifico PHP. Como proyecto paralelo, creé algunos scripts que harán que sea sencillo e indoloro configurar un entorno PHP CI completo utilizando Jenkins. También ejecuta un proyecto de muestra para que pueda ver cómo se configura cada paso de compilación.

Si quieres probarlo, todo lo que necesitas es un cuadro de Debian / Ubuntu y acceso a shell.

http://yauh.de/articles/379/setting-up-a-ci-environment-for-php-projects-using-jenkins-ci

Actualizar Para agregar contenido a mi respuesta:

Simplemente puede configurar un Jenkins CI para PHP usando Ansible. Desde la v1.4, admite roles que puede descargar desde el sitio de la comunidad galaxy.ansibleworks.com y hará el trabajo pesado por usted. Se llama jenkins-php .

Stephan
fuente
3

Sugeriría usar Jenkins http://jenkins-ci.org/ es gratis y de código abierto.

Es bastante sencillo de configurar, funciona en múltiples plataformas y se integra bien con otras herramientas de integración continua como SonarQube (+ SQUALE) para medir la deuda técnica y Thucydides para probar la automatización.

Recomiendo encarecidamente usar GIT o GIT Hub para el control de versiones en lugar de SVN. Desde mi punto de vista, es solo un mejor sistema de control de versiones que lo ayudará a escalar sus esfuerzos de desarrollo más adelante.

Como está trabajando principalmente con proyectos PHP, existen otras herramientas que puede usar.

PHPUnit - Para pruebas unitarias

PHP CodeSniffer - Verifique los estándares de codificación

Depende de PHP: muestra sus dependencias de código PHP

XDEBUG: para pruebas de rendimiento

Todas estas herramientas se activarán con un trabajo de Jenkins y ayudarán con la calidad y el rendimiento de su código.

Buena suerte y disfruta!

Desarrollador ágil
fuente
3

No uso muchos de los productos, ni siquiera los tipos de productos que usa, pero le daré mi experiencia.

Ejecuto un entorno TEST en paralelo con mi entorno PROD. No tengo pruebas locales per se. Si es demasiado difícil llevar algo a un entorno de PRUEBA real, entonces arreglo mi proceso de compilación. No veo el punto de probar localmente, ya que los entornos son diferentes. ACTUALIZACIÓN: Lo único que hago localmente es ejecutar "php -l" antes de cargar cualquier cosa. Detiene los estúpidos errores.

El proceso de compilación funciona con lo que esté en el espacio de trabajo actual, que incluye código no confirmado. Esta no es la taza de té de todos, pero voy a hacer PRUEBAS muy a menudo. Todo se compromete antes de ir a PROD.

Parte de mi proceso de compilación (similar al tuyo) crea dos archivos META. Uno contiene los últimos (típicamente) 100 cambios y también me da el número actual de la lista de cambios. El me muestra qué cambios están instalados. El otro contiene el CLIENTSPEC (en términos de Perforce) que me muestra exactamente qué ramas se usaron en esta compilación. Juntos, estos me dan construcciones reproducibles.

No construyo directamente al entorno de destino, sino a un área de preparación en el servidor. Yo uso SSH, así que esto tiene sentido. Esto me da algunas ventajas. Lo más importante es que evita morir a la mitad de una carga grande. También me da un lugar para almacenar archivos META, y todos los archivos de compilación se archivan automáticamente (para que pueda volver directamente a cualquier compilación). El script también registra la actualización (por lo que hay una entrada en la secuencia de registro y puedo ver antes y después) y patea todos los demonios (uso daemontools para "svc -t"). Todos estos están mejor en la máquina de destino.

Otro problema son los cambios en la base de datos. Mantengo un script maestro del esquema de base de datos, que actualizo cada vez que cambia el esquema. Cada uno de los cambios también entra en un script de cambios.sql, que se carga con la compilación en el área de preparación. El script se ejecuta como parte del script de instalación.

Phil Wallach
fuente
Gracias por tu aporte Phil, esta es una configuración muy, muy interesante y creo que puedo usar partes de esto. Sin embargo, en mi caso, a menudo no tendré acceso SSH al extremo remoto, por lo que necesito mucha "inteligencia" localmente, por eso creo que voy a necesitar un producto CI como Hudson.
Pekka
2

Recientemente comencé el mismo tipo de proceso, y estoy usando Beanstalk para svn hosting.

Hay dos funciones ingeniosas en las cuentas pagas (creo que comienzan en $ 15pm):

  • la implementación le permite al usuario crear objetivos ftp para servidores de preparación y producción, que se pueden implementar con solo hacer clic en un botón (inc. especificando una revisión y rama)
  • los webhooks permiten al usuario configurar una url que se llama en cada confirmación / implementación, pasando por cosas como el número de revisión, la descripción y el usuario. Esto podría usarse para actualizar documentos, ejecutar pruebas unitarias y actualizar registros de cambios.

Estoy seguro de que hay otros servidores svn alojados o autohospedados con estas dos características, pero beanstalk es el que tengo experiencia y está funcionando muy, muy bien

También hay una API, que imagino podría usarse para integrar aún más la implementación en su proceso.

Adam Hopkinson
fuente
Saludos @adam. No busco tanto servicios alojados para esto, ya que me temo que siempre serán demasiado limitados para lo que necesito. Pero lo que dices suena interesante, y la API podría ser un punto de conexión para el resto. Voy a echar un vistazo a esto.
Pekka
No se preocupe, pensé que podría decir eso. Me conviene por ahora, ya que no tengo toda la cabeza svn (y soy un equipo de un solo hombre), además de que ofrecen una exportación de repositorio completo si quieres mudarte.
Adam Hopkinson
2

Considere fazend.com , una plataforma de CI alojada gratuita, que automatiza los procedimientos de configuración e instalación. No es necesario configurar el control de versiones, el seguimiento de errores, el servidor CI, el entorno de prueba, etc. Todo se hace a pedido.

yegor256
fuente
¡Mmm, esto se ve muy interesante! ¿Pero cómo sobreviven? ¿Ya que todo es gratis? ¿Cómo pagan por el servidor y las tarifas de E3?
Pekka
@Pekka Este proyecto está patrocinado por una empresa de desarrollo de software, por eso el servicio es gratuito.
yegor256