FTP 上傳已死!資深工程師帶你搞懂 WordPress CI/CD,用 GitHub Actions 打造不加班的自動部署流水線
嗨,我是浪花科技的 Eric。身為一個在程式碼海裡打滾多年的工程師,我還記得那些年,我們用 FTP 手動上傳檔案的日子。夜深人靜,客戶一個 call 來說網站掛了,你睡眼惺忪地打開 FTP client,一個一個比對檔案,然後心驚膽顫地按下「覆蓋」。上傳到一半,網路斷了、手滑傳錯資料夾了… 那種冷汗直流的感覺,簡直是工程師的共同夢魘。說真的,如果你現在還在用 FTP 部署,那不叫懷舊,那叫自虐啊!
今天,我就要帶你告別這種石器時代的工作流程,踏入現代化的開發領域:CI/CD 自動部署。特別是利用 GitHub Actions 這個強大又免費的工具,我們可以為 WordPress 專案打造一條全自動、零失誤的部署流水線。從此以後,你只需要優雅地 `git push`,剩下的髒活累活,就交給機器人去辦吧!
告別 FTP 時代的眼淚:為什麼你需要 CI/CD 自動部署?
你可能會想:「我的網站就幾頁,FTP 拖一拖也很快啊,有必要搞這麼複雜嗎?」問得好!這就像問「有計算機為什麼要學心算」一樣。短期看來,手動操作似乎直觀,但長期而言,自動化帶來的效益是壓倒性的。讓我這個老司機跟你囉嗦幾句,你就知道為什麼了。
- 降低人為失誤: 手動上傳最大的敵人就是「人」。你會忘記上傳某個檔案、傳錯版本、甚至刪錯東西。CI/CD 流程是標準化、程式化的,機器人不會累、不會恍神,每次都精準執行你設定好的劇本。
- 版本控制與追溯: 搭配 Git,每一次的部署都對應到一個明確的 commit。網站出問題?你可以立刻知道是哪一次的程式碼變更造成的,甚至可以快速回滾到上一個穩定版本。用 FTP?你可能連自己半小時前上了什麼檔案都忘了。
- 提升效率與速度: `git push` 之後,泡杯咖啡回來,網站就更新好了。你省下的時間,可以用來寫更有價值的程式碼,而不是盯著 FTP 的上傳進度條發呆。對整個團隊來說,這意味著更快的迭代速度和更高的產出。
- 更安全的部署: 你不需要把伺服器的密碼告訴團隊裡的每個人。透過 GitHub Actions 的 Secrets 管理,我們可以將敏感資訊(如 SSH 私鑰)加密儲存,只有 Action 的執行環境能存取,大大提升了安全性。
總之,導入 CI/CD 不只是換個工具,更是開發思維的升級。它強迫你用更嚴謹、更專業的方式來管理你的專案,這對個人成長和專案的健康度都是百利而無一害。
CI/CD 是什麼鬼?GitHub Actions 又扮演什麼角色?
好了,我知道你已經被我說服了。但 CI/CD 這些縮寫聽起來很嚇人,別怕,我用白話文幫你拆解一下。
CI (持續整合 – Continuous Integration) 的核心精神
CI 的重點在於「整合」。想像一下,團隊裡有多個工程師在開發不同的功能,大家寫完程式碼後,會頻繁地將自己的變更合併(merge)到主要的分支(例如 `main` 或 `develop`)。CI 的流程會在每次合併時自動觸發,執行一些檢查工作,例如跑自動化測試、檢查程式碼風格等,確保新的程式碼沒有「搞壞」原有的功能。它的核心理念就是「儘早發現問題,儘早解決」。
CD (持續部署 – Continuous Deployment) 的最後一哩路
當 CI 的檢查都通過後,就輪到 CD 上場了。CD 負責將這些「確認沒問題」的程式碼,自動地部署到伺服器上,讓使用者能夠用到最新的版本。從程式碼合併到實際上線,整個過程全自動化,這就是持續部署的終極目標。
GitHub Actions:你的免費專案管家
那 GitHub Actions 是什麼?它就是 GitHub 內建的 CI/CD 工具。你只需要在你的專案根目錄下,建立一個 `.github/workflows` 資料夾,然後在裡面寫一個 YAML 格式的設定檔(我們稱之為 workflow),告訴 GitHub Actions:「嘿!當我推送到 `main` 分支時,請幫我做 A、B、C 這三件事。」而 A、B、C 就可以是我們前面提到的測試、打包、部署等步驟。它就像一個任勞任怨的專案管家,24 小時待命,幫你處理所有自動化的雜事。
實戰開始!打造你的第一個 WordPress 自動部署流水線
理論說完了,來點硬核的。我們現在就一步步建立一個當你 `push` 程式碼到 `main` 分支時,會自動將檔案同步到你的主機的 workflow。
行前準備:你需要這些『裝備』
- 一個存放 WordPress 專案的 GitHub Repository(私有或公開都可以)。
- 你的網站主機的 SSH 存取權限。你需要能夠透過 SSH Key 免密碼登入。
- 對 Git 的基本操作有概念(`add`, `commit`, `push`)。
步驟一:設定 GitHub Secrets,把你的鑰匙藏好
我們絕對不能把伺服器的 IP、使用者名稱、SSH 私鑰這些敏感資訊直接寫在程式碼或 workflow 檔案裡,這等於是把家裡鑰匙掛在門口。GitHub 提供了「Secrets」功能讓我們安全地儲存這些資訊。
到你的 GitHub repo > Settings > Secrets and variables > Actions,點擊「New repository secret」來新增以下幾個秘密:
SERVER_HOST: 你主機的 IP 位址或網域名稱。SERVER_USERNAME: 你用來登入主機的使用者名稱(例如 `ubuntu`)。SSH_PRIVATE_KEY: 用來登入主機的 SSH 私鑰。請將你本機 `.ssh/id_rsa` 檔案的內容完整複製貼上。DEPLOY_PATH: 你 WordPress 專案在主機上的絕對路徑,例如/var/www/html/your-site。
步驟二:撰寫 Workflow 劇本 (.yml 檔)
在你的專案根目錄下,建立資料夾與檔案:.github/workflows/deploy.yml。然後把下面的程式碼貼進去。
# .github/workflows/deploy.yml
name: Deploy WordPress to Production
on:
push:
branches:
- main # 當 main 分支有 push 事件時觸發
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: checkout code
uses: actions/checkout@v3 # 步驟一:把 repo 的程式碼抓下來
- name: Setup SSH Keys
run: |
mkdir -p ~/.ssh/
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
- name: Install Dependencies with Composer
run: composer install --no-dev --optimize-autoloader
# 如果你的專案有用到 Composer,這一步會安裝 PHP 相依套件
# --no-dev 表示不安裝開發用的套件
- name: Deploy files via rsync
run: |
rsync -avz --delete \
--exclude='.git/' \
--exclude='.github/' \
--exclude='wp-config.php' \
--exclude='node_modules/' \
./ ${{ secrets.SERVER_USERNAME }}@${{ secrets.SERVER_HOST }}:${{ secrets.DEPLOY_PATH }}
工程師小囉嗦時間: 這段 YAML 碼到底在幹嘛?
name: 這個 workflow 的名字,會顯示在 GitHub Actions 的頁面上。on: 定義觸發條件。這裡是當main分支有push事件時觸發。jobs: 定義要執行的工作。這裡我們只有一個叫做deploy的工作。runs-on: 指定這個工作要在什麼樣的虛擬環境執行,ubuntu-latest是最常用的。steps: 這裡就是重頭戲,定義執行的每一個步驟。- Checkout Code: 使用官方的
actions/checkout@v3action,把你的專案程式碼下載到虛擬環境中。 - Setup SSH Keys: 這一步非常關鍵。它會讀取我們前面設定的
SSH_PRIVATE_KEY這個 secret,並把它寫入虛擬環境的~/.ssh/id_rsa檔案中,這樣後續的 rsync 才能免密碼登入你的主機。 - Install Dependencies: 如果你的外掛或主題是透過 Composer 管理的,這一步會自動安裝。記得加上
--no-dev,生產環境不需要測試工具。 - Deploy files via rsync: 這是部署的核心。
rsync是一個強大的檔案同步工具。-avz: 常用參數,代表歸檔模式、詳細輸出、壓縮傳輸。--delete: 這個超重要!它會刪除目標主機上有,但來源(你的 Git Repo)沒有的檔案。這樣可以確保主機上的檔案跟你的 Repo 永遠保持同步,不會留下舊的垃圾檔案。--exclude: 排除不想上傳的檔案或資料夾。像.git,.github這些版本控制的設定檔,以及最重要的wp-config.php,絕對不能上傳!
把這個檔案 commit 並 push 到你的 `main` 分支後,就可以到 GitHub repo 的「Actions」分頁,親眼見證你的第一個自動化部署流程跑起來啦!
進階思考:不只是複製貼上,打造『健壯』的部署流程
上面的流程已經能動了,但一個專業的工程師不會只滿足於「能動」。我們還要思考如何讓它更健壯、更安全。
`wp-config.php` 的愛恨情仇:如何優雅管理設定檔?
我們已經在 rsync 中排除了 `wp-config.php`,這是正確的第一步。因為這個檔案包含了資料庫密碼等敏感資訊,絕對不能進版控。那伺服器上的 `wp-config.php` 怎麼來?最佳實踐是:在伺服器上手動建立好一份 `wp-config.php`,它會永遠待在那裡,不受我們部署流程的影響。
部署後的儀式感:清除快取與資料庫更新
檔案上傳完就沒事了嗎?當然不是!很多時候我們需要做一些後續處理,例如:
- 清除 WordPress 的物件快取 (Object Cache)。
- 清除頁面快取 (Page Cache) 外掛的快取。
- 如果外掛有更新,可能需要執行資料庫更新。
這些操作的最佳工具就是 WP-CLI。我們可以在 rsync 後面再加一個 step,透過 SSH 遠端執行 WP-CLI 指令:
- name: Clear Cache and Update DB
run: |
ssh ${{ secrets.SERVER_USERNAME }}@${{ secrets.SERVER_HOST }} "cd ${{ secrets.DEPLOY_PATH }} && wp cache flush && wp core update-db"
這樣一來,每次部署後,網站的快取都會被清空,確保使用者能看到最新的內容。
結論:自動化不是終點,而是新旅程的起點
從手動 FTP 到自動化 CI/CD,這不僅僅是技術上的轉變,更是工作心態的革新。它讓你從重複的、易錯的勞動中解放出來,專注於創造性的工作。今天我們介紹的只是一個基礎的部署流程,但它已經為你打開了 DevOps 的大門。你可以基於這個流程,繼續加上自動化測試、多環境部署(開發、測試、正式)、零停機部署等更進階的玩法。
別再猶豫了,今天就動手把你的專案也加上自動部署吧!告別半夜上傳檔案的恐懼,擁抱 `git push` 帶來的從容與優雅。相信我,一旦你體驗過自動化的甜美,就再也回不去了。
當然,打造一套真正企業級的 CI/CD 流水線,可能還會遇到資料庫遷移、環境變數管理等更複雜的挑戰。如果你在實作中遇到瓶頸,或是希望為你的團隊導入更完善的 DevOps 解決方案,浪花科技的團隊擁有豐富的實戰經驗。我們樂於協助你打造穩定、高效的開發與部署流程。
準備好讓你的開發流程升級了嗎?歡迎點擊這裡,填寫表單與我們聯繫,讓我們聊聊如何讓你的專案起飛!
延伸閱讀
- 告別FTP手動上傳惡夢!資深工程師手把手搞定 WordPress CI/CD,從 GitHub Actions 到資料庫遷移全攻略
- 不只是上傳!打造 WordPress『零停機』CI/CD 部署流水線:GitHub Actions 進階實戰
- 終結滑鼠手!資深工程師的 WP-CLI 神兵利器,讓你的 WordPress 管理效率原地起飛!
常見問題 (FAQ)
Q1: 為什麼我需要為 WordPress 網站設定 CI/CD 自動部署?
A1: 最主要的好處是為了提升效率與穩定性。CI/CD 可以將手動、重複且容易出錯的 FTP 上傳流程自動化,確保每次部署的一致性。搭配 Git 版本控制,你可以輕鬆追溯每次的變更,並在出問題時快速回滾,這對於個人專案維護或團隊協作都是一大福音。
Q2: GitHub Actions 是免費的嗎?我的小型專案適合使用嗎?
A2: 是的,GitHub Actions 對於公開的 Repository 是完全免費的,對於私有的 Repository 每月也有慷慨的免費額度(通常是 2000 分鐘),這對絕大多數中小型 WordPress 專案來說綽綽有餘。所以,無論專案大小,都非常推薦使用它來建立自動化流程。
Q3: 在部署流程中,最重要的安全考量是什麼?
A3: 最關鍵的安全考量是絕對不要將任何敏感資訊(如資料庫密碼、SSH 私鑰、API Keys)直接寫在程式碼或 workflow 檔案中。務必使用 GitHub Actions 的 Secrets 功能來加密儲存這些資訊。同時,也要確保在部署時排除了像 `wp-config.php` 這類型的設定檔,避免敏感資訊外洩。
Q4: 除了檔案同步,CI/CD 還能為 WordPress 做些什麼?
A4: 檔案同步只是 CD 的一部分。一個完整的 CI/CD 流程還可以包含:自動安裝 Composer/NPM 相依套件、編譯前端資源 (Sass/JS)、圖片壓縮、執行自動化測試、部署後自動清除快取、發送部署成功/失敗的通知到 Slack 或 Email 等。可能性非常多,可以根據你的專案需求客製化整個流程。






