← 回到所有文章

build 一直成功,繪圖功能卻早已失效

檢查通過,不代表它涵蓋了你以為它有檢查的事。

我的網站有一段時間,繪圖功能其實已經壞了,而每一次 build 都回報成功。

網站是先把文章轉成網頁,再整批發布出去。這個轉換的過程叫 build。文章裡如果寫了一段流程圖的描述,build 會呼叫一個繪圖工具,把描述畫成圖。

問題在於,build 只在「這篇文章真的有圖」的時候,才去找這個繪圖工具。

後來繪圖工具搬了位置,build 裡記的還是舊位置。照理說這時候應該出錯。可是當時網站上沒有任何一篇文章有圖,build 從頭到尾都沒去找它,所以一次都沒有出錯。

網站上沒有哪張圖因此消失,因為根本還沒有圖。壞掉的是繪圖功能本身:下一篇帶圖的文章一進來,就會畫不出來。在那之前,build 的成功什麼都沒有揭露。

沒有執行,和執行失敗卻回報成功,是兩件事

這件事讓我在意的,不是工具搬家,而是沒有任何東西告訴我。

這裡要先分清楚兩種情況。這次發生的是第一種:該做的事根本沒有執行。第二種是執行了、失敗了,卻回報成功。

第二種,這個網站早就防過。繪圖那一步失敗時會丟出錯誤,但網站產生器會把這個錯誤接住,記一筆在紀錄裡,然後繼續把 build 跑完,最後照樣回報成功,也就是 exit 0。這樣那一頁會照常發布,只是圖不見了;而發布流程只看 build 回報的結果,會把壞掉的頁面當成好的。

所以 build 的最後本來就有一道檢查:只要有任何一張圖沒畫出來,就讓整個 build 失敗。這一步放在網站產生器接不住錯誤的位置,不會被吞掉。

這道檢查是好的,但它只管第二種。它看的是「畫過的圖」,一張圖都沒畫,就沒有失敗可以記,它就永遠不會響。

就像警報器裝好了,也有電,但只裝在一間從來沒人進去的房間。它一直很安靜,你以為是因為沒事。

同一種毛病,我不是第一次碰到

回頭看,這種「沒出聲」的毛病,在別的地方各自出現過,也各自修過:

共同點是:回報的結果,跟實際發生的事對不上。工具沒打開檔案,卻說沒問題;系統自己壞了,卻說內容不合格;規則說有檢查,其實沒有。看到的訊號,都不是在回答你以為它在回答的問題。

這次繪圖工具的修法,用的是同一條原則:讓缺少的東西,在最早能發現的地方就出錯。

build 一開始,先確認繪圖工具在不在。網站產生器在啟動時就會載入這段設定,所以這裡一出錯,build 會在寫出任何頁面之前就停下,並印出它找的是哪個路徑。不必等到哪天真的有一篇文章帶圖,才發現工具早就不在了。

現在怎麼跑,以及我怎麼確認它有效

現在的 build 是這樣走的:

跟以前比,差別在第一步:一開頭就去找繪圖工具,不等到有圖才找。結尾那道檢查本來就在,現在兩道一前一後,一個管「工具在不在」,一個管「圖有沒有畫出來」。

中間那段快取也要看一下:畫過的圖會依內容存起來,之後的 build 直接拿來用,不會再呼叫繪圖工具。這一點,結尾會再回來談。

光是改完,我還不敢說它有效。這次出事的原因,正是「沒看到錯誤」被當成「沒有錯誤」。如果我只看到新的 build 是綠的,就等於用同一個方法再騙自己一次。

所以我做了幾個確認:

一道檢查,要親眼看過它失敗,才能相信它。

還沒解決的部分

這些檢查,只涵蓋我已經找到的這幾個地方。還有哪些地方也是安靜地略過、看起來一切正常,我現在不知道。

開頭那道檢查也只證明繪圖工具在,不證明它畫得出圖。真的動手畫,只發生在快取裡沒有這張圖的時候,例如遇到一張新的圖,或快取被清掉;其他時候 build 直接拿快取,不再呼叫繪圖工具。所以工具還在不在,每次 build 都知道;它還畫不畫得出來,要等下一次真的動手畫才知道。

至少現在我會多問一句:這次通過的檢查,真的有碰到我以為它在檢查的事嗎?

這類東西我常寫: LinkedIn 追蹤/ RSS 訂閱

← 回到所有文章
STAY CURIOUS.