首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0083. GitHub Flow 分支策略開發 - 詳細實用範例

日期:2025年 01月 11日

標籤: C# Asp.net Core Web MVC Web Git GitHub GitHub Flow Continuous Integration(CI) Continuous Deployment(CD)

摘要:C# 學習筆記


使用軟體:TortoiseGit
範例檔案:範例Git
解決問題:遵循GitHub Flow分支策略時,會需要的操作
基本介紹:本篇分為四大部分。
     第一部分:架構說明
     第二-三部分:開發(含修復分支時) 進行分支切出
     第四部分:建立標籤,並且 CICD (整合、代碼測試、部署) 到指定的環境上 Qat、Stage、Production
第一部分:基本 GitHub Flow 架構
第二部分:開發功能-開發階段
第三部分:啟用 Gihub Pull Request
第四部分:建立標籤 & CICD 環境更新






第一部分:基本 GitHub Flow 架構

Step 1:介紹 - 優缺點

GitHub Flow 是由 GitHub 的聯合創始人 Scott Chacon 在 2011 年提出的。他當時撰寫了一篇簡單的指南,概述了一種輕量化、適合敏捷開發的分支管理策略,這就是我們今天所熟知的 GitHub Flow。上發表的分支策略
優點如下:

優點 說明
1. 簡單分支 分支結構簡單,僅需管理主分支(main)和功能分支(feature branches)。
2. 適合敏捷開發 支持快速迭代,開發人員可以輕鬆創建短期功能分支,進行並行開發,避免對主分支的直接影響。
3. 減少合併衝突 短期分支設計降低了長期分支可能引發的代碼衝突,簡化合併工作。
4. GitHub 工具無縫集成 自然適配 GitHub 平台,特別是 Pull Request 流程和內建的 CI/CD 工作流功能(GitHub Actions)。


缺點如下:

缺點 說明
1. 不適合穩定、大型產品 缺乏明確的測試分支(如 Dev、QA、Stage 分支),版本控制不夠細緻。分支模型較為單一。
2. 頻繁部署成本高 合併到主分支都可能觸發部署,對於高頻次的提交可能導致資源浪費和雲端成本增加。
3. 缺少多環境支持 預設不支持分開的測試和生產環境,需要額外的標籤或配置來區分環境部署。



Step 2:介紹 - 架構圖

GitHub Flow 的 GitGraph 流程圖


所有的開發修復,都是基於 main 分支




第二部分:開發功能-開發階段


Step 1:新增 feature 開發 - 1

若要開發新工作時,要建立分支,並且在 feature 分支上進行開發


Step 2:新增 feature 開發 - 2

切出 feautre/Work1,並且 Switch 到此分支進行開發


Step 3:開發完成

我們在 feature/Work1 上調整代碼:

並且 Push:


Step 4:送交審核

在 GitHub Flow 中,應進行審核的工作 => Pull Request
由審核人員(管理者、主管、相關開發同事等等),統一 Check 後才會合併到 main 中


Step 5:開發完成 - 當前分支狀態

可以觀察,除了主分支外,剩下的都是功能分支
在開發完成後,應刪除其開發分支( feature/Work1 ),最終仍只保留主分支



第三部分:啟用 Gihub Pull Request

Step 1:發起 Pull Request

發起 Pull Reqeust 審核機制,觸發時間點 :
當有開發人員回報自己的代碼已簽入某個 Feature 分支時,並且希望合併到 main 上(做後續的部署、QA 測試)
回到 Github 此 Repository 上,選擇 New pull request


Step 2:建立 Pull Request

選擇正確的合併分支
左邊 : 目標
右邊 : 來源


Step 3:建立完成

並且將發起的標題、內容輸入


相關人員就會收到發起:


Step 4:審核簽入內容

這時,審核人員,可以打開 Files Changed -> 選擇 Review Changes
開始審核所有分支的異動


Step 5:審核通過

若審核通過,在執行 Submit review

並且已審核會有 已完成數量/總數 的顯示:


Step 6:審核完成

在此 Repository 的 Pull Request 可以看到此分支的審核打勾,表示都完成了


Step 7:合併代碼

最後一步驟,就是將 feature/Work1 分支合併到 main 分支上
可選擇 Merge pull request

並且執行 Confirm merge


Step 8:合併完成

至此 Github Flow 流程中的審核與合併分支已完成


第四部分:建立標籤 & CICD 環境更新

Step 1:發布環境的流程 - 說明

在 Pull Request 完成合併後,正常流程會要部署到 Qat/Stage/Production 上
在 Github Flow 中會採用建立 Tag 的方式,然後進行部署,這邊會採用 Github Action 的方式實現自動化 CICD 流程

