改好推上去,網站卻沒更新?部署失敗這樣查
文 / Coolkid發布:2026-08-14閱讀約 7 分鐘

短答給趕時間的人:「推送成功」跟「上線成功」是兩件事。推送只是把檔案交出去,後面還有一段自動建置。建置失敗的話,網站會一直停在最後一次成功的舊版,而且多半不會有人通知你。排查三步:第一,看線上頁面的實際內容與更新時間,確認是不是真的舊版。第二,開一份乾淨的專案副本重跑建置,你本機會過、乾淨副本會出錯,那就是「檔案在本機、沒進 git」,git 就是程式檔案的版本紀錄庫。第三,查最近誰改過共用的資料檔,壞的常常不是你這筆。
這篇是一次真實事故的重演。
2026 年 7 月 23 日晚上,我更新了一篇文章、推送上去、畫面也顯示成功,結果網站上什麼都沒變。
因為當天下午另一次改動漏交了一個檔案,從那之後每一次自動建置都在失敗。
整個網站停在舊版好幾個小時,包括我晚上推的東西,全部被連坐。
從發現「怎麼沒變」到修好上線,整段排查大約 20 分鐘。
這篇把那 20 分鐘拆成你可以照抄的順序。
事故現場:推送都成功,網站全舊版
先講一次事發的經過。
我的網站是「推送到 git,雲端自動重新建置上線」這種架構,跑在 Vercel 上面,免費方案就已經有這個功能。
當天下午,一次改動在文章裡引用了一個新的詞條。
但詞條定義那個檔案只存在本機,忘了一起交進 git。
本機看一切正常,雲端拿到的專案卻缺了一塊,建置直接報錯停止。
重點是接下來這件事。
建置失敗的時候,網站不會壞掉、不會白畫面,只是安靜地繼續供應最後一次成功的舊版。
訪客看不出異狀,我也看不出異狀,推送照樣顯示成功,從下午到深夜,中間推的所有更新全部沒有上線。
而且沒有任何一個畫面主動告訴我這件事。
這就是「靜默失敗」:機器沒有出聲,你就以為一切健康。
可怕的地方在哪?你連要去查都想不到。
排查三步:網站沒更新該從哪裡查起?
- 第 1 步:確認線上到底是哪一版。別只按重新整理,直接看頁面上的「最後更新」日期,或者搜尋一段你新加的文字在不在。瀏覽器快取會騙人,先用無痕視窗把快取排除掉。還在舊版,才是真的沒上線。
- 第 2 步:開一份乾淨副本重跑建置。把專案從 git 重新取出一份,要乾淨的資料夾,不是你平常工作的那份,然後在裡面跑一次建置。你工作的那份會過、乾淨那份會出錯,答案就出來了:有檔案只存在你電腦,沒進 git。錯誤訊息會直接指出缺什麼。
- 第 3 步:查最近的共用改動。如果乾淨副本也能過,回頭看部署平台的紀錄,哪次建置開始失敗、錯在哪一行。多人或多對話協作的時候,特別注意「別人最近改了什麼共用檔案」。建置是整包一起做的,前面有一筆壞的,你後面推的全部連坐。
我當天的實際路徑,就是下面這三步。
第 1 步先確認真的沒上線。線上頁面的「最後更新」還停在舊日期嗎?
第 2 步定位:乾淨副本重跑,第一次就跳出「查無詞條」的錯誤。
第 3 步歸因:一看就是下午那筆改動引用了新詞條,而定義檔沒有進 git,所以雲端那邊拿到的專案就缺了一塊。
補交那個檔案,推送,幾分鐘後全部更新一起上線。
兩個機制教訓:失敗了,為什麼沒人看見?
第一個教訓有點反直覺:建置報錯停止,為什麼反而是「對的設計」?
我的建置系統遇到「文章引用了不存在的詞條」會直接罷工,而不是裝作沒事,出一個缺了一塊的網站給訪客看到。
這叫 fail-fast,中文可以說成快速失敗:錯誤在第一關就大聲報錯,好過安靜地流到訪客面前。
這次事故裡,建置系統做對了自己的工作,把有問題的版本擋在門外。
真正的洞在第二個環節:失敗了,但沒人看見。
部署平台其實會記錄失敗,有的也會寄信。
但那些訊息常常不在你第一時間會看的地方,於是「大聲失敗」就變成「在沒人的房間裡大聲失敗」,等於根本沒失敗。
這個洞要怎麼補起來?修法其實很便宜。
把部署平台的失敗通知打開,寄到信箱或者通訊軟體都行。
或者養成「推完重要更新,30 秒後開無痕視窗看一眼線上頁」的習慣。
我自己是兩個都做,再加一條規矩:凡是「推送成功」的回報,一律附上線上驗證的證據,不拿推送當上線。
口訣:推送成功 ≠ 上線成功。系統要大聲失敗,失敗要有人看見,兩個缺一個,都是靜默失敗。
三個坑,加一個起手式
- 「我本機是好的」所以不信建置壞了。本機恰恰是最不可信的證人,你桌上什麼檔案都有,雲端只有 git 裡的東西。乾淨副本才是跟雲端同一個世界。
- 只查自己這筆改動。建置失敗會連坐,你的改動可能完全沒問題,壞的是幾小時前另一筆。往前翻,別對著自己的改動鑽牛角尖。
- 改共用資料檔不一起交。這次的根因就是這個,文章與詞條定義分屬兩個檔案,引用進了 git、定義留在本機。教訓是一個改動牽到幾個檔案,就一起交,別分批。
新手的起手式只要 30 秒就做完。
現在就去你的部署平台把「失敗通知」打開,Vercel 在專案設定的 Notifications 裡,免費方案就有。
這大概是本篇價值最高的 30 秒。
然後記住那句口訣,下次網站「怎麼沒變」的時候,照三步走,不用慌。
推送成功不等於上線成功。自動部署的建置失敗是安靜的,網站不會壞,只是一直停在最後一次成功的舊版,訪客與你都看不出異狀。真實事故發生在 2026-07-23,一筆改動引用了新詞條但定義檔沒進 git,之後每次建置全部失敗,所有更新連坐好幾個小時。排查三步:第一,看線上頁的「最後更新」與新內容在不在,先用無痕視窗排除瀏覽器快取。第二,乾淨副本重跑建置,本機會過、乾淨副本會出錯,就是檔案沒進 git。第三,查最近的共用改動,壞的可能不是你這筆。機制教訓是 fail-fast 報錯停止是對的設計,但「大聲失敗」要配上「有人看見」,所以去部署平台把失敗通知打開,推完重要更新用無痕視窗驗一眼線上頁,不拿推送當上線。
名詞解釋
- 部署(deploy)
- 把做好的網站或程式「推上線」讓所有人用得到的動作。
- Vercel
- 把網站免費發佈到網路上的服務:接上 GitHub 後,每次推程式碼就自動更新網站,個人專案免費方案就夠用。
- Git
- 程式碼的版本紀錄系統:每次改動存成一個「存檔點」(commit),隨時可以回溯、比對、還原,不怕改壞。
- 提交(commit)
- Git 的一個存檔點:把這次改動連同一句說明記錄下來,之後隨時可以回到這個版本。
- 快取(cache)
- 把載過的資源暫存起來,下次直接用、不重新下載。網站變快的最便宜手段之一。
▸ 常見問題
推送成功了,為什麼網站還是舊的?
「推送」只是把檔案交給 git,後面還有一段自動建置與部署。建置失敗的話,網站會繼續供應最後一次成功的舊版,而且預設多半不會通知你。先用無痕視窗排除瀏覽器快取,再看頁面上的「最後更新」日期。真是舊版,就去部署平台看建置紀錄,通常會看到紅色的失敗。
本機跑起來明明是好的,為什麼雲端建置會失敗?
因為本機和雲端拿到的專案不一樣:你桌上什麼檔案都有,雲端只拿得到 git 裡的東西。最常見的原因就是「有檔案改了但沒交進 git」。驗證方法是把專案從 git 重新取出一份乾淨副本,在裡面跑建置,乾淨副本出錯的那個訊息,就是雲端看到的錯誤。
怎麼第一時間知道部署失敗?
把部署平台的失敗通知打開。Vercel 這類服務在專案設定的 Notifications 裡就有,免費方案可用,可以寄信或者接通訊軟體。再配一個便宜的習慣:推完重要更新,30 秒後開無痕視窗看一眼線上頁面。兩層都有,靜默失敗就變成大聲失敗。
我的改動沒問題,也會被別人的失敗影響嗎?
會,這叫連坐。自動建置是整包專案一起做的,只要有一筆改動讓建置失敗,之後所有更新都上不了線,直到那筆被修好。所以排查的時候別只盯著自己的改動,看建置紀錄「從哪一次開始失敗」,那一次才是根因。
看完這篇之前先確認:
- 改好也推上去了,網站卻一直是舊版的人
- 用 Vercel 這類「推送自動部署」服務的人
- 想學一套 10 分鐘定位「為什麼沒上線」的排查順序
- 還沒把網站放上線 (先看部署那篇)
- 頁面有更新只是樣式跑版 (那是另一類問題)
- 沒在用自動部署、手動上傳檔案的人
