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!";
?>
¿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
ssh en la caja y ejecuta 'git pull' o' git clone'? ¿O crear un script que lo haga por usted? –
@cdhowie Como he dicho, no hay error.log. No sé qué pasa – heron