Ich habe kürzlich das Code-Hosting von Coding verwendet und die automatische Bereitstellung von WebHook eingerichtet. Der Prozess ist ziemlich schwierig, hauptsächlich weil ich die Berechtigungskontrolle von Linux immer noch nicht verstehe, aber zum Glück habe ich es herausgefunden Ich teile einen Artikel, der mir am meisten geholfen hat. Der Originaltext ist nicht gut und ich kann ihn kaum verstehen.
Link zum Originaltext : http://jondavidjohn.com/git-pull-from-a-php-script-not-so-simple/
Ich hatte vor, ein Repository (gehostet auf BitBucket) einzurichten, um einen Pull-On zu initiieren ein Entwicklungsserver, wenn neue Commits hochgeschoben werden.
Es schien ein recht einfacher Prozess zu sein, der eine POST-Anfrage als Post-Receive-Hook auslöst um einen zufälligen Token zu überprüfen und dann das zu initiieren git pull
. Sah ungefähr so aus...
<code data-lang="php"><span><?php <span>define<span>(<span>'PRIVATE_KEY'<span>, <span>'XXXXXXXXXXXXXXXXxxx'<span>); <span>if <span>(<span>$_SERVER<span>[<span>'REQUEST_METHOD'<span>] <span>=== <span>'POST' <span>&& <span>$_REQUEST<span>[<span>'thing'<span>] <span>=== <span>PRIVATE_KEY<span>) <span>{ <span>echo <span>shell_exec<span>(<span>"git pull"<span>); <span>} </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
War am Ende nicht so einfach wie Ich hatte damit gerechnet...
Es gab ein paar Überlegungen, die ich nicht berücksichtigt habe. Wenn ich sie hier dokumentiere, können Sie hoffentlich einige Hindernisse bei dem Versuch, so etwas einzurichten, vermeiden.
(Übergangene) Überlegungen
die Binärdatei (git
in diesem Fall)
Der Benutzer, der die Ausführung versucht git pull
ist der Apache-Benutzer (www
in unserem Fall). Dieser Benutzer hatte nicht zufällig git
in seinem Pfad.
Es hat eine Weile gedauert, dies herauszufinden, da die Nachdem mir das klar wurde, habe ich mich angemeldet und den vollständigen Pfad gefunden der Git-Binärdatei mit Eine weitere Überlegung, die durch die Ausführung dieses Befehls durch den Apache-Benutzer hervorgerufen wird, ist der SSH-Schlüssel, den er für die Kommunikation mit der Fernbedienung verwendet Repository. Zuerst habe ich versucht, die Umgebungsvariable Eine einfachere Möglichkeit, die ich entdeckt habe, bestand darin, dem Apache-Benutzer ein Home-Verzeichnis (via ) und ein zu geben exec()
-Funktionsfamilie einfach stillschweigend fehlschlägt, weil sie nur STDOUT und nicht STDERR meldet. Damit die Funktion STDERR meldet, können Sie sie weiterleiten in STDOUT, indem Sie 2->&1</span>
am Ende Ihres Befehls hinzufügen.which git
, also /full/path/to/bin/git
Der Apache-Benutzer benötigt außerdem Lese- und Schreibzugriff auf das gesamte Repository. <code data-lang="php"><span><?php
<span>...
<span>echo <span>shell_exec<span>(<span>"/full/path/to/bin/git pull 2>&1"<span>);
<span>...
</span></span></span></code>
<code data-lang="text">error: cannot open .git/FETCH_HEAD: Permission denied
</code>
<code data-lang="text">chown -R ssh_user:www repository/
</code>
<code data-lang="text">chmod -R g+s repository/
</code>
known_hosts
zu verwenden, um die Option <code data-lang="text">sudo -u www git pull
</code>
GIT_SSH
Verzeichnis und führen Sie dann den ssh -i
Befehl als Apache-Benutzer ()/etc/passwd
.ssh
ssh-keygen
Dadurch werden die Schlüssel erstellt und mit den richtigen Berechtigungen an ihrem erwarteten Ort abgelegt.Dann habe ich den Schlüssel hinzugefügt als schreibgeschützter Schlüssel für das BitBucket-Repository und alles funktionierte wie erwartet.www
Das Obige stellt die Verwendung von PHP zur automatischen Bereitstellung von GIT-Code vor, einschließlich einiger Aspekte des Inhalts. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.