前言
在現代網站開發中,自動化部署是一個非常重要的環節。本文將介紹如何使用 GitHub Actions 來自動化部署 Hexo 部落格到 Azure Blob Storage,實現推送程式碼即自動更新網站的效果。
什麼是 Azure Blob Storage 靜態網站託管
Azure Blob Storage 提供了靜態網站託管功能,讓您可以直接從儲存帳戶中託管靜態內容(HTML、CSS、JavaScript 和圖片檔案)。這是一個成本效益高且可擴展的解決方案,特別適合託管部落格和靜態網站。
優點
- 成本效益:相比於傳統的網站託管服務,價格更便宜
- 高可用性:Azure 提供 99.9% 的可用性保證
- 全球分發:可以結合 Azure CDN 實現全球快速存取
- 自動擴展:根據流量自動調整資源
設定 Azure Blob Storage
步驟 1:建立儲存帳戶
- 登入 Azure 入口網站
- 點擊「建立資源」
- 搜尋並選擇「儲存帳戶」
- 填寫基本資訊:
- 訂用帳戶
- 資源群組
- 儲存帳戶名稱
- 區域
- 效能:標準
- 備援:LRS(本地備援儲存體)
步驟 2:啟用靜態網站功能
- 在儲存帳戶中,選擇「靜態網站」
- 點擊「已啟用」
- 設定索引文件名稱:
index.html
- 設定錯誤文件路徑:
404.html
- 儲存設定
步驟 3:取得連接字串
- 在儲存帳戶中,選擇「存取金鑰」
- 複製「連接字串」(稍後在 GitHub Secrets 中使用)
設定 GitHub Actions
建立工作流程檔案
在您的 Hexo 專案根目錄中建立 .github/workflows/deploy.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| name: Deploy Hexo Blog to Azure Blob Storage
on: push: branches: - main
jobs: build-and-deploy: runs-on: ubuntu-latest
steps: - name: Checkout repository uses: actions/checkout@v4
- name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm'
- name: Install dependencies run: npm ci
- name: Build Hexo site run: | npx hexo clean npx hexo generate
- name: Deploy to Azure Blob Storage uses: azure/cli@v2 with: inlineScript: | az storage blob upload-batch \ --connection-string "${{ secrets.AZURE_STORAGE_CONNECTION_STRING }}" \ --destination '$web' \ --source './public' \ --overwrite \ --content-type 'text/html' \ --pattern '*.html' az storage blob upload-batch \ --connection-string "${{ secrets.AZURE_STORAGE_CONNECTION_STRING }}" \ --destination '$web' \ --source './public' \ --overwrite \ --exclude-pattern '*.html'
|
設定 GitHub Secrets
- 在 GitHub 專案頁面,點擊「Settings」
- 選擇「Secrets and variables」→「Actions」
- 點擊「New repository secret」
- 名稱:
AZURE_STORAGE_CONNECTION_STRING
- 值:貼上從 Azure 複製的連接字串
優化建議
快取策略
為了提升建置速度,可以在工作流程中加入快取:
1 2 3 4 5 6 7
| - name: Cache dependencies uses: actions/cache@v3 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node-
|
內容類型設定
為不同檔案類型設定正確的 Content-Type:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| - name: Set content types for different file types run: | # HTML files az storage blob upload-batch \ --connection-string "${{ secrets.AZURE_STORAGE_CONNECTION_STRING }}" \ --destination '$web' \ --source './public' \ --pattern '*.html' \ --content-type 'text/html' \ --overwrite az storage blob upload-batch \ --connection-string "${{ secrets.AZURE_STORAGE_CONNECTION_STRING }}" \ --destination '$web' \ --source './public' \ --pattern '*.css' \ --content-type 'text/css' \ --overwrite az storage blob upload-batch \ --connection-string "${{ secrets.AZURE_STORAGE_CONNECTION_STRING }}" \ --destination '$web' \ --source './public' \ --pattern '*.js' \ --content-type 'application/javascript' \ --overwrite
|
監控和除錯
檢查部署狀態
- 在 GitHub 專案中點擊「Actions」頁籤
- 查看最新的工作流程執行狀況
- 點擊具體的執行可以查看詳細日誌
常見問題排除
連接字串錯誤
- 確認 Azure 儲存帳戶的連接字串是否正確
- 檢查 GitHub Secrets 中的設定
權限問題
- 確認儲存帳戶已啟用靜態網站功能
- 檢查 Azure CLI 的權限設定
檔案上傳失敗
- 檢查檔案路徑是否正確
- 確認
public 目錄下有生成的檔案
結論
通過 GitHub Actions 和 Azure Blob Storage 的組合,我們實現了一個高效、成本效益且易於維護的靜態網站部署解決方案。每次推送程式碼到 main 分支,都會自動觸發建置和部署流程,大大提升了開發效率。
這個方案特別適合:
參考資源