2011-11-22 8 views
5

Me preguntaba cómo implementar mis proyectos web utilizando ftp y/o ssh.Jenkins: implementación de FTP/SSH, incluida la eliminación y el traslado de archivos

Actualmente tenemos un sistema de implementación hecho a sí mismo que es capaz de manejar esto, pero quiero cambiar a Jenkins.

Sé que hay plugins de publicación y funcionan bien cuando se trata de cargar artefactos de construcción. Pero no pueden eliminar ni mover archivos.

¿Tiene alguna sugerencia, consejos o ideas sobre mi problema?

Respuesta

2

El complemento Publish Over SSH le permite enviar comandos utilizando ssh al servidor remoto. Esto funciona muy bien, también realizamos algunos movimientos/eliminando archivos antes de implementar la nueva versión, y no tuvimos ningún problema al usar este enfoque.

+0

Gracias, eso probablemente me ayude con mis servidores ssh. Pero ¿cómo se obtiene la información que los archivos necesitan? para ser movido/eliminado? Git ciertamente lo sabe, pero ¿cómo integrar esto en el flujo de trabajo de implementación? – 4eyes

+0

Si los archivos que está interesado en mover/eliminar ya están en git, puede clonar su repositorio en sus servidores de implementación y usar la línea de comandos de git para extraer los cambios usando publicar sobre ssh. Esta podría ser una buena forma de hacerlo si tiene archivos estáticos, que no necesitan compilarse ni verificarse, solo necesitan implementación. Probablemente funcione mejor si tiene repositorios separados para el código fuente y los archivos estáticos. – pushy

+0

Gracias. Nuestros proyectos son todos archivos "estáticos" a medida que desarrollamos software basado en php (TYPO3). Soy consciente de que puedo obtener los archivos movidos/eliminados usando git, en realidad eso es lo que hemos estado haciendo en nuestro propio sistema simple de implementación basado en phing. Estoy asombrado de que no parezca haber un complemento que cubra una implementación limpia y eficiente de ftp/ssh. Me pregunto cómo otras compañías implementan sus proyectos web, ¿no usan ftp (s)? ¿O simplemente un hosting personalizado más caro con ssh y/o git en el servidor en vivo? – 4eyes

1

La manera más fácil de manejar eliminar y mover elementos es eliminar todo en el servidor antes de implementar una nueva versión utilizando una de las extensiones 'Publish over'. Yo diría que realmente es la única forma de saber que la versión desplegada es la que desea. Si desea más comportamiento de estilo del sistema de versiones, necesita usar un sistema de control de versiones o quizás rsync que cubra una parte.

Si sus demandas son muy específicas, podría desarrollar su propia convención para marcar eliminaciones y hacer que se realicen mediante un script separado (como lo haría para los cambios de bases de datos usando Liquibase o algo así).

Por cierto: recomendaría no actualizar automáticamente sus sitios en vivo después de cada compilación utilizando la extensión 'publicar en ...'. En caso de que realmente deseemos tener un sitio en vivo actualizado automáticamente, confiamos en el Promoted Builds Plugin para mantenerlo casi completamente automatizado, pero agregue un poco de seguridad.

+0

Gracias Simone por su consejo, verificare el plugin de construcción promocionado. De todos modos, simplemente no tiene sentido para mí, por qué necesito subir un sitio web completo, cuando simplemente cambié un poco de CSS o solucioné un error en un script. De alguna manera, parezco el único que tiene este problema o todos los demás despliegan sus proyectos de sitios web en un hosting más sofisticado (ssh/git) o ​​no usan la implementación automatizada. – 4eyes

0

Se me ocurrió una solución simple para eliminar los archivos eliminados y subir los cambios a un servidor FTP remoto como una acción de compilación en Jenkins usando un simple script lftp mirror. Lftp Manual Page

En resumen, se crea un archivo de configuración en el directorio de usuario Jenkins ~/.netrc y rellenarla con sus credenciales FTP.

machine ftp.remote-host.com 
login mySuperSweetUsername 
password mySuperSweetPassword 

Crear una secuencia de comandos lftp deploy.lftp y colocarlo en la raíz de tu repositorio git

set ftp:list-options -a 
set cmd:fail-exit true 
open ftp.remote-host.com 
mirror --reverse --verbose --delete --exclude .git/ --exclude deploy.lftp --ignore-time --recursion=always 

A continuación, añadir una "Shell Exec" construir acción a ejecutar lftp en el guión.

lftp -f deploy.lftp 

La secuencia de comandos lftp se

  • espejo: copiar todos los archivos modificados
  • inversa: impulsar los archivos locales a un host remoto. un espejo normal se extrae del host remoto al local.
  • detallado: volcar todas las notas acerca de qué archivos se han copiado en el registro de generación
  • eliminar: eliminar archivos remotos ya no está presente en el repositorio git
  • excluye: no publique directorio .git o el despliegue. script lftp.
  • ignore-time: no se publicará en función de la hora de creación del archivo. Si no tiene esto, en mi caso, todos los archivos se publicaron desde que un clon nuevo del repositorio git actualizó el archivo para crear marcas de tiempo. Sin embargo, todavía funciona bastante bien e incluso los archivos modificados añadiendo un solo espacio en ellos se identificaron como diferentes y cargados.
  • recursividad: analizará cada archivo en lugar de depender de las carpetas para determinar si los archivos en ellos posiblemente se hayan modificado. Esto no es técnicamente necesario ya que estamos ignorando las marcas de tiempo, pero lo tengo aquí de todos modos.

Escribí un artículo que explica cómo I keep FTP in sync with Git para un sitio de WordPress que solo pude acceder a través de FTP. El artículo explica cómo sincronizar desde FTP a Git y luego cómo usar Jenkins para compilar e implementar nuevamente en FTP. Este enfoque no es perfecto, pero funciona. Solo carga los archivos modificados y borra los archivos del host que se han eliminado del git repo (y viceversa)

Cuestiones relacionadas