2012-10-03 38 views
7

Lo que quiero hacer es cambiar la implementación de FTP a GIT. Quiero decir, quiero mantener automáticamente sincronizado mi repositorio privado de Bitbucket y mi alojamiento web compartido. Busqué en Google y encontré el siguiente script para implementar mi servidor web (based on this article).Configuración del despliegue GIT automático del proyecto PHP

// Set these dependant on your BB credentials  
$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 simples conjuntos de cambios como el cambio de 5-10 archivos. Pero cuando introduzco todo el proyecto por primera vez (por ejemplo, con 600-700 archivos 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 así:

Como sabemos, Bitbucket puede enviar información de POST en una misma dirección URL (dado por el usuario) directamente después de una confirmación se ha hecho. Entonces, cuando deploy.php recibe POST, podemos obtener la confirmación completa como zip o tar, limpiar nuestros archivos actuales y descomprimir la nueva confirmación en el servidor web.

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

actualización

me encontré con el siguiente código para el proyecto php despliegue automatizado. El problema es https://bitbucket.org/$username/$reponame/get/tip.zip esta url no funciona en bitpocket private git repo: probablemente relacionado con la autenticación (no he probado esto en el repositorio público) Lo que necesito es obtener el archivo 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!"; 

?> 
+0

¿Qué hay en el registro de errores cuando ejecuta este script? Tal vez está tomando demasiado tiempo o usando demasiada memoria RAM y el httpd lo está matando. – cdhowie

+0

ssh en la caja y ejecuta 'git pull' o' git clone'? ¿O crear un script que lo haga por usted? –

+0

@cdhowie Como he dicho, no hay error.log. No sé qué pasa – heron

Respuesta

2

Esta solución no proporciona autenticación:

// 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 rizo lo permite. Por lo tanto, un archivo zip se puede descargar desde un repositorio 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 cuenta de bitbucket. Funciona muy bien.

Si es necesario para conseguir el último nodo de cambios que debemos utilizar bitbucket API GET a list of changesets:

$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); 
+0

No consigo, ¿qué escribir dentro del archivo php? – heron

+0

@epic_syntax Lee mi respuesta –

0

En base a su actualización, reemplazar contenido de los archivos PHP con código de abajo:

<?php 
// Set these dependant on your BB credentials  
$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"); 
?> 

actualización

Aquí son depositarios de esta guión (Modificado por Me) en

  1. GitHub
  2. Bitbucket
Cuestiones relacionadas