Um ein Git-Pull aus einer PHP-Datei zu automatisieren, wird ein privater SSH-Schlüssel erstellt und im GitHub-Repository hinterlegt. Dabei ist sicherzustellen, dass ausführbare Dateien wie ssh-add, git und ssh-agent über absolute Pfade erreichbar sind. Anschließend wird ein PHP-Skript konfiguriert, das die Git-Konfiguration temporär anpasst, das Repository klont und den Inhalt in einen Zielordner verschiebt – ein einfacher und effizienter Ansatz für serverseitige Automatisierungen.
Für die Automatisierung eines Git-Pulls aus einer PHP-Datei ist ein strukturierter Ansatz erforderlich: Zunächst wird ein privater SSH-Schlüssel generiert, der im Ziel-Repository hinterlegt wird, um den Zugriff zu ermöglichen. Dies erfolgt über den Befehl ssh -T [email protected] -i id_autossh_a_b
, wobei der Schlüssel im Repository unter Einstellungen > Deploy Keys eingetragen werden muss.
> ssh -T [email protected] -i id_autossh_a_b
> key eintragen: https://github.com/{git_username}/{repositorie_name}/settings/keys
Um sicherzustellen, dass die benötigten ausführbaren Dateie (git,
) korrekt aufgerufen wird, muss der absolute Pfad über den Befehl whereis ermittelt und verwendet werden.
> whereis git -> /usr/local/bin/git
Ich habe ein PHP-Skript erstellt, dass einen Git-Pull in einen bestimmten Ordner durchführt:
index.php:
<?php
$name_of_process = 'autossh_a_b';
$remotePath = '{git_username}/{repositorie_name}.git';
$localPath = __DIR__.'/files/tmp'; // reqeuired second directiry (z.B _tmp)
$git_name = 'git';
$git_email = 'test@server';
$privateKey = '~/.ssh/id_'.$name_of_process; //id_test
$commands = array();
$commands[] = "rm -r -f $localPath";
$commands[] = '/usr/local/bin/git config --global core.sshCommand \'ssh -i '.$privateKey.'\'';
$commands[] = '/usr/local/bin/git config --global user.name "'.$git_name.'"';
$commands[] = '/usr/local/bin/git config --global user.email "'.$git_email.'"';
$commands[] = "/usr/local/bin/git clone [email protected]:$remotePath $localPath";
$commands[] = '/usr/local/bin/git config --global --unset user.name';
$commands[] = '/usr/local/bin/git config --global --unset user.email';
$commands[] = '/usr/local/bin/git config --global --unset user.email';
$commands[] = "cd $localPath && mv * .. && rm -r $localPath";
echo implode("<br>",$commands);
echo '<hr>';
foreach($commands as $command){
$output = shell_exec("$command 2>&1");
echo "<pre>$output</pre>";
}
Der untere Teil:
echo implode("<br>",$commands);
echo '<hr>';
foreach($commands as $command){
$output = shell_exec("$command 2>&1");
echo "<pre>$output</pre>";
}
..kann natürlich ersetzt werden sobald es erfolgreich durchläuft mit:
shell_exec(implode(" && ",$commands));
Viel Spass!