Establecer la implementación automática de GIT del proyecto PHP

Lo que quiero hacer es cambiar la implementación de FTP a GIT. Quiero decir, quiero mantener automáticamente sincronizado mi repository privado de Bitbucket y mi alojamiento web compartido. Busqué en Google y encontré el siguiente script para implementar mi server web ( basado en este artículo ).

// Set these dependant on your BB cnetworkingentials $username = 'username'; $password = 'password'; // Grab the data from BB's POST service and decode $json = stripslashes($_POST['payload']); $data = json_decode($json); // Set some parameters to fetch the correct files $uri = $data->repository->absolute_url; $node = $data->commits[0]->node; $files = $data->commits[0]->files; // Foreach through the files and curl them over foreach ($files as $file) { if ($file->type == "removed") { unlink($file->file); } else { $url = "https://api.bitbucket.org/1.0/repositories" . $uri . "raw/" .$node ."/" . $file->file; $path = $file->file; $dirname = dirname($path); if (!is_dir($dirname)) { mkdir($dirname, 0775, true); } $fp = fopen($path, 'w'); $ch = curl_init($url); curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_FILE, $fp); $data = curl_exec($ch); curl_close($ch); fclose($fp); } } 

El problema es que esto funciona en sets de cambios simples, como el cambio de 5-10 files. Pero cuando introduzco todo el proyecto por primera vez (por ejemplo, con 600-700 files y carpetas) en mi perfil privado bitbucket, este script no funciona. (Simplemente no, no hay error en errors.log)

¿Qué me estoy perdiendo?

Por cierto, ¿puedo hacer algo como eso?

Como sabemos, Bitbucket puede enviar información POST a una url exacta (dada por el usuario) directamente después de que se haya realizado una confirmación. Entonces, cuando deploy.php recibe POST, podemos get la confirmación completa como zip o tar, limpiar nuestros files actuales y descomprimir la nueva confirmación en el server web.

¿Es eso posible? Si es así, ¿entonces cómo? ¿Alguna otra buena manera?

Actualizar

Encontré el código a continuación para implementar automáticamente el proyecto php. El problema es https://bitbucket.org/$username/$reponame/get/tip.zip esta url no funciona en bitbucket private git repo: probablemente relacionado con la authentication (no lo he probado en el repository público) Lo que necesito es get el file zip del último commit y descomprimir dentro de mi proyecto.

 <? // your Bitbucket username $username = "edifreak"; // your Bitbucket repo name $reponame = "canvas-game-demo"; // extract to $dest = "./"; // leave ./ for relative destination //////////////////////////////////////////////////////// // Let's get stuff done! // set higher script timeout (for large repo's or slow servers) set_time_limit(380); // download the repo zip file $repofile = file_get_contents("https://bitbucket.org/$username/$reponame/get/tip.zip"); file_put_contents('tip.zip', $repofile); unset($repofile); // unzip $zip = new ZipArchive; $res = $zip->open('tip.zip'); if ($res === TRUE) { $zip->extractTo('./'); $zip->close(); } else { die('ZIP not supported on this server!'); } // delete unnecessary .hg files @unlink("$username-$reponame-tip/.hgignore"); @unlink("$username-$reponame-tip/.hg_archival.txt"); // function to delete all files in a directory recursively function rmdir_recursively($dir) { if (is_dir($dir)) { $objects = scandir($dir); foreach ($objects as $object) { if ($object != "." && $object != "..") { if (filetype($dir."/".$object) == "dir") rmdir_recursively($dir."/".$object); else unlink($dir."/".$object); } } reset($objects); rmdir($dir); } } // function to recursively copy the files function copy_recursively($src, $dest) { if (is_dir($src)) { if($dest != "./") rmdir_recursively($dest); @mkdir($dest); $files = scandir($src); foreach ($files as $file) if ($file != "." && $file != "..") copy_recursively("$src/$file", "$dest/$file"); } else if (file_exists($src)) copy($src, $dest); rmdir_recursively($src); } // start copying the files from extracted repo and delete the old directory recursively copy_recursively("$username-$reponame-tip", $dest); // delete the repo zip file unlink("tip.zip"); // Yep, we're done :) echo "We're done!"; ?> 

