Was ich tun möchte, ist, von FTP-Bereitstellung in GIT zu wechseln. Ich meine, ich möchte mein privates Bitbucket-Repo und mein geteiltes Webhosting automatisch synchronisiert halten. Ich habe gegoogelt und folgendes Skript gefunden, um meinen Webserver zu betreiben (based on this article).Einstellung der automatischen GIT-Bereitstellung von PHP-Projekt
// 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);
}
}
Das Problem ist, dass dies auf einfache Changesets wie 5-10 Dateiänderung funktioniert. Aber wenn ich das gesamte Projekt zum ersten Mal (zum Beispiel mit 600-700 Dateien und Ordnern) in mein Bitbucket-Privatprofil schiebe, funktioniert dieses Skript nicht. (nur nicht, kein Fehler auf errors.log)
Was fehlt mir?
By the way, Kann ich etwas tun, wie folgt aus:
Wie wir wissen, Bitbucket können direkt POST Informationen in eine genaue URL (vom Benutzer angegeben) senden eine nach Commit erfolgt ist. Wenn also deploy.php POST empfängt, können wir das gesamte Commit als Zip oder Teer erhalten, unsere aktuellen Dateien bereinigen und das neue Commit auf den Webserver entpacken.
Ist das möglich? Wenn ja, wie? Irgendein anderer guter Weg?
aktualisieren
fand ich den Code für die automatisierte Bereitstellung von PHP-Projekt. Das Problem ist https://bitbucket.org/$username/$reponame/get/tip.zip
Diese URL funktioniert nicht auf bitbucket privaten Git Repo: wahrscheinlich im Zusammenhang mit der Authentifizierung (Ich habe dies nicht auf öffentliche Repo getestet) Was ich brauche, ist die letzte commit Zip-Datei und entpacken in meinem Projekt.
<?
// 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!";
?>
Was ist in Ihrem Fehlerprotokoll, wenn Sie dieses Skript ausführen? Vielleicht dauert es zu lange oder zu viel RAM und der httpd bringt es um? – cdhowie
ssh auf die Box und renne 'git pull' oder' git clone'? Oder ein Skript erstellen, das das für Sie erledigt? –
@cdhowie Wie gesagt, gibt es kein error.log. Weiß nicht, was passiert – heron