首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0082. Git - GitHub Action 實現自動化刪除 Gitflow 分支策略下的 Feature/* 分支

日期:2025年 01月 04日

標籤: Git GitHub GitHub Action YAML TortoiseGit

摘要:C# 學習筆記


解決問題: Gitflow 分支策略下產生的 Feature 如何在 Merge 到 DEV 與 QAT 後搭配 Github Action 自動刪除
本篇範例:連結
基本介紹:本篇分為三大部分。
第一部分:Github Action 介紹
第二部分:增加 workflow 分支
第三部分:實現自動化刪除 Feature






第一部分:Github Action 介紹

Step 1:GitHub Action 介紹

官方 Github Action 中文文檔
以下擷取於官網:

在 GitHub Actions 的仓库中自动化、自定义和执行软件开发工作流程。
您可以发现、创建和共享操作以执行您喜欢的任何作业(包括 CI/CD),并将操作合并到完全自定义的工作流程中。




Step 2:GitHub Action 優點、缺點

優點簡單列出以下:

1. 深度集成 GitHub 平台 GitHub Actions 完全集成於 GitHub,因此不需要額外配置外部工具或服務。
  開發者能夠輕鬆管理所有的 CI/CD 任務和工作流,無需離開 GitHub 環境。
2. 靈活的工作流配置 用戶可以使用 YAML 文件(.yml)來定義工作流,這些工作流可以包括多個步驟和操作,並且可以非常靈活地進行配置。
3. 強大的社區和第三方集成 GitHub Actions 提供大量的現成 Action,可以從 GitHub Marketplace 中下載並應用到工作流中。
4. 開放性與透明度 GitHub Actions 完全開源,用戶可以根據需求修改和擴展操作。
5. 免費的基本服務 GitHub 提供免費的 CI/CD 計劃,對於小型專案和開源專案來說,這是一個非常合適的選擇。
6. 支持容器和自定義執行環境 支持 Docker 容器運行,可以使用 Docker 容器來定制工作流執行環境,進一步提高靈活性。


缺點則有以下:

1. 複雜的設置和學習曲線 但對於初學者來說,理解工作流的結構、使用 YAML 文件配置和處理依賴等方面需要一定的學習曲線。
2. 資源限制 對於免費方案,用戶會面臨一些運行時間和資源的限制(例如,最大運行時間、CPU 和內存限制等)。
3. 在大型專案中的性能問題 某些大型專案的工作流可能會遇到性能瓶頸,尤其是涉及大量並行任務或非常頻繁的工作流觸發。


簡單說,在小型專案、個人開發,使用免費版可以完成大部分 CICD 的工作,如果是大型專案再考慮用付費版

Step 3:GitHub Action 收費價格

官方收費的中文文件可以查詢詳細資訊
主要在於免費版,可以自動化建置 2000 分鐘(33小時),基本上小型專案很實用。


第二部分:增加 workflow 分支


Step 1:Git 架構圖

我們需要新增一個 workflow 分支,主要目的有以下:

1. 集中管理 CICD 觸法工作流的腳本
2. 每次更新 workflow 所有的分支都會自動更新到最新的 .yml 腳本
3. 由腳本內容決定觸發分支、內容


自動同步 .yml 更新到各分支,可以依照 Git 事件決定自動化腳本的工作是否執行


Step 2: 當前分支 - 並拉取

延續上篇 0081. Git - GitFlow 變化 - 多環境分支策略 & 適合的合併方式說明
通常只有以下分支,為了讓 Github Action 在我們將 Feature Push 到 develop、Qat 分支時,自動刪除該 Feature (已開發完成),因此要先建立 workflow 分支管理
取得後先 Checkout 每個分支,便於說明


Step 3: 建立 workflow

建立一個分支 workflow,並且該分支資料預設為空

建立完成後如下:


Step 4: 開啟 Github Action

打開 Github Action ,並點擊超連結:


Step 5: 建立腳本

在目錄下建立檔案 workflows\sync.yml
代碼如下:
每次建置時,若分支屬性 branches: [workflow] 才會觸發,並且給予權限是 write (寫入才可以更新分支)
執行的事件內容 run: 會針對其他 4 個 Gitflow 主分支,進行強制合併 (以 workflow 這個分支的資料為主)

name: 從 workflow 分支的 .yml 檔同步到所有分支

on:
  push:
    branches: [workflow]  # 當 workflow 分支有更新時觸發

permissions:
  contents: write

jobs:
  sync-workflows:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: 同步(Merge的方式)到目標分支
        run: |
          git fetch --all
          git config user.name "GitHub Actions"
          git config user.email "actions@github.com"
          
          branches=("develop" "Qat" "staging" "main")
          for branch in "${branches[@]}"; do
            git checkout $branch
            git merge workflow --no-ff --allow-unrelated-histories -X theirs workflow  # 允許合併不相關的歷史
            git push https://x-access-token:$@github.com/$ $branch
          done




Step 7: 簽入 .yml

建檔完成,可以進行簽入


Step 8: CICD 過程

開啟 Actions 可以發現已經觸發腳本

並且可以打開 sync-workflows 觀察建置過程


Step 9: 完成

開啟其他分支檢查(目前是 develop 分支示意),會強制 Merge workflow 分支的 *.yml 到其他分支




第三部分:實現自動化刪除 Feature


Step 1:新增自動化刪除腳本

在 workflow 分支目錄下建立檔案 workflows\autodeletefeature.yml
代碼如下:
每次建置時,若分支屬性 branches: [develop, Qat] 被 push 才會觸發,並且給予權限是 write (寫入才可以更新分支)
執行的事件內容 run: 會檢查此 feature/XXX 當前分支是否已經被 merge 到 develop 與 Qat
判定為檢查 featrue 的最後 GitHsh 內容是否同時存在兩個分支中
※這裡的情境是假定 develop 全部正確,然後才推送 Qat ,並且推送 Qat 後,開發流程是需要立刻刪除此 Feature

name: 自動刪除 Feature 分支,feature 分支已經全 merge 到 develop 與 Qat 分支時

on:
  push:
    branches:
      - develop
      - Qat

jobs:
  delete-feature-branch:
    runs-on: ubuntu-latest
    
    permissions:
      contents: write
    
    steps:
    - uses: actions/checkout@v3
      with:
        fetch-depth: 0
    
    - name: 檢查並刪除已合併的 Feature 分支
      run: |
        # 取得所有遠端分支
        git fetch --all
        git config user.name "GitHub Actions"
        git config user.email "actions@github.com"
        
        # 列出所有 feature 開頭的分支
        FEATURE_BRANCHES=$(git branch -r | grep 'origin/feature' | tr -d ' ')
        
        # 對每個 feature 分支進行檢查
        echo "開始檢查 feature 分支..."
        for branch in $FEATURE_BRANCHES; do
          echo "檢查分支: $branch"
          
          # 檢查是否同時合併到 develop 和 Qat
          MERGED_TO_DEVELOP=$(git branch -r --contains $branch | grep 'origin/develop' || true)
          MERGED_TO_QAT=$(git branch -r --contains $branch | grep 'origin/Qat' || true)
          
          if [ ! -z "$MERGED_TO_DEVELOP" ] && [ ! -z "$MERGED_TO_QAT" ]; then
            echo "分支 $branch 已合併到 develop 和 Qat,準備刪除..."
            BRANCH_NAME=$(echo $branch | sed 's#origin/##')
            git push origin --delete $BRANCH_NAME
            echo "已刪除分支: $BRANCH_NAME"
          else
            echo "分支 $branch 尚未完全合併到 develop 和 Qat,保留分支"
          fi
        done




Step 2: Demo 驗證 - 簽入 Feature

打開 Feature 分支,並且簽入一些改動


Step 3: Demo 驗證 - Merge

將 Feature 合併到 develop, Qat 分支上。
develop:

Qat:


Step 4: Demo 驗證 - 查看 Github Action

檢查 Github Action 可以發現有自動觸發工作

以下是建置過程,有觸發刪除分支:


Step 5: Demo 驗證 - 自動刪除分支完成

回到當前分支檢查,可以確定 Feature 已被刪除,完成 Github Action 自動化刪除分支工作流程