聚會時間公告: 因應COSCUP 2011, Kalug 8月份休會一次

九月 17, 2016

小惡魔AppleBOY
AppleBOY
is about »

tag cloud

» 在 Travis 實現 Docker Cache

docker 前一篇寫了『用 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,像是 npmnode_module 或是 Laravelvendor,都可以透過此方式設定。

讀取 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 都可以享受到快取的服務喔。

» 用 Travis 自動上傳 Docker Image 到 Docker Registry

docker 在今年七月寫了一篇『在 Travis 升級 Docker 和 docker-compose 版本』,就在上個月底 Travis 終於將 Docker 預設版本換成 1.12.x 版本,並且將 docker-compose 也一併升級到 1.8.0,這樣就可以不用手動升級了。那這篇會紀錄如何用 Travis 自動編譯 Docker Image 並且上傳到 Docker Hub。Docker Hub 提供兩種方式讓開發者上傳 Image,第一種是透過 Command line 下指令手動上傳,另外一種則是在 Docker Hub 後台指定 Dockerfile 路徑及需要執行編譯的分支,這樣只要 Push commit 到 Github,Docker Hub 就會根據 Dockerfile 來自動編譯 Docker Image。本篇會介紹如何透過 Travis 服務來自動上傳 Dokcer Image,像是 Golang 的部屬方式通常是編譯出 Binary 執行檔後,將此執行檔加入 Image 最後才上傳。

在 Travis 啟動 Docker Service

啟動方式非常簡單,只要加入底下程式碼到 .travis.yml
services:
  - docker

準備 Dockerfile 編譯 Image

我們用 Golang 為例,底下是 Dockerfile 範例
FROM alpine:3.4

RUN apk update && \
  apk add \
    ca-certificates && \
  rm -rf /var/cache/apk/*

ADD drone-line /bin/
ENTRYPOINT ["/bin/drone-line"]
接著透過底下指令編譯出 Dokcer Image
$ docker build --rm -t $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE) .
DEPLOY_ACCOUNT 是 Dokcer hub 帳號,以我的帳號為例就是 appleboyDEPLOY_IMAGE 則是 Image 名稱。請將這指令寫道 .travis.yml 內的 script
script:
  # 執行測試
  - make test
  # 通過測試後開始編譯 Image
  - docker build --rm -t $DEPLOY_ACCOUNT/$DEPLOY_IMAGE .
最後一道指令就是上傳了

上傳 Image 到 Docker Hub

由於上傳到 Docker Hub,需要登入帳號密碼,而 Travis 提供兩種方式讓開發者設定 Private global value,你不會想把帳號密碼用明碼方式寫在 .travis.yml 吧。在早期 Travis 只提供一種方式就是透過 travis 指令來新增,詳細指令可以參考這文件,這邊就不教大家指令了,而另一種方式就是到 Travis 管理頁面直接進到 settings 設定即可 Screen Shot 2016-09-17 at 3.03.12 PM 將帳號密碼設定完成後,請在 after_success 加上上傳指令
after_success:
  - if [ "$TRAVIS_BRANCH" == "master" ] && [ "$TRAVIS_GO_VERSION" == "1.7.1" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then
    docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD";
    make docker_deploy tag=latest;
    fi
上面表示只要是 master 分支,測試環境為 Golang 1.7.1 且不是在 Pull Request 狀態就執行登入,並且上傳,其中 make docker_deploy tag=latest 代表意思如下 (我把指令寫在 Makefile 內):
docker tag $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE):latest $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE):$(tag)
docker push $(DEPLOY_ACCOUNT)/$(DEPLOY_IMAGE):$(tag)
上面步驟完成,之後只要 commit 到主分支,Travis 就會自動編譯 Image 並且上傳到 Dokcer Hub,蠻方便的。

七月 25, 2016

小惡魔AppleBOY
AppleBOY
is about »

tag cloud

» 在 Travis 升級 Docker 和 docker-compose 版本

docker Travis 是在 Github 上常用的整合測試服務,支援了各種程式語言 Golang, PHP, Node.js ..等測試及部署,也同時支援了一些常用 Service,像是 Docker, Redis 或 Database。這次來聊聊在 Travis 如何使用 Docker,在 Travis 內建的 Docker 跟 docker-compose 版本都是非常舊,所以使用預設的 docker-compose 指令常常會出現 (詳細 build log 可以參考這裡)

Error log

會有兩種錯誤訊息,第一種是
docker-compose -f docker/docker-compose.yml run golang-build Creating network “docker_default” with the default driver ERROR: 404 page not found make: *** [test] Error 1
第二種是
docker-compose -f docker/docker-compose.yml run golang-build Unsupported config option for services service: ‘golang-build’ make: *** [test] Error 1

解法

雖然官方網站有教如何升級 docker-compose,但是光是升級 docker-compose 是沒用的,如果 docker-engine 沒有升級,還是會出現此錯誤訊息,正確解法就是將 docker 也順便升級,打開 .travis.yml 檔案,在 before_install 內補上底下 script。
services:
  - docker

env:
  DOCKER_COMPOSE_VERSION: 1.7.1

before_install:
  - sudo apt-get -y update
  - sudo apt-get -y purge docker-engine
  - sudo apt-get -y install docker-engine
  - sudo rm /usr/local/bin/docker-compose
  - curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose
  - chmod +x docker-compose
  - sudo mv docker-compose /usr/local/bin
請參考完整的 .travis.yml 設定檔

support:

biggo.com.tw

A Django site.