Copilot Autofix 是 GitHub Advanced Security for Azure DevOps 中由 AI 驅動的功能,能產生針對程式碼掃描警報的建議修補方法。 當 CodeQL 發現漏洞或程式碼錯誤時,你可以直接從進階安全分頁產生警示修正。Copilot Autofix 使用 Copilot 編碼代理程式產生修正,並開啟包含擬議變更的拉取請求,讓你可以透過一般的拉取請求工作流程檢視、編輯並合併。
Note
此功能目前僅限於有限公開預覽。 Microsoft 目前不接受更多用戶參與預覽版。
功能可能會在無預警的情況下變更或移除。 預覽功能沒有服務水準協議(SLA),且支援有限。
適用於 Azure DevOps 的 GitHub 進階安全性可與 Azure Repos 搭配運作。 若要在GitHub儲存庫中使用GitHub Advanced Security,請參見 GitHub Advanced Security。
先決條件
| 類別 | Requirements |
|---|---|
| 許可 | - 若要檢視存放庫的所有警示摘要:存放庫的參與者 許可權。 - 在進階安全(Advanced Security)中關閉警報:Project administrator權限。 - 若要管理進階安全性中的許可權:必須是 專案集合系統管理員 群組的成員或擁有 進階安全性: 管理設定 許可權設為 允許。 |
如需進階安全性許可權的詳細資訊,請參閱 管理進階安全性許可權。
- 程式碼掃描已為您的儲存庫設定,可使用預設設定或進階設定。
- 至少有一個 CodeQL 程式碼掃描警示。
- 選擇 產生修正 的使用者所需的 進階安全性:檢視警報 存放庫權限。
- 對 Azure Pipelines 代理程式集區的存取權。 Copilot Autofix 會將一個由 Microsoft 託管的管線作業加入佇列,以產生並發佈修正。 此次執行需要有可用的平行作業。 若所有平行作業皆已被占用,修正將持續在佇列中等待,直到有可用容量為止。
Copilot Autofix 使用名為 GitHub Copilot ({organization})的專用身份執行儲存庫操作,而非專案或集合的建置服務帳號。 該服務會自動授予該身份以下權限:
| 運算 | 許可 |
|---|---|
| 進入專案 | 檢視專案層級資訊 |
| 複製存放庫 | 參閱 |
| 建立並推送修正分支 | 貢獻與創建分支 |
| 建立並更新拉取請求 | 參與提取要求 |
| 閱讀程式碼掃描警報 | 進階安全性:查看警示 |
| 新增提取要求討論 | 閱讀並參與提取要求的討論 |
| 更新管線運行 | 更新組建資訊 |
| 為提取要求加上標籤 | 建立 Copilot Autofix 標籤 |
你不需要把這些權限授予 Build Service 帳號。 如果您的組織使用明確拒絕權限,請確認這些權限不會封鎖GitHub Copilot ({organization})身分。
關於 Copilot Autofix
Copilot Autofix 結合了 CodeQL 的分析能力與驅動 Copilot 編碼代理程式的大型語言模型。 當你為受支援的程式碼掃描警示產生修正時,Copilot Autofix 會分析該警示及其周圍的程式碼,然後開啟一個包含以下內容的提取要求:
- 建議的 程式碼變更 ,針對底層漏洞進行修正。
- 正在修正之警示的描述,包括警示 ID、嚴重程度及變更摘要。
由於建議的修正會考量你程式碼庫的整體脈絡,因此變更可能不只限於引發警示的那一行,也可能包含在必要時對其他檔案所做的修改。
Note
Copilot Autofix 處理的資料並不用於訓練大型語言模型(LLM)。
Important
Copilot 自動修正建議由 AI 模型產生,並不保證正確、完整或安全。 請務必仔細檢視拉取請求,確認它能解決警示且不會引發新問題,並在合併前測試你的變更。
支援的語言
Copilot Autofix 支援 CodeQL 分析的程式碼掃描語言,包括 C/C++、C#、Go、Java/Kotlin、JavaScript/TypeScript、Python、Ruby 和 Swift。 關於目前支援 CodeQL 的語言清單,請參見 語言與查詢支援。
Billing
Copilot Autofix 包含在您的 GitHub Advanced Security for Azure DevOps 授權中。 產生修正會消耗貴組織 Azure 計費計量表的 AI 信用點數。
每次產生修正建議都會消耗代幣,其中包括為傳送給模型的程式碼上下文所用的輸入代幣、建議變更內容的輸出代幣,以及用於重複使用現有上下文的快取代幣。
為了簡化計費,這些代幣會轉換成一個標準單位,稱為 GitHub AI 信用點數,其中 1 個信用點等於 0.01 美元。 這些費用會計入與你的 Azure DevOps 組織連結的 Azure 訂用帳戶,並在 Azure 成本管理 中顯示為個別的計量。
每次修正的費用會依據周圍程式碼的大小及變更的複雜度而有所不同。
要監控每日費用,請前往 Azure 入口網站的>>成本分析頁面。
啟用 Copilot Autofix
你可以在組織、專案或儲存庫層級啟用 Copilot Autofix。 當你在更廣泛的範圍內啟用 Autofix 時,該設定會套用到該範圍內的所有儲存庫。 根據你想套用該設定的儲存庫,選擇在哪裡設定 Autofix:
| Scope | 在哪裡設定自動修正 |
|---|---|
| 組織 | 選擇組織設定>的儲存庫,以啟用組織內所有儲存庫的自動修正。 |
| 計畫 | 選擇 Project 設定>Repositories>所有 Repositories 以啟用 project 內所有 Repositories 的自動修正。 |
| 存儲庫 | 選取 專案設定>存放庫,然後選取要僅為其啟用自動修正的存放庫。 |
啟用 Copilot Autofix:
- 登入您的 Azure DevOps 組織 (
https://dev.azure.com/{yourorganization})。 - 到你想設定的組織、專案或儲存庫範圍設定頁面。
- 在 進階安全 區塊,開啟 代碼安全功能 面板。
- 選擇自動修正代碼掃描警報勾選框,以建立由Copilot編碼代理產生的自動修復代碼掃描警報。
- 選取 [套用] 以儲存變更。
CodeQL 必須已在執行,且正在為該存放庫產生警示。 如需更多資訊,請參閱 設定程式碼掃描 和 設定 GitHub 進階安全性功能。
為警報產生修正
啟用 Copilot Autofix 後,你可以從任何支援的程式碼掃描警示中產生修正。
- 選擇 Repos>Advanced Security。
- 選擇 「掃描程式碼 」標籤,然後選擇警示以開啟詳細檢視。
- 請查看警報的 地點、 描述及 建議 ,以了解發現內容。
- 選擇 產生修正。
當 Copilot Autofix 正在修復時,警示細節檢視顯示修正正在進行中。 Copilot Autofix 會在修正準備就緒時開啟提取要求。
Copilot Autofix 會產生修正並從名為 copilot-autofix/... 的分支開啟拉取請求。 拉取請求會標示 Copilot Autofix 標籤,你可以用它來辨識 Pull 請求清單中的 Autofix 拉取請求。
同一警示和分支只能啟用一個修正。 當請求處於待處理狀態或其管線正在運行時, Generate fix 無法使用。 如果同時有另一個請求被提交,警示會顯示修正已經在產生中。 你可以在主動請求成功或失敗後產生另一個修正。
對於 CodeQL 警示,拉取請求會自動顯示在警示細節檢視的 相關拉取請求 中,並隨著產生與完成的進度持續更新,因此你不需要重新整理頁面。
如果 Copilot Autofix 沒有為警示產生任何程式碼變更,它就不會建立分支或拉取請求,也不會在警示詳細檢視中連結拉取請求。 在這種情況下,請手動修復警報。 更多資訊請參見 「修正不可用」。
檢視並合併修正內容
Copilot Autofix 開啟的 pull request 行為和其他 Azure Repos 的 pull request 一樣。 其說明總結了該修正所處理的警示。
Copilot Autofix 標籤用來標示自動修正提取要求。
- 從警示的 相關提取要求 區段開啟提取要求,或從 Repos>提取要求 開啟。
- 請在檔案標籤中檢視所有受影響檔案的擬議變更。
- 如果你需要符合你的程式碼風格、命名慣例或專案需求,請修改變更。
- 透過正常的審核流程核准並完成拉取請求。
合併 pull request 後,在合併的目標分支執行 CodeQL 並上傳新的 SARIF 結果。 Copilot Autofix 不會執行合併後的掃描。 當更新的分析不再回報漏洞時,警報會自動關閉。
Tip
生成的修正只是起點,而非最終答案。 像對待其他任何變更一樣處理 Pull Request:先審查、測試,並在合併前視需要請其他審查者協助審查。
疑難排解 Copilot 自動修復
修正進行中
大多數 Copilot Autofix 大約 2-5 分鐘就能完成。 運行時間會依據可用管線容量及變更複雜度而有所不同。 若所有平行工作都在使用中,管線仍保持排隊狀態,警示持續顯示 「修復中 」,直到容量可用為止。
在管線排入佇列前仍處於擱置中的請求,會在 30 分鐘後失敗。 排隊或運行中的管線有兩小時的超時。 警報可能會在後端逾時前自動停止更新。 若警報持續進行中:
- 重新整理警報詳情頁面。
- 如果有 檢視執行,請開啟管線執行,並檢查其狀態是佇列中還是執行中。
- 等待請求達到成功或失敗狀態。 在現有申請有效時,不要再提交新的申請。
- 如果請求失敗,請檢視失敗訊息,並在處理原因後選擇 重試修正 。
已建立 Pull request,但尚未連結至警示
提取要求可以在顯示於 相關提取要求 底下之前成功建立。 重新整理警報詳情頁面。 如果提取要求仍尚未連結,請選取 Repos>Pull requests,然後尋找:
- Copilot Autofix 標籤。
- 以
copilot-autofix/開頭的來源分支。 - 一個 pull request 標題,提到程式碼掃描警示。
即使連結未出現在警示中,也要透過正常的拉取請求工作流程檢視並合併拉取請求。
儲存庫或拉取請求操作失敗
Copilot Autofix 會對與警報相關的分支進行淺層克隆。 它不會初始化 Git 子模組。 它會建立一個具有唯一名稱的 copilot-autofix/... 分支,推送所產生的變更,並開啟以該警示分支為目標的拉取請求。
使用 View 從 警報失敗狀態執行來檢查管線日誌。 下表列出常見的原因與行動:
| Failure | 要檢查的事項 |
|---|---|
| 儲存庫或分支無法被複製 | 確認儲存庫和警示分支是否仍然存在。 如果警示是在 pull request 中發現的,則來源分支和 pull request 都必須仍處於作用中。 如果該分支已被刪除,請在目前的分支上執行 CodeQL,並根據產生的警示生成修正。 |
| 這個修正取決於 Git 子模組中的程式碼 | Copilot Autofix 不會初始化子模組。 如果所需的程式碼上下文儲存在子模組中,請手動修復警報。 |
| 預設分支被更改或警報分支被刪除 | Copilot Autofix 會鎖定與警示相關的分支,而這不一定是目前的預設分支。 在預定分支上執行 CodeQL,並根據該分支的警示產生修正。 |
| 無法建立修正分支 | 檢查儲存庫分支名稱限制,以及對 GitHub Copilot ({organization}) 身分明確拒絕的權限。 允許帶有前綴的 copilot-autofix/ 分支。 重試會建立一個唯一命名的新分支。 |
| 分支政策會阻擋變更 | 提取要求完成原則會像套用於其他任何提取要求一樣,套用於 Autofix 提取要求。 完成前務必滿足必要的審查者與驗證政策。 若某個儲存庫政策阻擋了初始推送,請更新該政策以允許自動修正身份與分支前綴。 |
| 產生的提交無法被推送 | 檢查 GitHub Copilot ({organization}) 身分的 「貢獻」 和 「建立分支」 權限,包括明確拒絕。 另外,請檢查提交作者電子郵件驗證,如 已產生修正,但無法提交或推送 中所述。 |
| 拉取請求無法被建立 | 檢查「對提取要求提出貢獻」權限,以及為 GitHub Copilot ({organization}) 身分建立 Copilot Autofix 標籤的權限。 |
修正已產生,但無法提交或推送
Copilot Autofix 會使用 noreply@dev.azure.com 作為提交作者的電子郵件地址。 如果提交作者的電子郵件驗證政策不允許使用此地址,Copilot Autofix 可以產生程式碼變更,但無法提交或推送以建立拉取請求。
警示詳情檢視顯示一個錯誤,顯示被封鎖的提交作者電子郵件。
在提交作者電子郵件驗證政策中新增 noreply@dev.azure.com 至允許的電子郵件模式:
- 選取 [項目設定>存放庫]。
- 選擇 所有儲存庫 以更新專案層級政策,或選擇包含該政策的儲存庫。
- 選取政策。
- 在 「儲存庫政策」中,找到 提交作者電子郵件驗證。
- 將
noreply@dev.azure.com新增至允許的電子郵件模式。 - 回到程式碼掃描警報,選擇 重試修正。
執行失敗
如果 Copilot Autofix 的執行無法完成,警示會顯示明顯的失敗狀態,讓你能快速看到執行失敗。 從失敗狀態,你可以重新嘗試執行以產生新的修正。
執行可能因暫時性原因失敗,或當執行過程中無法產生可用的程式碼變更時。 重試執行以產生修正。
合併修正後,警示仍會持續開啟
合併 Autofix 提取要求後,警示要等到後續的 CodeQL 分析處理已合併的程式碼後,才會關閉。 如果警報持續開啟:
- 確認拉取請求是否合併到偵測到警報的同一個分支。
- 確認 CodeQL 掃描是在合併後執行,並且分析了合併後的提交。
- 確認掃描成功上傳了正確的儲存庫與分支的 SARIF 結果。
- 請檢視新結果,確認該漏洞已不再被偵測到。
- 如果漏洞仍然存在,請更新修補並重新執行 CodeQL。
修正無法取得
Copilot Autofix 無法為每個警示產生修正。 在下列情況下,可能無法取得修正程式:
- 目前 Copilot Autofix 不支援這種警示類型。
- Copilot 判斷警報可能是誤報。
- 由自訂查詢或第三方工具產生警示,而非 CodeQL。
- Copilot Autofix 可以執行,但不會產生任何程式碼變更。 在此情況下,不會建立分支或提取要求。
如果 Copilot Autofix 判斷警示可能是誤報且沒有產生任何變化,警示細節檢視會顯示結果。 你可以檢視這次執行,或重新嘗試修正。
當無法取得修正時,請使用警示中的 建議 和 範例 區塊來補救或手動關閉警示。 如需詳細資訊,請參閱