Esta solución no proporciona authentication:

 // download the repo zip file $repofile = file_get_contents("https://bitbucket.org/$username/$reponame/get/tip.zip"); file_put_contents('tip.zip', $repofile); unset($repofile); 

Pero Curl lo permite. Por lo tanto, un file zip se puede download desde un repository privado de la misma manera que en el primer script.

 $node = ''; // a node from repo, like c366e96f16... $fp = fopen($path, 'w'); $ch = curl_init("https://bitbucket.org/$username/$reponame/get/$node.zip"); curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_FILE, $fp); $data = curl_exec($ch); curl_close($ch); fclose($fp); 

Lo he probado para mi count de bitbucket. Funciona muy bien.

Si es necesario para get el último nodo de set de cambios, deberíamos usar bitbucket api OBTENER una list de sets de cambios :

 $username = 'login'; $password = 'pass'; $owner = $username; // if user is owner $repo = 'repo name'; $response = ""; $callback = function($url, $chunk) use (&$response){ $response .= $chunk; return strlen($chunk); }; $ch = curl_init("https://api.bitbucket.org/1.0/repositories/$owner/$repo/changesets?limit=1"); curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, array('User-Agent:Mozilla/5.0')); curl_setopt($ch, CURLOPT_WRITEFUNCTION, $callback); curl_exec($ch); curl_close($ch); $changesets = json_decode($response, true); $node = $changesets['changesets'][0]['node']; $raw_node = $changesets['changesets'][0]['raw_node']; print($node . PHP_EOL); print($raw_node . PHP_EOL); 

Recientemente descubrí Capistrano, que es una gran herramienta. Inicialmente fue desarrollado para ruby ​​pero también es genial en combinación con php http://www.davegardner.me.uk/blog/2012/02/13/php-deployment-with-capistrano/

En function de su actualización, reemplace los contenidos de su file php por el siguiente código:

 <?php // Set these dependant on your BB cnetworkingentials $username = ''; $password = ''; // your Bitbucket repo name $reponame = ""; // extract to $dest = "./"; // leave ./ for relative destination // Grab the data from BB's POST service and decode $json = stripslashes($_POST['payload']); $data = json_decode($json); // set higher script timeout (for large repo's or slow servers) set_time_limit(5000); // Set some parameters to fetch the correct files $uri = $data->repository->absolute_url; $node = $data->commits[0]->node; $files = $data->commits[0]->files; // download the repo zip file $fp = fopen("tip.zip", 'w'); $ch = curl_init("https://bitbucket.org/$username/$reponame/get/$node.zip"); curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_FILE, $fp); $data = curl_exec($ch); curl_close($ch); fclose($fp); // unzip $zip = new ZipArchive; $res = $zip->open('tip.zip'); if ($res === TRUE) { $zip->extractTo('./'); $zip->close(); } else { die('ZIP not supported on this server!'); } // function to delete all files in a directory recursively function rmdir_recursively($dir) { if (is_dir($dir)) { $objects = scandir($dir); foreach ($objects as $object) { if ($object != "." && $object != "..") { if (filetype($dir . "/" . $object) == "dir") rmdir_recursively($dir . "/" . $object); else unlink($dir . "/" . $object); } } reset($objects); rmdir($dir); } } // function to recursively copy the files function copy_recursively($src, $dest) { if (is_dir($src)) { if ($dest != "./") rmdir_recursively($dest); @mkdir($dest); $files = scandir($src); foreach ($files as $file) if ($file != "." && $file != "..") copy_recursively("$src/$file", "$dest/$file"); } else if (file_exists($src)) copy($src, $dest); rmdir_recursively($src); } // start copying the files from extracted repo and delete the old directory recursively copy_recursively("$username-$reponame-$node", $dest); // delete the repo zip file unlink("tip.zip"); ?> 

Actualizar

Aquí hay repositorys de este script (Modificado por Mí) en

  1. GitHub
  2. Bitbucket