前話: 通常狀況,本身在本地開發,代碼改動後要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上去後,線上代碼自動同步了。
另外,也能夠添加釘釘機器人來推送通知;