SVN Post Commit Hook para implementar un website

He estado leyendo por un time y obtuve algunas respuestas, pero solo necesito un poco más de ayuda.

Intento implementar automáticamente un website cuando un determinado set de cambios se haya enviado a una sucursal, por lo que publico mis diferentes versiones de diferentes sucursales. Por ejemplo, hay una twig activa que cada vez que se actualiza, los nuevos sets de cambios se fusionan en el website actual en vivo.

Mi repository (en un sistema de control de versiones de Subversion) está en el mismo server que el server en vivo, así que todo lo que necesito hacer es transferir los files a un directory diferente.

Sé que necesito editar el file repo / hooks / post-commit, y lo he hecho funcionar, sin embargo, no estoy seguro sobre el contenido de este file para hacer lo que tengo que hacer.

No use ganchos para fines de implementación . Utilice la herramienta de compilation (Ant, Maven, lo que sea) y la herramienta de continuous integration (CruiseControl, CruiseControl.rb, Hudson, etc.). Usar ganchos es simplemente incorrecto debido a varias razones:

  1. Escalado Los ganchos no se escalan. Es difícil hacer que hook script haga lo que se supone que no debe hacer, como por ejemplo la implementación, que siempre requiere algunos trucos para funcionar correctamente.
  2. Flexibilidad Los ganchos no son lo suficientemente flexibles. Necesita volver a escribirlos cada vez que haya cambios en sus processs. Y sus correcciones podrían romper algo que logró hacer con ganchos anteriormente.
  3. Seguridad . ¿Va a almacenar el inicio de session / contraseña para la implementación de ftp / ssh directamente en su gancho? Eso será un gran error. Es posible que encuentre una solución alternativa, pero tampoco será válida, siempre y cuando los enganches no sean el lugar adecuado para la administración de la security.
  4. Complejidad La implementación generalmente requiere muchas acciones específicas, incluso cuando al principio parece que no. Si comienza la implementación en las secuencias de commands de su gancho, resultarán hinchadas e inmanejables.
  5. Control de fuente No puedes poner ganchos bajo control de fuente. Si intenta ponerlo bajo el control de la fuente, definitivamente lo lamentará más tarde, siempre que sea difícil almacenar los ganchos junto con las fonts de su proyecto, en un solo lugar.

Todo lo que necesita es:

  1. Escribir script de compilation donde describa sus pasos de deployment
  2. Instalar herramienta de continuous integration
  3. Haga que la herramienta de continuous integration utilice su secuencia de commands de compilation y repository
  4. Configurar la herramienta de continuous integration para realizar la compilation en el compromiso
  5. Realice la confirmación en el repository y vea cómo sus cambios se buildán y desplegarán automáticamente de acuerdo con el script de compilation que haya escrito.

Personalmente utilizo Ant and CruiseControl.rb para el propósito que ha descrito. Aquí está el ejemplo del script de compilation para implementar mis cambios sobre el protocolo ftp:

<?xml version="1.0"?> <project name="myproject" default="deploy-local"> <property file="build.properties"/> <target name="deploy-local"> <echo message="Deploying version ${version}" /> <delete dir="${deploy.path.local}" /> <copy todir="${deploy.path.local}"> <fileset dir="." includes="**/*" > <exclude name=".svn/**" /> <exclude name="build.*" /> </fileset> </copy> </target> <target name="deploy-remote"> <echo message="Deploying project" /> <ftp action="del" server="${deploy.remote.server}" userid="${deploy.remote.login}" password="${deploy.remote.pass}"> <fileset> <include name="${deploy.path.remote}"/> </fileset> </ftp> <ftp action="mkdir" server="${deploy.remote.server}" userid="${deploy.remote.login}" password="${deploy.remote.pass}" remotedir="${deploy.path.remote}"> </ftp> <ftp server="${deploy.remote.server}" userid="${deploy.remote.login}" password="${deploy.remote.pass}" remotedir="${deploy.path.remote}" passive="yes"> <fileset dir="." includes="**/*" > <exclude name=".svn/**" /> <exclude name="build.*" /> </fileset> </ftp> </target> </project> 

build.properties file build.properties tiene el siguiente contenido:

 deploy.path.local = C:\\apache\\htdocs\\myproject deploy.path.remote = /http/deploy deploy.remote.server = ftp.myproject.com deploy.remote.login = mylogin deploy.remote.pass = mypass 

Recomendaría dedicar algo de time para aprender los conceptos básicos de administración de compilation (Ant) y la continuous integration (CruiseControl) para realizar la implementación de la manera más adecuada. Aunque parezca que no es lo que solicitó y un poco más complejo, es lo correcto.