Step 2:建立 Github Action - PR專用

在 main 主分支上,建立 Github Action 用的流程檔案 (路徑 : .github/workflows/build.yml):
當 Pull Reqeust(PR) 完成後,需要建置一次專案,測試,確保整個專案是正常的。

name: .NET Core Build and Test

# 觸發條件
on:
  pull_request:
    branches: [ "main"]  # 當對這些分支發起 PR 時觸發

# 設定工作權限
permissions:
  contents: read
  issues: read
  checks: write
  pull-requests: write

jobs:
  build:
    runs-on: ubuntu-latest  # 使用 Ubuntu 最新版本
    
    steps:
    # 1. CheckOut 程式碼
    - uses: actions/checkout@v4

    # 2. 顯示目錄結構(用於偵錯)
    - name: Show directory structure
      run: |
        pwd
        ls -la

    # 3. 設定 .NET Core SDK (才可以建置)
    - name: Setup .NET Core
      uses: actions/setup-dotnet@v3
      with:
        dotnet-version: 8.0.x  # 指定 .NET 8.0 版本
        
    # 4. 還原 NuGet 套件
    - name: Restore dependencies
      working-directory: ./GitHubFlowBranch
      run: dotnet restore   
      
    # 5. 建置專案
    - name: Build
      working-directory: ./GitHubFlowBranch
      run: dotnet build --no-restore --configuration Release
      
    # 6. 執行測試(通常需要在代碼撰寫完成,目前範例未實現,這裡示意)
    - name: Test
      working-directory: ./GitHubFlowBranch
      run: dotnet test --no-build --verbosity normal --configuration Release



Step 3:建立 Github Action - Qat, Stage, Production 專用

main 主分支上,建立 Github Action 部署用的 qat, stage, production 流程檔案
路徑 : .github/workflows/deploy-to-qat.yml
路徑 : .github/workflows/deploy-to-stage.yml
路徑 : .github/workflows/deploy-to-production.yml
最高管理者打上 Tag 時,會自動觸發部署流程,以下 deploy-to-qat.yml 的內容(以 tag 確定環境):

# 檔案路徑: .github/workflows/deploy-to-qat.yml

name: .NET Core CICD Qat

# 觸發條件
on:
  push:
    tags:# 當簽入 qat-1.0.0 標籤時進行部署
      - 'qat-*'

# 設定工作權限
permissions:
  contents: read
  issues: read
  checks: write
  pull-requests: write

jobs:
  build:
    runs-on: ubuntu-latest  # 使用 Ubuntu 最新版本
    
    steps:
    # 1. CheckOut 程式碼
    - uses: actions/checkout@v4

    # 2. 顯示目錄結構(用於偵錯)
    - name: Show directory structure
      run: |
        pwd
        ls -la

    # 3. 設定 .NET Core SDK (才可以建置)
    - name: Setup .NET Core
      uses: actions/setup-dotnet@v3
      with:
        dotnet-version: 8.0.x  # 指定 .NET 8.0 版本
        
    # 4. 還原 NuGet 套件
    - name: Restore dependencies
      working-directory: ./GitHubFlowBranch
      run: dotnet restore   
      
    # 5. 建置專案
    - name: Build
      working-directory: ./GitHubFlowBranch
      run: dotnet build --no-restore --configuration Release
      
    # 6. 執行測試(通常需要在代碼撰寫完成,目前範例未實現,這裡示意)
    - name: Test
      working-directory: ./GitHubFlowBranch
      run: dotnet test --no-build --verbosity normal --configuration Release
      
    # 7.發布專案 - 這裡要再改寫成 QAT 環境位置,部署過去
    - name: Publish
      working-directory: ./GitHubFlowBranch
      run: dotnet publish --no-restore --configuration Release --output ./publish



Step 4:完整 Github Action

最終,會有以下 4 個檔案


Step 5:DEMO 內測 : Pull Reqeust

再次進行 Pull Request ,並且成功合併 (第三部分 Step 8.) ,會觸發建置


Step 6:DEMO 部署 Qat : 建立 Tag - qat

接著測試 Qat 是否可以正確部署, Create Tag -> 輸入 qat-1.0.0
※依照 .yml 腳本的規則,我們觸發 Qat 部署條件是 qat-*


Step 6:DEMO 部署 Qat : Push Tag

接著 Push -> 包含 Tag

Push 成功:


Step 7:DEMO 部署 Qat : CICD 自動觸發-完成

回到 Github Action 觀察,我們的程式提交 Tag 時,就會自動化部署到 Qat 環境上。