利用 Coding/GitHub/BitBucket 的 WebHook,推送代碼後自動觸發 PHP 腳本執行 git pull 更新線上項目。核心難點在於 Linux 權限與 SSH 金鑰配置。
<?php
define('PRIVATE_KEY', 'XXXXXXXXXXXXXXXXxxx');
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_REQUEST['thing'] === PRIVATE_KEY) {
echo shell_exec("/full/path/to/bin/git pull 2>&1");
}
?>
Apache 用戶 www 的 PATH 不含 git。用 which git 獲取完整路徑(如 /usr/bin/git),腳本中使用絕對路徑。並加 2>&1 將 STDERR 導向 STDOUT 捕獲錯誤信息。
chown -R ssh_user:www repository/ chmod -R g+s repository/ # 設置 SGID,新文件繼承組所有權
以 Apache 用戶執行一次 git pull 將遠程主機加入 known_hosts:
sudo -u www git pull
為 Apache 用戶生成專用金鑰:
sudo -u www ssh-keygen -t rsa
將生成的公鑰添加到 Git 平台的 Deploy Keys(僅讀權限)。避免使用 GIT_SSH 環境變數指定金鑰,權限控制極其繁瑣。
推送 → WebHook POST → PHP 驗證 Token → shell_exec(git pull) → 權限正確 → 代碼更新成功。