iT邦幫忙

2025 iThome 鐵人賽

DAY 11
0
Software Development

我獨自開發 - 用 Supabase 打造全端應用系列 第 11

第十ㄧ關 - 打開多重次元的傳送門:Supabase Branching

  • 分享至 

  • xImage
  •  

Supabase Branching 示意圖

在團隊開發中,經常面臨一個兩難:既要快速迭代新功能,又要確保正式環境的穩定性。而 Supabase Branching 功能就是為了解決這個問題而生,讓你的團隊能夠像使用 Git 分支一樣,輕鬆管理不同的資料庫環境。

什麼是 Supabase Branching?

Supabase Branching 允許開發者為每個功能開發、錯誤修復或實驗性變更創建獨立的資料庫環境。每個分支都包含完整的 Supabase 堆疊副本,包括資料庫、API、身份驗證和儲存服務,讓團隊能夠在隔離的環境中進行開發和測試。

簡單來說

想像你正在寫一本書,而這本書就是你的應用程式。傳統的開發方式就像是所有作者都在同一份原稿上修改,很容易造成混亂。而 Supabase Branching 就像是給每個作者一份獨立的草稿副本,他們可以在自己的副本上自由創作、實驗,完成後再將好的內容合併回主要版本。這樣既不會影響原稿,也能讓每個人都能發揮創意。

為什麼要使用 Supabase Branching?

在傳統的開發流程中,團隊經常面臨以下挑戰:

傳統開發的痛點

  • 環境衝突:多個開發者在同一個開發環境中工作,容易互相干擾
  • 測試風險:在共享環境中測試新功能可能影響其他人的工作
  • 部署恐懼:擔心新變更會破壞正式環境,導致部署頻率降低
  • 回滾困難:當問題發生時,很難快速回到穩定狀態

Supabase Branching 的優勢

  • 隔離開發:每個功能都有獨立的環境,不會互相影響
  • 安全測試:可以放心地在分支環境中進行各種實驗
  • 預覽部署:每個 Pull Request 都可以有自己的預覽環境
  • 快速回滾:出問題時可以立即切換回穩定的分支

準備你的 Git 儲存庫

在開始使用 Supabase Branching 之前,你需要確保你的專案已經正確設定了 Git 版本控制。

基本要求

  1. Git 儲存庫:你的專案必須使用 Git 進行版本控制
  2. Supabase CLI:確保已安裝最新版本的 Supabase CLI
  3. 專案連結:你的本地專案必須已經連結到 Supabase 專案

設定步驟


# 初始化 Supabase CLI
supabase init

# 連結到 Supabase 專案
supabase link --project-ref YOUR_PROJECT_ID

# 確保本地環境與遠端同步
supabase db pull

# 確保你的專案已經初始化 Git
git init
git add .
git commit -m "Initial commit"

啟用 Supabase Branching

啟用 Branching 功能非常簡單,只需要在 Supabase 控制台中進行設定。

在控制台中啟用

  1. 前往專案設定:登入 Supabase 控制台,選擇你的專案
  2. 找到 Branching 設定:在上方導覽選單中找到「main」選項,然後點擊旁邊的「Branching icon」選項
  3. 啟用功能:點擊「Create a new preview branch」按鈕
  4. 確認設定:系統會要求你確認啟用 Branching 功能

Supabase Branching 啟用畫面

啟用 Branching 後,你的主要專案會成為「production」分支,所有新的分支都會基於這個分支創建。

Branching 功能可能會產生額外的費用,請查看你的方案限制

開啟 Pull Request

當你啟用 Branching 後,每當你在 GitHub 上開啟 Pull Request 時,Supabase 會自動為該 PR 創建一個預覽分支。

