繁體中文(香港)
  • github
  • 自動化

GitHub 工作流程失敗後自動重新執行

有時候你的 GitHub Actions 工作流程會隨機失敗。讓我們看看如何自動重新執行它以節省時間。

Gao
Gao
Founder

Stop wasting weeks on user auth
Launch secure apps faster with Logto. Integrate user auth in minutes, and focus on your core product.
Get started
Product screenshot

介紹

我們喜歡 GitHub Actions。它功能強大,並提供豐厚的免費層級。

隨著我們的項目成長,我們在 GitHub Actions 工作流程中加入了越來越多的集成測試。像其他酷炫的項目一樣,我們在每次 pull request、推送和發佈時運行測試。

然而,由於集成測試的性質,有時我們的工作流程會因為隨機原因而失敗。可能是網絡問題、瀏覽器中斷或其他難以重現的原因。

當工作流程失敗時,我們必須手動重新運行。開始時這不算大問題,但對於像我們這樣高效的開發者來說,仍然很煩人。

工作原理

在撰寫本文時,GitHub Actions 尚未提供自動重新運行失敗工作流程的內建方式。因此,讓我們拆解一下,看看如何實現這一目標。

當工作流程未在運行且已失敗時,你可以通過點擊 "Re-run jobs" 按鈕手動重新運行它。它會打開一個下拉菜單,並提供一個不錯的 "Re-run failed jobs" 選項,以跳過成功的作業。

因此,想法很簡單:

  1. 我們需要偵測工作流程何時失敗。
  2. 我們需要在工作流程結束之後觸發重新運行動作。

顯然,我們不能在同一個工作流程中執行這個操作,因為當工作流程未在運行時,它無法執行任何動作。我們需要另一個工作流程來監控前一個工作流程的狀態並觸發重新運行情動作。這可以如下圖示:

更新你的工作流程

在你的儲存庫中創建一個新的工作流程文件,例如,.github/workflows/rerun.yml

感謝 GitHub CLI,我們可以輕鬆地使用兩個簡單的命令來查看工作流程的狀態並重新運行它:

  • gh run watch 來觀看工作流程的狀態(文檔在這裡)。
  • gh run rerun 來重新運行工作流程。--failed 標誌將僅重新運行失敗的作業(文檔在這裡)。

你所需要做的只是提供失敗工作流程的 run_id,這可以通過使用 github.run_id 上下文完成。例如,你可以通過將以下步驟附加到原始工作流程來觸發重新運行工作流程:

if: failure() 條件只會在作業失敗時觸發這個步驟。fromJSON(github.run_attempt) < 3 條件將僅重新運行前兩次嘗試。你可以根據需要調整次數。

這個步驟使用 gh workflow run 命令觸發重新運行工作流程。查看文檔來獲取更多詳情。

額外:從失敗的分支運行重新運行工作流程

如果你想從失敗的分支而不是默認分支運行重新運行工作流程,可以使用以下命令:

如果是 pull request,則將使用 github.head_ref 上下文,否則將使用 github.ref_name

感謝

這個方法的想法最初來自這條 GitHub 討論評論