As some have noticed after trying this, if you use php exec()
, it turns out that solving for permissions is not that simple.
The user that will execute the command might not be your own, but www-data
or apache
.
If you have root/sudo access, I recommend you read this Jonathan's blog post
When you aren't allowed/can't solve permissions
My solution was a bit creative. I noticed I could create a script under my username with a loop and git pull would work fine. But that, as pointed out by others, bring the question of running a lot of useless git pull
every, say, 60 seconds.
So here the steps to a more delicate solution using webhooks:
- deploy key: Go to your server and type:
ssh-keygen -t rsa -b 4096 -C "deploy"
to generate a new deploy key, no need write-permissions (read-only is safer). Copy the public key to your github repository settings, under "deploy key".
- Webhook: Go to your repository settings and create a webhook. Lets assume the payload address is
http://example.com/gitpull.php
- Payload: create a php file with this code example bellow in it. The purpose of the payload is not to
git pull
but to warn the following script that a pull
is necessary. Here the simple code:
gitpull.php:
<?php
/* Deploy (C) by DrBeco 2021-06-08 */
echo("<br />\n");
chdir('/home/user/www/example.com/repository');
touch(GITPULLMASTER);
?>
- Script: create a script in your preferred folder, say,
/home/user/gitpull.sh
with the following code:
gitpull.sh
#!/bin/bash
cd /home/user/www/example.com/repository
while true ; do
if [[ -f GITPULLMASTER ]] ; then
git pull > gitpull.log 2>&1
mv GITPULLMASTER GITPULLMASTER.`date +"%Y%m%d%H%M%S"`
fi
sleep 10
done
- Detach: the last step is to run the script in detached mode, so you can log out and keep the script running in background.
There are 2 ways of doing that, the first is simpler and don't need screen software
installed:
disown:
- run
./gitpull.sh &
to put it in background
- then type
disown -h %1
to detach and you can log out
screen:
- run
screen
- run
./gitpull.sh
- type
control+a d
to detach and you can log out
Conclusion
This solution is simple and you avoid messing with keys, passwords, permissions, sudo, root, etc., and also you prevent the script to flood your server with useless git pull
s.
The way it works is that it checks if the file GITPULLMASTER
exists; if not, back to sleep. Only if it exists, then do a git pull
.
You can change the line:
mv GITPULLMASTER GITPULLMASTER.
date +"%Y%m%d%H%M%S"`
to
rm GITPULLMASTER
if you prefer a cleaner directory. But I find it useful for debug to let the pull date registered (and untracked).