---
# System prepended metadata

title: Git Diff 風險評估自動化：PowerShell 串接 AI 產出報告
tags: [PowerShel, OpenAI, "\_Git", CodeReview]

---

# Git Diff 風險評估自動化：PowerShell 串接 AI 產出程式異動風險及報告


> **前言**：
> 之前我分享過如何用 PowerShell 自動開啟 Meld 進行視覺化比對。
> 但隨著專案越來越大，我發現光靠「眼睛」看 Code 是不夠的。
> 
> 眼睛能看到程式碼變了，但大腦不一定能馬上反應出**「這個改動會導致資料庫鎖死」**或是**「這裡有一個隱藏的 SQL Injection」**。
> 
> 於是我想：**為什麼不讓 AI 幫我做第一關的 Risk Review？**

[TOC]

---

## 🚀 這是什麼？

這是一個進階版的 PowerShell 自動化腳本。它不只幫你抓出 Git 的差異，還會扮演一位**「資深且機車的資安架構師」**，幫你分析這一次上版可能會把系統搞掛的風險。

**它能做到：**
1. 自動抓取 `Old Commit` 與 `New Commit` 之間的差異 (Diff)。
2. 透過精心設計的 **System Prompt (提示詞)**，讓 AI 專注於找碴。
3. 自動產出一份 **Markdown 風險評估報告**，包含：
    * 🔥 **阻擋上線的問題** (Showstoppers)
    * 🛡️ **資安漏洞** (Security Risks)
    * ⚡ **效能隱憂** (Performance)
    * 🧪 **QA 測試建議** (Edge Cases)

---

## 🧠 靈魂核心：Prompt 設計 (Prompt Engineering)

要讓 AI 給出有用的建議，而不是只會說「這段程式碼寫得不錯」，關鍵在於 Prompt 的設計。

我將 System Prompt 設定為一位 **DevSecOps 專家**，並加入了**「負向約束」**（叫它不要管縮排、變數命名），強制它專注於**邏輯與安全性**。

以下是腳本中使用的 Prompt 設計：

```markdown
你是一位擁有 20 年經驗的資深軟體架構師與資安專家。
你的核心任務是：「阻止不穩定的版本上線」。

### 🚫 忽略項目
- 忽略縮排、換行、變數命名美感。
- 忽略單純的註解更新。

### 🔍 重點審查 (Deep Dive)
1. **破壞性更動**: API 簽章改變？DB Schema 變更後是否相容舊資料？
2. **資安漏洞**: SQL Injection？Hardcoded Secrets？權限繞過？
3. **效能**: N+1 Query？記憶體洩漏？

請輸出嚴格、批判性強的 Markdown 報告。
```

---

## 🛠️ 腳本實作 (Copy & Paste 即可用)

請建立一個檔案 `analyze-risk.ps1`，並貼上以下內容。

> **⚠️ 注意**：你需要一組 OpenAI API Key，或是改用 Local LLM (如 Ollama) 的網址。

