Travis CI 宣佈預設 Trusty 為預設 Linux 讓你 runner 失敗該怎麼辦?

Reference: https://blog.travis-ci.com/2017-07-11-trusty-as-default-linux-is-coming

最近因為 Travis CI 更新的關係,讓 Travis CI 發生錯誤。我服務的公司的 code 是 python/django 開發環境,字串大部份是以中文處理,當 unittest 是比對中文字串的話,會遇到中文字串亂碼問題,如下:

u'????????' != u'\u521b\u610f\u4f5c\u54c1\u6807\u9898\u6d4b\u8bd5'

其實 application setting 或是 CI config 都應該儘量貼近 production 環境去做對應設定,讓系統上線前,確保邏輯上運作無誤。

解決方法如下,這樣可以解決資料庫讀取中文卻是亂碼的問題了:

DATABASES = {
'default': {
'TEST': {
'CHARSET': 'utf8',
'COLLATION': 'utf8_general_ci',
},
},
}

順便一提,我個人認為 CI 目的是:

一個模擬 production 軟體環境下並驗證系統邏輯正確性的方法。

為了實踐「模擬 production 軟體環境」原則,開發人員不應以嫌棄 CI 運作不夠快而隨意更替 service,例如說,把 mysql 換成 sqlite 之類。

如果有加速的需求話,是可以另開一個 runner 為搭配輕量的 service 來完成驗證過程,當該 runner 完成後,可以令 Pull request 獲得 allow merging 的權限。尤其是 developer 被時程追殺,卻卡在 CI 執行緩慢,又不想實施 admin 權限來強制完成 PR 做 merge 時候,對他們來說,會是一個解套。

但嚴格來說,在時間寬裕的前提下,還是得要遵守模擬真實 production 的 runner 執行完畢,才算是可以 merge 的 PR。