前话: 通常状况,本身在本地开发,代码改动后要push放到线上去看效果,可是咱们还要到线上环境手动拉取代码库 git pull 下来, 一来一回太麻烦了。php
如今用webhook就能够实现本地开发,push代码到GitHub上面时,线上自动同步更新的代码,省事多了。linux
一、首先在GitHub或者码云这些代码托管库上面添加好本身的项目;git
二、把本地写好的两个文件上传到代码库, sync.php 和 sync.sh ; (其实就是本地push后自动请求sync.php, 里面执行 sync.sh, 最终就是执行 git pull 的命令)web
sync.php:vim
<?php echo '进来了...'; exec('sh sync.sh'); ?>
sync.sh: (我用的是默认的master分支,其它分支可本身定)bash
#!/bin/bash /usr/bin/git pull origin master
三、 vim /usr/local/php/etc/php.ini # 找到 disable 删除 exec(用 linux命令 /disable, 而后 按n 往下找),由于这个函数默认被禁用了ssh
vim /etc/passwd # 将 www 的 /sbin/nologin 改成 /bin/bash , www设置为登陆函数
四、由于,咱们的PHP执行实际上是使用的www用户。默认都是www用户,PHP中执行git也是使用www用户。spa
因此,在线上环境首先要 切换到 www 用户(命令:su www);3d
五、设置公钥, 命令: ssh-keygen -t rsa -b 4096 -C "your_email@example.com", 这里填写本身的邮箱帐号,弹出:Enter file ... key (/home/www/.ssh/id_rsa):, 而后一直 Enter 就好,结束后会在 /home/www/.ssh 这个目录下面生成一个公钥文件 id_rsa.pub,打开复制内容到GitHub代码库,添加后公钥管理那里。
六、在 /home/wwwroot/目录下面克隆出本身的项目,git clone git@XXX/test.git;
若是执行报错这种:
The authenticity of host 'gitee.com (120.55.226.24)' can't be established.
ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
ECDSA key fingerprint is MD5:27:e5:d3:f7:2a:9e:eb:6c:93:cd:1f:c1:47:a3:54:b1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitee.com,120.55.226.24' (ECDSA) to the list of known hosts.
再执行一次克隆就好 git clone git@XXX/test.git;
七、给线上的 sync.php 和 sync.sh 加执行权限 ; chmod +x sync.php ; chmod +x sync.sh
八、上面第4点说到了执行的是www用户,要让www用户免密码执行git命令才能够;
经过 vim /etc/sudoers 进去修改, 加入
www ALL=NOPASSWD:/usr/bin/git
九、最后一步, 在你的项目里添加webhook地址, http:XXX.com/sync.php 这种能够访问的, 就是访问sync.php 这个文件,让它去代码库自动拉取代码。
这样就能够在本地开发, push上去后,线上代码自动同步了。
另外,也能够添加钉钉机器人来推送通知;