```powershell
param (
    [string]$OldCommit = $(throw "請提供舊版 Commit ID"),
    [string]$NewCommit = $(throw "請提供新版 Commit ID"),
    [string]$ApiKey = $env:OPENAI_API_KEY, # 建議設在環境變數
    [string]$Model = "gpt-4o" # 建議用 gpt-4 或 gpt-4o 效果較好
)

# 1. 檢查設定
if ([string]::IsNullOrWhiteSpace($ApiKey)) {
    Write-Host "❌ 錯誤: 未設定 API Key。" -ForegroundColor Red
    exit 1
}

# 2. 準備輸出目錄
$timestamp = Get-Date -Format "yyyyMMddHHmmss"
$reportFolder = "risk-reports/$timestamp"
New-Item -ItemType Directory -Path $reportFolder -Force | Out-Null

Write-Host "🤖 正在擷取 Git 差異 ($OldCommit -> $NewCommit)..." -ForegroundColor Cyan

# 3. 取得 Git Diff (含上下文)
# --unified=10 提供更多上下文讓 AI 理解邏輯
$diffContent = git diff --unified=10 $OldCommit $NewCommit

if (-not $diffContent) {
    Write-Host "✅ 無程式碼變更。" -ForegroundColor Green
    exit 0
}

# 防呆：避免 Token 爆炸
if ($diffContent.Length -gt 150000) {
    Write-Host "⚠️ 警告: Diff 過大，可能截斷或產生高額費用。" -ForegroundColor Yellow
}

Write-Host "🧠 架構師正在審查中 (請稍候)..." -ForegroundColor Cyan

# 4. 定義 "機車的" 架構師人格
$systemPrompt = @"
你是一位擁有 20 年經驗的資深軟體架構師與資安專家 (DevSecOps)。
你的核心任務是進行「發佈前風險評估」。
你收到的是一段 Git Diff。

請依循以下框架嚴格審查：

### 🚫 忽略項目 (雜訊過濾)
- 忽略純粹的格式調整 (縮排、換行)。
- 忽略變數命名的美感問題。
- 忽略單純的文檔更新。

### 🔍 重點審查項目
1. **💥 破壞性更動**: API 簽章是否改變？DB Schema 變更是否考慮回滾？
2. **🛡️ 資安漏洞**: SQL Injection？Hardcoded Secrets？權限檢查繞過？
3. **⚡ 效能與穩定性**: 迴圈內呼叫 DB？OOM 風險？例外處理是否吞掉錯誤？

### 📝 輸出格式 (Markdown)
語氣要專業、直接、批判性強 (Critical)：

# 🛡️ 上版風險評估報告
## 🚦 綜合風險評分: [🟢低 / 🟡中 / 🔴高 / 🔥極危險]

## 🔥 阻擋上線的問題 (Showstoppers)
*(若無則顯示 "無")*
- **[檔案]**: 說明為何這裡會導致系統崩潰或資安外洩。

## ⚠️ 潛在風險與警告
- 說明邏輯漏洞或副作用。

## ⚡ 效能優化建議
- 指出具體程式碼片段。

## 🧪 測試建議
- QA 應該特別測試哪些極端情境 (Edge Cases)？
"@

# 5. 呼叫 API
$apiUrl = "[https://api.openai.com/v1/chat/completions](https://api.openai.com/v1/chat/completions)"
# 如果用 Ollama (地端)，網址改為: "http://localhost:11434/v1/chat/completions"

$headers = @{
    "Content-Type"  = "application/json"
    "Authorization" = "Bearer $ApiKey"
}

$body = @{
    model = $Model
    messages = @(
        @{ role = "system"; content = $systemPrompt },
        @{ role = "user"; content = "Git Diff Content:`n`n$diffContent" }
    )
    temperature = 0.2 # 低溫讓分析更理性
} | ConvertTo-Json -Depth 5 -Compress

try {
    $response = Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body -TimeoutSec 180
    
    # 6. 產出報告
    $reportContent = $response.choices[0].message.content
    $reportPath = "$reportFolder/Risk_Analysis.md"
    $reportContent | Out-File -FilePath $reportPath -Encoding utf8
    
    Write-Host "✅ 分析完成！" -ForegroundColor Green
    if (Get-Command "code" -ErrorAction SilentlyContinue) { code $reportPath }
}
catch {
    Write-Host "❌ API 呼叫失敗: $_" -ForegroundColor Red
}
```

---

## 📊 實測結果：AI 真的抓得到嗎？

我故意寫了一段包含 **SQL Injection** 和 **Hardcoded Password** 的爛 Code 去測試，結果 AI 產出的報告非常驚人：

### 📄 Risk_Analysis.md (模擬輸出)

> # 🛡️ 上版風險評估報告
> 
> ## 🚦 綜合風險評分: 🔥 極危險 (不可上版)
> 
> ## 🔥 阻擋上線的問題 (Showstoppers)
> - **`src/AuthService.cs`**: 
>    嚴重資安漏洞！第 45 行使用了字串串接組裝 SQL 指令 (`"SELECT * FROM Users WHERE name = '" + input + "'"` )。這將導致 **SQL Injection** 攻擊，駭客可直接導出整個資料庫。**必須**改為參數化查詢。
> - **`config/appsettings.json`**: 
>    發現 AWS Secret Key 被直接寫入檔案。這將導致金鑰外洩風險，請立即移除並改用環境變數。
> 
> ## ⚠️ 潛在風險與警告
> - **`src/OrderController.cs`**: 
>    修改了 `GetOrder` 的回傳格式，原本回傳 `Array` 現在變為 `Object`。這是一個 **Breaking Change**，請確認所有前端與 App 版本都已適配，否則會導致客戶端報錯。
> 
> ## 🧪 測試建議
> - 請 QA 針對登入欄位輸入 `' OR '1'='1` 進行攻擊測試。
> - 請驗證舊版 App 在呼叫訂單 API 時是否會 Crash。

---

## 💡 使用心得與建議

1. **作為 "Pre-Review" 工具**：
   我不會完全依賴它，但我會在發 PR 之前自己先跑一次。這就像是讓一個資深前輩先幫你看過，避免犯低級錯誤被釘在牆上。
2. **資安考量 (重要)**：
   * 如果你的程式碼是商業機密，**請勿**直接傳給公有的 OpenAI API。
   * **解法**：公司內部可申請 Azure OpenAI (企業級合規)，或者使用 **Ollama** 在地端跑 `llama3` 模型（只需改腳本中的 `$apiUrl` 即可），完全斷網也能分析！

### 下一步？
你可以把這個腳本整合進 CI/CD Pipeline (如 Jenkins / GitHub Actions)，每次有人 Push Code 就自動跑風險分析，並將結果貼到 Slack 群組！

---

