# Git自動化部署PHP腳本該如何實現
## 前言
在現代Web開發中,自動化部署已成為提高開發效率、減少人為錯誤的關鍵環節。本文將詳細介紹如何利用Git實現PHP項目的自動化部署,涵蓋從基礎原理到具體實現的完整流程。
## 一、自動化部署的核心概念
### 1.1 什么是自動化部署
自動化部署是指通過預設的腳本或工具,將代碼從版本控制系統(如Git)自動同步到生產或測試服務器,并完成必要的構建、配置和重啟操作的過程。
### 1.2 Git自動化部署的優勢
- **減少人為錯誤**:避免手動復制文件導致的遺漏或錯誤
- **提高效率**:代碼提交后立即自動部署
- **版本可控**:每次部署都對應明確的Git提交記錄
- **快速回滾**:可輕松退回到之前的任一版本
## 二、實現方案設計
### 2.1 整體架構
典型的Git自動化部署包含以下組件:
開發者本地 → Git倉庫(遠程) → Webhook通知 → 部署服務器 → 執行部署腳本
### 2.2 技術選型
1. **Git鉤子**:使用post-receive或post-update鉤子
2. **Webhook**:GitHub/GitLab提供的推送事件通知
3. **部署腳本**:PHP/Shell/Python等編寫的處理邏輯
## 三、基于Git鉤子的實現方案
### 3.1 服務器環境準備
```bash
# 在服務器上創建裸倉庫
mkdir /var/repo/myproject.git
cd /var/repo/myproject.git
git init --bare
在裸倉庫的hooks目錄下創建post-receive文件:
#!/bin/bash
TARGET="/var/www/myproject"
GIT_DIR="/var/repo/myproject.git"
BRANCH="master"
while read oldrev newrev ref
do
# 只部署master分支
if [[ $ref =~ .*/$BRANCH$ ]];
then
echo "Ref $ref received. Deploying ${BRANCH} branch to production..."
git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f $BRANCH
# 執行額外部署命令
cd $TARGET
composer install --no-dev
chown -R www-data:www-data $TARGET
systemctl reload apache2
else
echo "Ref $ref received. Doing nothing: only the ${BRANCH} branch may be deployed."
fi
done
設置執行權限:
chmod +x /var/repo/myproject.git/hooks/post-receive
開發者本地添加遠程倉庫:
git remote add production ssh://user@yourserver.com/var/repo/myproject.git
git push production master
創建PHP腳本(如deploy.php)處理Webhook請求:
<?php
// 驗證密鑰(GitHub/GitLab Secret)
$secret = 'your_webhook_secret';
$headers = getallheaders();
$hubSignature = $headers['X-Hub-Signature-256'] ?? '';
// 驗證簽名
$payload = file_get_contents('php://input');
$calculatedSignature = 'sha256=' . hash_hmac('sha256', $payload, $secret);
if (!hash_equals($calculatedSignature, $hubSignature)) {
http_response_code(403);
die('Invalid signature');
}
// 解析事件
$event = json_decode($payload, true);
$branch = isset($event['ref']) ? substr($event['ref'], 11) : '';
// 只處理master分支的推送
if ($branch === 'master') {
$output = shell_exec('cd /var/www/myproject && git pull 2>&1');
file_put_contents('/var/log/deploy.log', date('[Y-m-d H:i:s]') . " " . $output . "\n", FILE_APPEND);
echo "Deployment successful";
} else {
echo "Skipping non-master branch";
}
#!/bin/bash
# 定義目錄
BLUE_DIR="/var/www/myproject-blue"
GREEN_DIR="/var/www/myproject-green"
CURRENT_LINK="/var/www/myproject"
# 確定當前活動環境
if [[ -L $CURRENT_LINK && $(readlink -f $CURRENT_LINK) == $BLUE_DIR ]]; then
TARGET=$GREEN_DIR
INACTIVE=$BLUE_DIR
else
TARGET=$BLUE_DIR
INACTIVE=$GREEN_DIR
fi
# 同步代碼到非活動環境
git --work-tree=$TARGET --git-dir=/var/repo/myproject.git checkout -f master
# 執行部署后操作
cd $TARGET
composer install --no-dev
npm run production
# 切換符號鏈接
ln -sfn $TARGET $CURRENT_LINK
# 重載PHP-FPM
systemctl reload php-fpm
// 在deploy.php中添加回滾端點
if (isset($_GET['rollback'])) {
$commit = escapeshellarg($_GET['to']);
$output = shell_exec("cd /var/www/myproject && git checkout $commit 2>&1");
// 記錄日志...
}
權限控制:
日志記錄:
# 在部署腳本中添加
exec >> /var/log/deploy.log 2>&1
echo "$(date) - Starting deployment"
敏感信息處理:
# 在部署腳本中添加
find /var/www/myproject -type d -exec chmod 755 {} \;
find /var/www/myproject -type f -exec chmod 644 {} \;
chown -R www-data:www-data /var/www/myproject
# Composer優化安裝
composer install --no-dev --prefer-dist --optimize-autoloader --no-interaction
# NPM處理
npm install --production && npm run prod
# PHP-FPM優雅重啟
sudo -S service php-fpm reload
# 隊列服務重啟
php /var/www/myproject/artisan queue:restart
#!/bin/bash
# laravel-deploy.sh
# 環境變量
PROJECT_DIR="/var/www/myproject"
GIT_REPO="/var/repo/myproject.git"
BRANCH="master"
LOG_FILE="/var/log/laravel-deploy.log"
# 開始日志
echo -e "\n\n[$(date)] ===== 開始部署 =====" >> $LOG_FILE
# 同步代碼
git --work-tree=$PROJECT_DIR --git-dir=$GIT_REPO checkout -f $BRANCH 2>&1 >> $LOG_FILE
# 進入項目目錄
cd $PROJECT_DIR
# 安裝依賴
echo "[$(date)] 安裝Composer依賴..." >> $LOG_FILE
/usr/local/bin/composer install --no-dev --prefer-dist --optimize-autoloader --no-interaction 2>&1 >> $LOG_FILE
# 數據庫遷移
echo "[$(date)] 執行數據庫遷移..." >> $LOG_FILE
php artisan migrate --force 2>&1 >> $LOG_FILE
# 前端編譯
echo "[$(date)] 編譯前端資源..." >> $LOG_FILE
npm install --production 2>&1 >> $LOG_FILE
npm run production 2>&1 >> $LOG_FILE
# 清理緩存
echo "[$(date)] 清理緩存..." >> $LOG_FILE
php artisan config:cache 2>&1 >> $LOG_FILE
php artisan route:cache 2>&1 >> $LOG_FILE
php artisan view:cache 2>&1 >> $LOG_FILE
# 權限設置
echo "[$(date)] 設置權限..." >> $LOG_FILE
chown -R www-data:www-data $PROJECT_DIR 2>&1 >> $LOG_FILE
chmod -R 755 $PROJECT_DIR/storage 2>&1 >> $LOG_FILE
# 重啟服務
echo "[$(date)] 重啟服務..." >> $LOG_FILE
sudo service php-fpm reload 2>&1 >> $LOG_FILE
echo "[$(date)] ===== 部署完成 =====" >> $LOG_FILE
通過本文介紹的方法,您可以構建一個健壯的Git自動化部署流程。實際實施時,建議:
自動化部署不是一蹴而就的過程,需要根據項目需求不斷調整優化。希望本文能為您的PHP項目部署提供有價值的參考。 “`
這篇文章包含了約2800字,采用Markdown格式編寫,涵蓋了Git自動化部署PHP腳本的多種實現方案、安全注意事項和實用技巧。您可以根據實際需求調整具體細節。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。