蒼時弦也
蒼時弦也
資深軟體工程師
發表於

Travis CI 的 Deploy 功能

最近收到一個 Issue 是關於我製作的 Heroku Buildpacks 有問題,沒辦法使用 Travis CI 的 Deploy 功能。

因為寫 Test 的習慣養成挺困難的,再加上獨自開發與大多是半遊玩性質的關係,其實幾乎沒有使用 Travis CI 的習慣,不過這次因為這個 Issue 我稍微研究了 Travis CI 的功能以及 Deploy 功能。

這算是一個很方便的功能,尤其是網站專案來說,如果在 Deploy 後馬上就發生問題,也是非常不方便。那麼,一般 Git 的專案來說,我們通常都是直接進行 Deploy 即使在本機事先做過一次測試,但是總是會有忘記的時候。

此時,透過持續整合服務的自動 Deploy 功能來協助,就可以在確保所有測試都沒問題的狀況下才進行 Deploy 也比較能夠自動化。

那麼,我們該如何開始呢?

如果已經在使用 Travis CI 可以直接打開 .travis.yml 檔案加入 deploy 的設定項。

1deploy:
2  provider: Heroku
3  api_key: xxx
4  app: my-auto-deploy-app

或者安裝 Travis CI 的 Command Line Tools 使用 travis setup Heroku 來自動生成。 不過這需要先有 .travis.yml 檔案存在,如果沒有的話可先使用 travis init 來進行初始化。

不過,如果直接將 API Key 以明碼儲存在 Public 的 Repository 上其實有點不妥,因此可以使用 travis encrypt 先行加密。

travis encrypt travis encrypt $(Heroku auth:token)

我們就會得到一串加密的字串(大概是用 Travis CI 上面的 Public Key 加密的,因此不用擔心會被解開,擁有 Private Key 的只有 Travis CI 本身。)

之後修改 .travis.yml 即可。

1deploy:
2  provider: Heroku
3  api_key:
4  	secure: encrypted-api-key
5  app: my-auto-deploy-app

上面基本上就是最為基本的使用,不過要注意的是,假設測試的版本有多個(Ex. PHP 5.4, PHP 5.5)那麼這個動作也會被執行兩次(預設情況)

後面就來談談官方文件上所敘述的其他運用方式吧! (這個 Deploy 功能也支援像是 OpenShift, AWS 等,可以依照情況使用。)

不同 Branch Deploy 到不同 Heroku APP

這個情況像是有 Production 之外,也許還會有 Staging 供內部測試時,就很方便。

1deploy:
2  provider: Heroku
3  api_key:
4  	secure: encrypted-api-key
5  app: 
6  	production: production-app
7    staging: staging-app

其實概念挺簡單好懂的,就是 branch: app 的格式。 (也支援 Deploy 到不同 Heroku 帳號,用法一樣只是改為寫在 api_key 項目下。)

僅有部分 Branch 需要 Deploy

一般來說我們的 Development 不會需要 Deploy 出去,但是每次跑 CI 的時候都會用 Development 去 Deploy 非常不方便,因此可以使用 on 來做設定。

1deploy:
2  provider: Heroku
3  api_key:
4  	secure: encrypted-api-key
5  app: my-auto-deploy-app
6  on: production

使用 travis setup Heroku 的話,會發現預設是 on 一個 repo 不過文件上似乎沒有詳細敘述,不過這個選項是支援多選的。

Deploy 後運行某些 Command

像是 Rails / Laravel 這類 Framework 在產生 Migration 一段時間後進入 Deploy 程序,就很容易忘記下 migrate 這個指令,我自己就碰過因為忘記下而讓網站死掉的情況⋯⋯

Travis CI 也很貼心地提供這個功能(甚至還有 after_deploy 可以做後續處理)

1deploy:
2  provider: Heroku
3  api_key:
4  	secure: encrypted-api-key
5  app: my-auto-deploy-app
6 	run:
7  	- "rake db:migrate"
8    - "rake assets:precompile"

如果只需要 rake db:migrate 直接寫在 run 後面就可以了。

整體來說很好理解,不過這個功能卻解決了網站在 Deploy 上的問題。 (像是需要使用 Capistrano 之類的來輔助才能完成之類的,如果是 PHP 專案也可以用 FTP 來上傳。)