2016-06-10 3 views
4

J'ai créé un webhook dans mon référentiel github qui affiche l'URL du hook sur mon serveur live pour exécuter la commande pull pour mettre à jour mes fichiers repo sur le serveur.commande 'git pull' fonctionne à partir du terminal mais pas avec php shell_exec() via le dépôt git hook

Le problème est le fichier de crochet que j'ai créé est dans le /var/www/site/web/hookfile.php (i me demande de poste va là. Recevais la réponse du corps aussi)

et mes fichiers repo sont dans/var/www/git-repo/

ne pas mettre à jour le git-repo quand je pousse quelque chose dans mon dépôt github. Je lance cette commande en utilisant le terminal et son fonctionnement.

cd /var/www/git-repo && git pull 

Mais dans mon php fichier son ne fonctionne pas

shell_exec('cd /var/www/git-repo && git pull') 
+0

Qu'est-ce que shell_exec renvoyant? –

+0

rien. aucune erreur @JonStirling –

+0

Rien? Comme dans le retour de «null»? –

Répondre

5

shell_exec() DEFA en silence, car seul rapport STDOUT et non STDERR.

Essayez avec:

echo shell_exec("cd /var/www/git-repo && /full/path/to/bin/git pull 2>&1"); 

est Normalement, une erreur d'autorisation, et pourrait être corrigé en ajoutant l'autorisation à l'utilisateur d'exécuter php

chown -R www-agent:www-agent repository/ 

Mais pourrait être aussi une erreur de connexion (apache?) vers le référentiel distant (authentification, ssh-keys, ...).

+0

chemin complet où mon /.git est situé? @dario –

+0

oui @ harish-kumar. vous pouvez exécuter 'quel git' dans un terminal pour l'obtenir – Dario

+1

obtenir cette erreur: ne peut pas ouvrir .git/FETCH_HEAD: Autorisation refusée –

0

I d'abord dans votre fichier php exécuter un test contre votre instance de serveur pour obtenir les messages d'erreur de sortie à l'écran parce que exec() famille de fonctions échouent simplement en silence et ne STDOUT rapport et non STDERR:

echo shell_exec("cd /website/root/htdocs && git checkout . && git status 2>&1"); 

dans mon cas cela a jeté une erreur qu'il ne pouvait pas trouver la commande git en raison de l'absence de chemin binaire défini pour l'utilisateur apache. Par conséquent, un chemin complet doit être fourni au binaire de git. Il peut être obtenu en trouvant manuellement ou en cours d'exécution dans la coquille:

'which git' 

est rentré (encore appelé YOU_FULL_GIT_BINARY_PATH_HERE):

/usr/local/git/bin/git 

un chemin complet avec la commande git par exemple, '/ usr/local/git/bin/git status' exécute maintenant bien les commandes git.

Une autre chose est de s'assurer que l'utilisateur de votre serveur Web dispose de suffisamment d'autorisations pour lire/écrire dans votre dossier/fichiers. J'ai mis le mien à la propriété par l'utilisateur apache (Centos 6.8 d'autres versions pourraient être www: www ou www-data: www-data, etc.):

chown -R apache:apache YOUR_WEB_OR_REPO_FODLER 

Afin d'assurer tous les fichiers nouvellement ajoutés héritent des autorisations correctes run:

chmod -R g+s YOUR_WEB_OR_REPO_FODLER 

Ce qui précède devrait obtenir que votre script exécute des commandes maintenant. Bien qu'il ne surmonte pas l'invite de mot de passe git pour utiliser la commande 'git pull' pour un utilisateur git défini dans votre fichier YOUR_WEB_OR_REPO_FODLER/.git/config.Exécution de commande ci-dessous à l'intérieur repo:

git config credential.helper store 

command vous demandera le mot de passe et vous permettent de stocker localement. Veuillez noter que votre mot de passe stocké ne sera pas crypté et protégé uniquement par le système de fichiers, par ex. dans /root/.git-credentials. Cela permettra de lancer 'git pull' sans demander de mot de passe. Il n'est pas idéal pour mon environnement d'intégration continue entièrement automatisé de déployer des tests VPS à la demande, car il faut saisir manuellement au moins une fois l'utilisateur git (défini dans le fichier .git/config git).

Depuis mon environnement doit toujours fonctionner sur le code d'origine de la télécommande/la copie maître Je suis également en cours d'exécution

/YOU_FULL_GIT_BINARY_PATH_HERE/git checkout . 

avant d'appeler « git pull » pour assurer les changements locaux sont perdus à jamais alternativement faire un redémarrage à froid au lieu d'utiliser :

/YOU_FULL_GIT_BINARY_PATH_HERE/git fetch origin 
/YOU_FULL_GIT_BINARY_PATH_HERE/git reset --hard origin/master