Automatice implementaciones con Git, Bitbucket y PHP

Estoy en el process de tratar de configurar deployments automáticos cuando hago un git push en mi repository bitbucket. Tengo una secuencia de commands de implementación php que aproveché de este blog, pero cuando la secuencia de commands se ejecuta está registrando que solo se está actualizando a partir de una confirmación previa.

Aquí hay un ejemplo. Digamos que me conecto a mi server y escribo git pull. El server se actualizará con los últimos cambios y digamos que el hash para esa confirmación fue 001. Sin embargo, si realizo varias confirmaciones, llamémoslos 002, 003 y 004; mi secuencia de commands debería ejecutarse cada vez que asumiera esos cambios en bitbucket después de cada confirmación. . La secuencia de commands se ejecuta pero cada vez saveá los cambios de 001. Solo cuando inicie session en mi server y escriba git pull, ¿el server actualizará a 004. ¿Sabes qué podría causar esto?

// Make sure we're in the right directory exec('cd '.$this->_directory, $output); $this->log('Changing working directory... '.implode(' ', $output)); // Discard any changes to tracked files since our last deploy exec('git reset --hard HEAD', $output); $this->log('Reseting repository... '.implode(' ', $output)); // Update the local repository exec('git pull '.$this->_remote.' '.$this->_branch, $output); $this->log('Pulling in changes... '.implode(' ', $output)); // Secure the .git directory exec('chmod -R og-rx .git'); $this->log('Securing .git directory... '); if (is_callable($this->post_deploy)) { call_user_func($this->post_deploy, $this->_data); } $this->log('Deployment successful.'); 

Lo que recomendaría es lanzar no basado en la última versión de su maestro, sino una última label.

/home/my-user/my-application/1.0.12/www
/home/my-user/my-application/1.0.13/www

etc. Esto proporciona la funcionalidad de reversión. Puede hacer un script PHP que se conecte a su server a través de SSH y cree un nuevo clon basado en esa label. Si usa Composer, puede usar esto para ejecutar commands. Si no, puede hacerlo con un file MAKE.

Editar: Olvidé mencionar cómo lo vincula realmente.

Usted tiene un enlace simbólico
/home/my-user/my-application/www -> /home/my-user/my-application/1.0.12/www

Cuando toda la secuencia de commands de implementación finaliza sin errores, cambia el enlace simbólico a:
/home/my-user/my-application/www -> /home/my-user/my-application/1.0.13/www

Su aplicación ahora está activa sin time de inactividad.

El problema son los permissions de files.

Estaba siguiendo el mismo enlace a esa publicación de blog. Descubrí que el usuario 'www-data' que utilizan los processs php y nginx no tiene permissions de escritura en el código del repository. Ni siquiera puede usar git.

Para verificar esto intente hacer un 'git pull' en el server como 'www-user'. Puede cambiarlo por 'sudo su www-data'. Descubrirá que ni siquiera reconoce que es un repository de git válido y no puede ejecutar su script 'deploy.php' sin errores.

Debe configurar los permissions adecuados en su repository para que www-data pueda acceder a él.

O cambias todo el enfoque. Sigue esta publicación http://toroid.org/ams/git-website-howto, que considero que es un método mucho mejor que el anterior. Terminé usando este método.

Desea establecer un post-update en el control remoto al que presiona.

En el caso pnetworkingeterminado, git no registrará ningún dato que envíe a un control remoto. Es por eso que la configuration de git pnetworkingeterminada se niega a enviar a la sucursal desprotegida ya que los files desprotegidos ya no están actualizados con HEAD, cuando presiona hacia la sucursal de salida.

Sin embargo, cuando el control remoto recibe un empujón a una sucursal, puede reactjsr sobre eso en el gancho post-update . Para ver qué sucede, primero debe comenzar con algo de logging:

 echo "post update `date`: $*" >> /home/ingo/test/githooks.out 

Cuando presiono en la twig nueva, por ejemplo, obtengo la línea

 post update Mi 24. Jun 13:01:14 CEST 2015: refs/heads/new 

, donde $* contiene las twigs a las que presioné.

Con esto puedes escribir simplemente escribir un script para pagar esa twig. Prefiero ver las cabezas separadas, ya que es mucho más simple combinar el trabajo de varios repositorys de modules (sin submodules) en una versión desplegada. Vea mi respuesta a la implementación del código fuente sobre cómo verificar el código fuera del repository de git y trabaje con eso.

Por ejemplo, podrías hacer

 for b in $* do B=`basename $b` if [ "$B" = "publish" ] # react on changes to the publish branch then git --work-tree "PATH TO THE PUBLISHED WORK TREE" checkout publish do_some_extra_work # to change permissions or inform your team leader fi done 

Por supuesto, usted puede hacer el paso de pago también, eso se hace en un tirón

 if [ "`cat HEAD`" = "ref: refs/heads/master" ] # only do that checkout if the repository is in a sane state then git merge new # I assume you push to new fi 

Lo bueno es que verá la salida de su gancho en el control remoto en la terminal donde ejecutó el impulso:

 # git push remote master:new Counting objects: 3, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 296 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) remote: Updating f81ba5b..a99a710 remote: Fast-forward remote: a.txt | 2 ++ remote: 1 file changed, 2 insertions(+) To ../remote db48da1..a99a710 master -> new