繁體中文(台灣)
  • github
  • automation

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

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

Gao
Gao
Founder

介紹

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

隨著我們的專案成長,我們在 GitHub Actions 工作流程中添加了越來越多的整合測試。像其他酷炫的專案一樣,我們對每個拉取請求、推送和發佈都進行測試。

然而,由於整合測試的特性,有時候我們的工作流程會因為隨機無法重現的原因而失敗。可能是網路問題、瀏覽器故障或其他原因。

當工作流程失敗時,我們需要手動重執行。這在一開始不是什麼大問題,但對於像我們這樣的高效率開發者仍然很煩人。

它如何運作

在撰寫本文時,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 context 來完成。例如,你可以透過在原始工作流程中附加以下步驟來觸發重執行工作流程:

if: failure() 條件將只在工作失敗時觸發此步驟。fromJSON(github.run_attempt) < 3 條件將只重執行前 2 次嘗試。你可以根據需要調整數值。

此步驟使用 gh workflow run 命令來觸發重執行工作流程。詳情請參閱文檔

額外:從失敗的分支中執行重執行工作流程

如果你希望從失敗的分支而不是預設分支中重執行重執行工作流程,你可以使用以下命令:

如果是拉取請求,將使用 github.head_ref context,否則將使用 github.ref_name

致謝

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