自動分支創建流程

  1. 推送程式碼:將你的功能分支推送到 GitHub

    git checkout -b feature/user-profile
    # 進行你的開發工作
    git add .
    git commit -m "Add user profile feature"
    git push origin feature/user-profile
    
  2. 開啟 Pull Request:在 GitHub 上開啟 Pull Request

  3. 自動創建分支:Supabase 會自動檢測到新的 PR,並創建對應的預覽分支

  4. 獲取分支資訊:在 PR 的評論中,你會看到 Supabase 機器人提供的分支資訊

GitHub PR 中的 Supabase 分支資訊

每個 PR 分支都會有獨立的 URL 和 API 金鑰,你可以使用這些資訊來測試你的應用程式。

分支會繼承主分支的資料庫結構,但不會包含生產資料。

防止遷移失敗

在使用 Branching 時,資料庫遷移的管理變得更加重要。以下是一些最佳實踐來避免遷移失敗。

遷移最佳實踐

1. 向後相容的遷移

-- 好的做法:新增欄位時設定預設值
ALTER TABLE users ADD COLUMN avatar_url TEXT DEFAULT '';

-- 避免:沒有預設值的必填欄位
ALTER TABLE users ADD COLUMN avatar_url TEXT NOT NULL;

2. 分階段進行破壞性變更

-- 第一階段:新增新欄位
ALTER TABLE users ADD COLUMN new_email TEXT;

-- 第二階段:遷移資料
UPDATE users SET new_email = email;

-- 第三階段:移除舊欄位(在確認無問題後)
ALTER TABLE users DROP COLUMN email;

3. 使用交易確保一致性

BEGIN;
  -- 你的遷移操作
  ALTER TABLE posts ADD COLUMN status TEXT DEFAULT 'draft';
  UPDATE posts SET status = 'published' WHERE published = true;
COMMIT;

環境變數管理

1. 分支特定的環境變數

# 為特定分支設定環境變數
supabase secrets set --branch my-feature-branch API_KEY=your_api_key

# 列出分支的所有環境變數
supabase secrets list --branch my-feature-branch

2. 繼承主分支的設定

# 從主分支複製環境變數
supabase secrets copy --from production --to my-feature-branch

使用 dotenvx 進行基於 Git 的工作流程

dotenvx 可以幫助你管理不同環境的環境變數。

安裝和設定 dotenvx

# 安裝 dotenvx
npm install -g @dotenvx/dotenvx --save

為不同分支設定環境檔案

# 主分支環境變數
.env.production

# 開發分支環境變數
.env.development

# 功能分支環境變數
.env.feature

使用範例

# 根據當前 Git 分支自動載入對應的環境變數
dotenvx run -f .env.$(git branch --show-current) -- npm run dev

實際開發流程

1. 功能開發流程

# 1. 創建功能分支
git checkout -b feature/user-notifications

# 2. 進行開發工作
# 編寫程式碼、建立遷移檔案等

# 3. 測試功能
npm run test

# 4. 開啟 Pull Request
git push origin feature/user-notifications
# 在 GitHub 上開啟 PR

# 5. 程式碼審查和測試
# 團隊成員可以使用 PR 分支進行測試

# 6. 合併到主分支
# PR 被批准後合併,分支自動清理

2. 錯誤修復流程

# 1. 創建修復分支
git checkout -b hotfix/login-bug

# 2. 修復問題
# 進行必要的程式碼修改

# 3. 驗證修復
# 在分支環境中測試修復效果

# 4. 快速部署
# 修復確認後快速合併到主分支

小結

Supabase Branching 透過為每個功能、每個 Pull Request 提供獨立的環境,團隊可以更加自信地進行創新和實驗。

... to be continued

有任何想討論歡迎留言,或需要指正的地方請鞭大力一點,歡迎訂閱、按讚加分享,分享給想要提升開發效率的朋友~


上一篇
第十關 - 快速建立地下城:Supabase UI Library
下一篇
第十二關 - 何振宇的分身:Supabase Test
系列文
我獨自開發 - 用 Supabase 打造全端應用13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言