You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
整條路徑大約是: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 來進行測試。
The text was updated successfully, but these errors were encountered: