Node.js: 使用 GitHub Actions 部署

學習如何利用 GitHub Actions 部署您的 Node.js 程式碼

👋 歡迎來到 Stackhero 文檔!

Stackhero 提供一個即用型的 Node.js 雲端 解決方案,帶來多項好處,包括:

  • 只需一個簡單的 git push,即可在幾秒鐘內 部署您的應用程式。
  • 使用您自己的域名,並享受 HTTPS 證書的自動配置,增強安全性。
  • 享受自動備份一鍵更新,以及簡單、透明且可預測的定價,讓您安心無憂。
  • 憑藉專用的私人 VM,獲得最佳的性能和強大的安全性

節省時間簡化您的生活:只需 5 分鐘即可嘗試 Stackhero 的 Node.js 雲端託管 解決方案!

GitHub Actions 讓您可以輕鬆自動化各種任務,例如將 Node.js 程式碼部署到生產伺服器。這份指南會逐步說明,如何利用 GitHub Actions 安全可靠地將您的 Node.js 應用程式部署到 Staging 及 Production 環境。

我們建議您維護兩個分支:stagingproduction。當您將程式碼推送到這兩個分支時,您的變更會自動部署到對應的 Stackhero 服務。

擁有 staging 實例並非強制。 您亦可僅使用 production 實例來跟隨本指南。不過,為了讓部署流程更順暢並在正式上線前建立信心,強烈建議同時維護 staging 及 production 環境。 這種做法在業界非常普遍,有助於避免常見的部署問題。

在開始之前,請確保您已擁有 GitHub 帳戶,以及一個託管您 Node.js 程式碼的 repository。

首先,請登入您的 Stackhero 控制台,並建立兩個 Stackhero 服務:一個用於 staging,一個用於 production。為了方便辨識,您可以將這兩個服務分別命名為「Staging」及「Production」。

如果您尚未擁有 Stackhero 帳戶, 您可以在兩分鐘內免費註冊,並只需幾個步驟即可設定您的 Node.js 雲端服務

Node.js 服務範例Node.js 服務範例

SSH 金鑰讓 GitHub Actions 在部署程式碼時能安全地連接到您的 Node.js 服務。這是保護您 Stackhero 服務的重要步驟。

在您的電腦上,您可以使用以下指令產生新的 SSH 金鑰:

ssh-keygen -C "" -f /tmp/ssh_key -N ""

要查看剛剛產生的公鑰,請執行:

cat /tmp/ssh_key.pub

接著,請到 Stackhero 控制台,選擇您的 production Node.js 服務,然後點擊 Configure 按鈕。

取得服務設定取得服務設定

請依照以下步驟操作:

  1. SSH public keys 區塊,點擊 Add a public key
  2. Description 欄位輸入 GitHub Action
  3. Key 欄位貼上您剛才複製的公鑰。

取得服務設定取得服務設定

現在,請切換到 GitHub,打開您的專案 repository。點擊 Settings,然後選擇 Environments,再選擇 New environment

設定 GitHub 環境設定 GitHub 環境

Name 欄位輸入「production」,然後確認。

設定環境設定環境

點擊 No restriction 按鈕,然後選擇 Selected branches and tags

設定環境限制設定環境限制

接著點擊 Add deployment branch or tag rule,在 Name pattern 欄位輸入「production」,然後點擊 Add rule

設定環境分支設定環境分支

設定環境分支設定環境分支

Environment secrets 區塊,點擊 Add secret

新增 secret新增 secret

要取得您產生的私鑰,請執行:

cat /tmp/ssh_key

在 GitHub 上,請將 Name 設為 STACKHERO_SSH_PRIVATE_KEY,並將您的私鑰貼到 Value 欄位。

設定 SSH 私鑰 secret設定 SSH 私鑰 secret

然後,在 Environment variables 區塊,點擊 Add variable

設定變數設定變數

Name 設為 STACKHERO_ENDPOINT,並將您的 Node.js 服務 endpoint 貼到 Value 欄位。您可以在 Stackhero 控制台找到這個 endpoint。

設定 endpoint 變數設定 endpoint 變數

如果您已為服務設定自訂網域名稱,請使用您的自訂網域,而非 <XXXXXX>.stackhero-network.com。

為了安全起見,建議您在 Stackhero 及 GitHub 設定完成後,將電腦上的 SSH 金鑰刪除:

rm /tmp/ssh_key /tmp/ssh_key.pub

在您的 Git repository 內,如果還沒有 .github/workflows 目錄,請先建立一個。然後新增一個名為 deploy-to-stackhero.yml 的檔案:

# File: .github/workflows/deploy-to-stackhero.yml

name: Deploy to Stackhero
run-name: Deploy branch "${{ github.ref_name }}" to Stackhero

on:
  push:
    # 列出會觸發部署動作的分支。請確保每個分支在 GitHub(「Settings」>「Environments」)中都有對應的環境。
    # 並在該環境中新增對應的 secret STACKHERO_SSH_PRIVATE_KEY 及變數 STACKHERO_ENDPOINT。
    branches: [ "production", "staging" ]

jobs:
  Deploy:
    environment: ${{ github.ref_name }}
    runs-on: ubuntu-latest
    steps:
    - uses: stackhero-io/github-actions-deploy-to-stackhero@v1
      with:
        # STACKHERO_SSH_PRIVATE_KEY 及 STACKHERO_ENDPOINT 必須在對應的 GitHub 環境中設定。
        ssh_private_key: ${{ secrets.STACKHERO_SSH_PRIVATE_KEY }}
        endpoint: ${{ vars.STACKHERO_ENDPOINT }}

建立 workflow 檔案後,您可以這樣提交變更:

git add -A .
git commit -m "Add GitHub Actions to deploy to Stackhero"

若要建立 production 分支,請執行:

git checkout -b production

然後將您的變更推送到 GitHub:

git push --set-upstream origin production

這次推送會將您的程式碼送到 production 分支,並觸發 GitHub Actions 將程式碼部署到 Stackhero 服務。要確認部署狀態,請打開您的 GitHub 專案並點擊 Actions

GitHub Actions 已部署到 productionGitHub Actions 已部署到 production

就是這樣。您的程式碼現在已設定好,能夠透過 GitHub Actions 自動部署到 production。

設定 staging 環境的步驟幾乎與 production 相同。只需重複上述步驟,並將 production 替換為 staging 即可。

首先建立 staging 分支:

git checkout -b staging

然後將 staging 分支推送到 GitHub:

git push --set-upstream origin staging

GitHub Actions 會自動將您的 staging 分支部署到指定的 Node.js 服務。

建議您保護 productionstaging 分支,避免直接推送。您可以先對 staging 分支建立 pull request,將開發分支的變更合併進來。當您在 staging 平台驗證無誤後,再將 pull request 合併到 production 分支。

這種 workflow 可確保只有授權的貢獻者能推送到 staging 及 production,並在新功能正式上線前多一層測試驗證。