前一篇寫了『用 Travis 自動上傳 Docker Image』,Travis 跑完測試成功後才自動編譯 Docker Image 並且上傳到 Docker Hub。在每次 commit 後,Travis 執行 docker build 時間總是非常長,當然原因很多。如果選用的 Docker base image 非常肥,指令非常多,每次編譯都要重新下載及執行指令,所以執行時間就是這麼長。本篇就是想辦法減少 Travis 編譯 Image 時間,就像把
node_modules
壓縮起來,下次執行測試前先解壓縮再安裝,可以大幅減少 npm install 時間(可以參考之前的『用一行指令加速 npm install』)。這邊我們就需要用到 Travis 的 Cache 功能。
啟動 Travis Cache 快取服務
啟動方式如下:cache: directories: - ${HOME}/docker假設有其他目錄需要 cache,像是 npm 的
node_module
或是 Laravel 的 vendor
,都可以透過此方式設定。
讀取 Docker Cache 快取
在before_install
內透過 docker load 指令讀取 cache 資料
before_install: - if [ -f ${DOCKER_CACHE_FILE} ]; then gunzip -c ${DOCKER_CACHE_FILE} | docker load; fi其中 DOCKER_CACHE_FILE 可以定義在 env 內
env: global: - DOCKER_CACHE_FILE=${HOME}/docker/cache.tar.gz
儲存 Docker Image cache 快取
經過測試及編譯 Image 後,就可以進行 儲存 Docker 快取script: # 進行測試 - make test # 編譯 Image - make docker # 儲存快取 - if [ "$TRAVIS_BRANCH" == "master" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then mkdir -p $(dirname ${DOCKER_CACHE_FILE}); docker save $(docker history -q appleboy/drone-line:latest | grep -v '<missing>') | gzip > ${DOCKER_CACHE_FILE}; fi透過 docker save 指令將 Image 存起來,這樣下次再執行編譯 Image 時,就會先找看看是否有快取。上面設定只有 master branch 才會儲存快取,但是在任何一個 branch 都可以享受到快取的服務喔。