整條路徑大約是:push -> github -> dockerhub automated build -> jenkins pull images -> run containers for test -> deploy,這只是其中一種路徑,其實也可以是以 CI 為主,例如:push -> git -> Jenkins build image -> run for test -> publish this image or deploy。
FROM azole/testbase
# pull
RUN git clone https://github.com/azole/docker-auto-build-test.git
WORKDIR /docker-auto-build-test
RUN npm install
# run test
CMD ["npm", "test"]
建立 Jenkins 工作,在新增專案(或組態設定)的頁面,可以看到「建置觸發程序」裡頭多了一個「Run when a new image is built on DockerHub」,勾選起來,讓這個工作能接受來自於 dockerhub 的通知。
在建置的選項中,也可以看到多了一個「Pull Docker image from DockerHub」,在 Image ID 填上「azole/docker-auto-build-test」。每一個在步驟 2 有勾選「Run when a new image is built on DockerHub」的工作都會收到來自於 DockerHub 的通知,所以要設定這個 Image ID 來判斷是否是這個工作應該要處理的 dockerhub trigger。
現在來設定讓 DockerHub 發出通知。到 DockerHub 的網頁上,進入該 repo,網頁的右邊會有一個「Webhooks」,點選進去。按下「Add Webhook」,這邊輸入一個自己方便管理的名稱,然後在 URL1 的地方填「 http://[Jenkins Server]:8080/dockerhub-webhook/」,按下 save 後回到 Webhooks 的管理界面,可以看到剛剛新增的那組 webhook,有一個 Test 可以進行測試。
Automated Build on Docker Hub with Github and Jenkins
這個實驗的目標是利用 docker hub 的 automated build 的功能,做到每次 push request 到 github 時,就能自動建立該專案的測試 image。最後希望 dockerhub build 完之後,可以通知 Jenkins,把新 build 好的 image pull 下來,啟動進行測試。
整條路徑大約是:push -> github -> dockerhub automated build -> jenkins pull images -> run containers for test -> deploy,這只是其中一種路徑,其實也可以是以 CI 為主,例如:push -> git -> Jenkins build image -> run for test -> publish this image or deploy。
關於 docker 的基礎操作,歡迎參考這份投影片:Docker Tutorial
Part I: 建立 automated build 的 Repository
Part II: 建立測試用的 nodejs 專案
參考 https://github.com/alsotang/node-lessons/tree/master/lesson6 的內容,建立了 nodejs 的專案,因為不是這邊的重點,就請大家自己參考該連結,或是參考 https://github.com/azole/docker-auto-build-test 裡頭的程式碼。
這個專案裡頭,我們做了一個小小的 fibonacci 的功能,並且利用 mocha 做了測試,還有一個 Makefile,也在 package.json 中寫了 npm test。
當我把測試專案做好的時候,做了一次 commit/push,回到 docker hub 上去看,會發現又多了一筆 Build Details 的記錄,這表示 Github 跟 Docker hub 真的有連動起來,不過狀態依舊是 Error,因為我們還是沒有 Dockerfile。
Part III: Dockerfile
這個 Dockerfile 寫好後,可以自己先 build 起來測試看看,build 後 run 起來,應該會看到測試的結果。
這時候把 Dockerfile push 上 github,這時候會看到又多了一筆 Build Details,狀態是 Building,而 Dockerfile 這個分頁也已經抓到我們剛剛 push 上去的 Dockerfile 了。
稍等一段時間,就會看到狀態已經是 Finished,點進去看,也有整個 build 的過程的 logs 可以看。
Part IV: pull image and test
最後,我們測試看看,把這個 image pull 下來用用看。
Part V: 優化
這個 Dockerfile 其實還可以做更好的設計,例如:
於是 Dockerfile 就只剩下這些:
先把基礎環境做好,這就不用重複去 build 這些基礎的環境了,每次的 automated build 只需要從 pull 程式碼開始即可,image build 的速度會快上許多。
Part VI: 與 CI (Jenkins) 整合
目前在 Jenkins Plugins 已經可以找到幾個跟 docker 有關的 plugins,其中有一個 dockerhub plugin 看起來最符合這個實驗的情境,它可以搭配 dockerhub 的 webhooks,當 dockerhub build 好一個 image 時,通知 jenkins 去做一些事。
另外還有一個"Docker build step plugin",可以讓 jenkins 支援 docker 的命令:
當 DockerHub build 完後主動通知 Jenkins,Jenkins 透過 DockerHub Plugin 收到 trigger、也把 image pull 下來後,就可以透過 Docker build step plugin 來跑 container 或是做一些管理。
以上我們就完成了 push -> github -> dockerhub automated build -> jenkins pull images -> (run containers for test -> deploy) 的動作。
而 Docker build step plugin 支援的指令還不錯,也可以換個路徑嘗試,從 Jenkins 出發來控制這些,一如開頭提到的第二條路徑。
以上的範例是從無到有去建立,包括 github repo 與專案內容也是,步驟上可以視自己的情況去做,github repo, 專案內容, Dockerfile, docker hub repo 中只有 github repo 要先于 docker repo 建立,其他的順序都沒差。
補充:remote REST API 啟動方式
以 CentOS 來說,我是在 /etc/sysconfig/docker 這個檔案中加上
重新啟動 docker,這樣就生效了。可以利用 curl localhost:2375/images/json 來進行測試。