Jenkins+Docker+Github的自動化部署

CI跟自動化部署的工具之前就想要嘗試了

這次因緣際會下試著去建立整個流程

實驗環境:CentOS 7

Jenkins跟Github等都很有名了,這裡就不再贅述

底下示範Docker在CentOS上安裝的範例

登入CentOS之後

 $sudo yum install device-mapper-event-libs #安裝必須套件
 $sudo yum -y install docker-io #安裝docker
 $sudo service docker start #啟動docker伺服器

這樣docker就裝好了,接下來可以輸入docker,應該會出現下面畫面

之後就是在DockerHub上尋找自己想要的服務照著說明啟動即可

Jenkins我就直接用Docker去啟動了

docker run --name myjenkins -p 8080:8080 -v /var/jenkins_home jenkins

原本也想用Docker去起一個GitLab的,試了一下有點複雜最後決定直接用Github

自動化部署的情境模擬如下

總共有三個主要元件

1. Repository (Github)
2. CI Tool (Jenkins)
3. Docker

我想用CentOS去建立一個以Ubuntu為基底的容器服務

1.我從筆電這邊commit code並push到github
2.位於CentOS-1的Jenkins會借由SCM Polling得知有新的commit
3.Jenkins會去觸發事件去CentOS-2進行docker服務的自動部署
4~6 進行docker重建及服務重啟

Jenkins上的設定

從Jenkins管理去安裝以下plugin

1. GIT plugin, Git Parameter Plug-In等(跟Git互動)
2. SSH plugin(登入遠端操作)

之後到Jenkins的系統設定去設定CentOS-2的登入資訊

之後產生一個新的job並設定如下

  1. Git repo.(這邊設定了我的Github位置)

  2. SCM Polling(這裡設定每兩分鐘檢查一次有沒有新的commit)

  3. Build設定(這裡設定去CentOS-2進行docker服務重建)

touch /root/myservice/dummy #For skipping cache of building docker image
docker build -t myservice /root/myservice #Re-build docker container
docker ps |grep myservice |awk '{print $1}' |xargs -i docker stop {} #Stop old container
docker run -d -p 80:80 myservice  #start container

第一步是為了取消掉docker build的cache功能而作的假檔案
雖說好像dockerfile後面的版本有支援nocache的指定,但這邊還是先用早期避開快取的方法
第二步是重建docker container
第三步是停止已經在執行的服務
第四步是啟動新的服務

接下來是在CentOS-2建立dockerfile

 $mkdir /root/myservice
 $vim /root/myservice/Dockerfile

Dockerfile的內容如下

 FROM ubuntu:trusty       #Base image
 RUN apt-get install -y git python
 EXPOSE 80
 ADD dummy /tmp/ #For skipping build cache 
 RUN git clone https://github.com/del680202/simple-python-http-server.git
 CMD python simple-python-http-server/test.py #Start service

在ADD之後的指令將不會被cache,因此可以達到程式碼更新的目的
而ADD之前的指令則因為會被cache而不用浪費時間重做

這樣一來自動部署的流程就算完成了

之後就可以開始進行測試

 git clone  ...
 vim ...
 git add ...
 git commit ...
 git push -u origin master

在這個情境裡面每當我push一次程式碼,Jenkins就會自動通知CentOS-2去進行更新部署

這邊只是對自動部署簡單做個筆記

實際上應該還要加上測試等流程才算完善,之後有機會在往下研究

comments powered by Disqus