前話: 一般情況,自己在本地開發,代碼改動后要push放到線上去看效果,但是我們還要到線上環境手動拉取代碼庫 git pull 下來, 一來一回太麻煩了。
現在用webhook就可以實現本地開發,push代碼到GitHub上面時,線上自動同步更新的代碼,省事多了。
1、首先在GitHub或者碼雲這些代碼托管庫上面添加好自己的項目;
2、把本地寫好的兩個文件上傳到代碼庫, sync.php 和 sync.sh ; (其實就是本地push后自動請求sync.php, 里面執行 sync.sh, 最終就是執行 git pull 的命令)
sync.php:
<?php echo '進來了...'; exec('sh sync.sh'); ?>
sync.sh: (我用的是默認的master分支,其它分支可自己定)
#!/bin/bash /usr/bin/git pull origin master
3、 vim /usr/local/php/etc/php.ini # 找到 disable 刪除 exec(用 linux命令 /disable, 然后 按n 往下找),因為這個函數默認被禁用了
vim /etc/passwd # 將 www 的 /sbin/nologin 改為 /bin/bash , www設置為登錄
4、因為,我們的PHP執行其實是使用的www用戶。默認都是www用戶,PHP中執行git也是使用www用戶。
所以,在線上環境首先要 切換到 www 用戶(命令:su www);
5、設置公鑰, 命令: 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代碼庫,添加后公鑰管理那里。
6、在 /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;
7、給線上的 sync.php 和 sync.sh 加執行權限 ; chmod +x sync.php ; chmod +x sync.sh
8、上面第4點說到了執行的是www用戶,要讓www用戶免密碼執行git命令才可以;
通過 vim /etc/sudoers 進去修改, 加入
www ALL=NOPASSWD:/usr/bin/git
9、最后一步, 在你的項目里添加webhook地址, http:XXX.com/sync.php 這種可以訪問的, 就是訪問sync.php 這個文件,讓它去代碼庫自動拉取代碼。
這樣就可以在本地開發, push上去后,線上代碼自動同步了。
另外,也可以添加釘釘機器人來推送通知;