Heim  >  Artikel  >  Backend-Entwicklung  >  Stellen Sie GIT-Code automatisch mit PHP bereit

Stellen Sie GIT-Code automatisch mit PHP bereit

WBOY
WBOYOriginal
2016-07-29 09:15:40764Durchsuche

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 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.

Nachdem mir das klar wurde, habe ich mich angemeldet und den vollständigen Pfad gefunden der Git-Binärdatei mit which git, also /full/path/to/bin/gitDer 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>
Es ist auch eine gute Idee, sicherzustellen, dass alle Dateien/Verzeichnisse dieses Eigentum erben, wenn sie von anderen erstellt werden, indem Sie das Gruppen-Sticky-Bit festlegen.

„Host-Schlüsselüberprüfung fehlgeschlagen“

<code data-lang="text">error: cannot open .git/FETCH_HEAD: Permission denied
</code>
Als nächstes müssen Sie einen ersten Git-Pull mit dem Apache-Benutzer durchführen, um sicherzustellen, dass die Fernbedienung zur

Datei des Apache-Benutzers hinzugefügt wird

<code data-lang="text">chown -R ssh_user:www repository/
</code>

<code data-lang="text">chmod -R g+s repository/
</code>
SSH-Schlüssel

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 known_hosts zu verwenden, um die Option

festzulegen, um sie anzuweisen, a zu verwenden Einen bestimmten SSH-Schlüssel, den ich mit dem SSH-Benutzer generiert habe, habe ich nie zum Laufen gebracht, wahrscheinlich weil es viele Regeln gibt, die SSH verwendet, um die Sicherheit eines bestimmten Schlüssels zu bestimmen. Es erfordert einige spezifische Berechtigungen für den Benutzer, der dies versucht Verwenden Sie den Schlüssel.

<code data-lang="text">sudo -u www git pull
</code>

Eine einfachere Möglichkeit, die ich entdeckt habe, bestand darin, dem Apache-Benutzer ein Home-Verzeichnis (via

) und ein zu geben GIT_SSH Verzeichnis und führen Sie dann den ssh -i Befehl als Apache-Benutzer ()

/etc/passwd.sshssh-keygenDadurch 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.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn