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,同時在新功能上線前多一道測試驗證的關卡。