我算是 Travis CI 的老用戶了。

以前 Travis CI 很慢,對 Docker 不友善,又很難 debug,讓我一度將重心轉移到後起之秀 CircleCI。後來 Travis CI 向 CircleCI 看齊,讓我們能夠 ssh 進去虛擬機 debug,兩者的差距已經逐漸縮小。所以,我自己的重要專案,總是盡量同時掛上 Travis CI 及 CircleCI,讓 CI pipeline 的核心在某種程度上也能盡量 reproducible 不被 lock in。

Travis CI 也提供許多常見的程式語言及伺服器軟體,以方便做 CI 測試。我個人的習慣是,盡量不去使用這些功能,而是直接用 Docker 或 Docker Compose 來組裝,以降低對於 Travis CI 的依賴(尤其我還要兼顧 CircleCI)。

不過,如果是與人合作的專案,就得顧及其他人的習慣。我在使用 Travis CI 提供的伺服器軟體 Postgres、Cassandra、RabbitMQ 時,遇到一些雷,特地記錄下來,供有類似困擾的人參考。

虛擬機版本

.travis.yml 檔案裡面可以指定 CI 虛擬機的 Ubuntu 版本1。若不特別指定,以現在(2020 年七月)來說,預設版本會是 Ubuntu 16.04 LTS,代號為 Xenial

我遇到一些專案,.travis.yml 指定的是代號為 Trusty 的 Ubuntu 14.04 LTS。由於 Trusty 的官方保固期限已於 2019-04 到期2,理論上來說,至少應該要升級到 2021-04 才到期的 Xenial 版,才比較安全。

事情並沒想像中那麼簡單。

我以兩個 repo 來示範:

譬如說,在原本使用 Trusty 的專案中跑得好好的 .travis.yml 檔,如果不假思索直接照搬到使用 Xenial 的專案,一下子就卡住了:

Travis CI Xenial 噴出錯誤

Travis CI Xenial 噴出錯誤

非常詭異。反覆實驗,總算找出需要修改的三個地方。

Postgres

使用 Trusty 虛擬機時,照著 Travis CI 官方指南及問題排除文件,我們可以順利安裝不同版本的 Postgres:

換成 Xenial 虛擬機時,不知為何,Postgres 的 port 居然靜悄悄地換成了 5432,而且沒有文件直接明講。

解決之道很簡單,直接修改相對應的變數:

Postgres 修改之處

Postgres 修改之處

你也可以直接點選這裡剪貼相關的設定內容。

Cassandra

使用 Trusty 虛擬機時,照著 Travis CI 官方指南,我們可以順利安裝不同版本的 Cassandra:

換成 Xenial 虛擬機時,不知為何,Cassandra 不再是 Travis CI 直接提供的資料庫了,而且沒有文件直接明講。

解決之道是自力救濟,自己下載,自己安裝3

Cassandra 修改之處

Cassandra 修改之處

你也可以直接點選這裡剪貼相關的設定內容。

RabbitMQ

使用 Trusty 虛擬機時,照著 Travis CI 官方指南及 Stack Overflow 問答庫,我們可以順利安裝 RabbitMQ 以及常用的 rabbitmqadmin 設定工具:

換成 Xenial 虛擬機時,這次官方文件總算有特別提醒對應的修改4。可惜 Travis CI 只做了一半,忘了啟動常見的 RabbitMQ Management Plugin

解決之道是自力救濟,自己開啟:

Cassandra 修改之處

Cassandra 修改之處

你也可以直接點選這裡剪貼相關的設定內容。

結語

代號為 Xenial 的 Ubuntu 16.04,官方保固期將於 2021-04 到期,若升級到代號為 Bionic,官方保固期到 2023-04 的 Ubuntu 18.04,免不了又要經歷一輪類似的修改。

據我目前初步測試,Travis CI 的 Bionic 虛擬機會遇到更多雷(難怪 Travis CI 目前仍然預設為 Xenial)。如果沒有其他考量,我還是強烈建議,直接用 Docker 或 Docker Compose 去設定 CI 所需動用的程式語言及伺服器軟體,以降低對於 Travis CI 的依賴,甚至預留轉換至 CircleCIGitHub Actions 的彈性。


  1. Travis CI 支援許多虛擬機,完整列表請見 “Build Environment Overview” 一文。 ↩︎

  2. Ubuntu version history 文件中,詳列了 Ubuntu 各版本代號及官方保固期限。 ↩︎

  3. 我參考 aiocassandra 專案的設定,將 Cassandra 安裝在 Travis CI 的 Xenial 虛擬機上:https://github.com/aio-libs/aiocassandra/blob/master/.travis.yml ↩︎

  4. 可能也是在官方論壇收到 “RabbitMQ on Xenial” 這則提問,Travis CI 才會把這一段解法放進官方文件吧。 ↩︎