介紹使用git的webhook功能 自動更新php項目代碼 以及遇到的坑

作爲一名php愛好者,最近在部署項目時想嘗試下用git自動部署的方案。以往用手動發包更新的方式實在太落伍了。

藉着git的熱度,本人發現git提供webhook的方式可以在服務器上直接拉取代碼實現更新,決定一試。

首先編寫一個簡單webhook.php的文件放在網站的根目錄用來被git網站請求。代碼如下:

$cmd = "cd /usr/share/path && git pull &&  echo 'success' ";  //關鍵命令 /usr/share/path爲項目倉庫目錄
echo shell_exec('php -v') ."<br>";  //用來測試exec命令是否有權限執行
echo shell_exec('whoami') ."<br>";  //用來查看當前執行者得用戶名稱
var_dump(shell_exec($cmd)); //返回成功還是null

可以被git訪問的地址假設爲http://www.aaa.com/webhook.php

然後用ssh使用root賬號登錄服務器,在網站目錄下執行cli 命令php webhook.php成功完成了git的代碼拉去更新,此root賬號已配置過git公鑰。

接着用瀏覽器方式訪問網站地址 /webhook.php文件,這時var_dump返回結果爲null,很明顯沒有執行成功,執行exec結果:

  • 判斷php.ini中是否禁用了exec 等命令,這裏沒有禁用exec,因此忽略這條
  • 網站環境使用centos7 nginx+php-fpm +php.7.2 的配置,使用 ps aux | grep php查看php-fpm的用戶爲apache。在php-fpm 下www.conf中發現 指定的group 和user 都爲 apache

因此編輯 vim etc/sudoer這個文件。目的是給apache用戶的最大的執行權限

#Allow root to run any commands anywhere 
root    ALL=(ALL)   ALL
apache  ALL=(ALL)   ALL   //找到這行 後添加apache用戶

完成了上述檢查後 本人再次用瀏覽器訪問網站地址 /webhook.php文件,仍然返回null。 驚奇到懷疑人生。

於是乎本人去掉了命令中的 git pull 這行,然後執行程序,發現成功返回了信息。 因此判斷 是apache用戶沒有git權限導致,拉取失敗。

由於apache用戶是系統爲進程創建的用戶 無法直接登錄, 所以無法直接使用apache登錄並創建ssh密鑰,切換apache賬號時會提示 This accountis currently not available.

因此本人改變思路,將root下.ssh目錄複製到本地,此目錄下密鑰之前已配置成功,然後查看 /etc/passwd 文件 ,發現了這行 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

也就是說apache的用默認路徑是/usr/share/httpd目錄, 所以把本地.ssh文件上傳到該目錄下使該apache用戶也有權限訪問git。最後使用瀏覽器訪問webhook.php,提示成功!大功告成

另外值得一提: 網站項目中.git 目錄下的FETCH_HEAD 文件 需要給apache用戶讀寫權限,否則也會因爲權限不足而報錯。

本文原創於www.7php.cn

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章