1. 程式人生 > >Jenkins持續整合構建Docker容器

Jenkins持續整合構建Docker容器

本文分兩部分,第一部分是手動計劃任務的方式構建Github上的Docker程式,第二部分是用Github webhook Trigger一個自動構建任務。

Jenkins採用2.5版本

Docker採用1.7.1

程式碼託管使用的Github官網

系統為IBM Bluemix提供的Cent6.7,伺服器地址在美國南加州

1.1 建立一個Freestyle Project, let's say jenkins-docker

1.2 Set workplace to /var/lib/jenkins/jobs/jenkins-docker/workplace

1.3 Add Github address:

[email protected]:sangrealest/Jenkins_Docker_Ansible.git

wKiom1dOjZCirvA-AABBLY1dACQ440.png

Dockerfile 很簡單,就是拉取最新的Nginx,並將2048遊戲新增到Nginx根目錄

1 2 3 4 5 FROM nginx:latest MAINTAINER Shanker [email protected] ADD 2048-master /usr/share/nginx/html ADD testfile /root/ EXPOSE 80

1.4 Under Build Triggers, set Poll SCM: H * * * *

1.5 Under Build->Execute shell, use below shell script:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/sh                                                                                                                                                             echo '>>> Get old container id'
CID=$(docker ps grep "jenkins-docker" awk '{print $1}') echo $CID sudo /usr/bin/docker build -t jenkins-docker /var/lib/jenkins/jobs/jenkins-docker/workspace tee /var/lib/jenkins/jobs/jenkins-docker/workspace/Docker_build_result.log echo '>>> Stopping old container' if "$CID" != "" ];then sudo  /usr/bin/docker stop $CID fi echo '>>> Restarting docker' sudo service docker restart sleep 5 echo '>>> Starting new container' sudo /usr/bin/docker run -p 3000:80 -d jenkins-docker

1.6 配置jenkins使用者

因為jenkins service是用jenkins使用者啟動的,所有要執行docker相關命令需要將jenkins加入到docker group,賦予jenkins sudo without password

1 2 3 sudo usermod -G docker jenkins visudo, add bellow  jenkins ALL=(ALL:ALL) NOPASSWD: ALL"

然後Build Project, 如果成開啟執行Jenkins機器的3000埠會看到2048遊戲的介面:

wKioL1dOjo7x5sM9AACmlmcwJIQ316.jpg

以上的構建是基於計劃任務的,每小時的隨機分鐘內執行一次構建任務(SCM H * * * *),然後懶人還有懶人的做法,就是新增Github webhook功能,當push一個更新的時候自動trigger一次構建。

2.1 在Github個人主頁上安裝Github Plugin並新增你的Jenkins server的webhook地址:比如我的Jenkins地址是mywebsite.com:8080,這裡要寫的地址就應該是http://mywebsite.com:8080/github-webhook

wKiom1dOjZHC8bMRAACTcKiF3e0342.png

2.2 返回jenkins-docker專案首頁,點選 Configure, 新增Github的賬號密碼資訊,因為我用的個人倉庫,需要使用私鑰認證,選擇Certificate, 將放在jenkins home/.ssh 下的私鑰路徑填上:

wKiom1dOkjfw6BaVAAB_E-u85nU272.png

2.3 Build Triggers 勾上Build when a change is pushed to Github

wKiom1dOkoLjuc33AAAeVi9QNlo010.png-wh_50

2.4 這時候可以更新一下Github Project下面的檔案並且push一下,看看是否觸發了jenkins的構建動作:

如圖,我剛push完成,jenkins這邊就已經捕捉到並且開始構建新的任務:

wKioL1dOjo-xU9knAABNgUIP3wU886.png

wKiom1dOjZDBti__AAA24eoZ0pk763.png

我們在Github專案地下echo 一句話到testfile,並且新增到容器的/root下時間是7:49:58,然後我的容器更新後並啟動執行的時間是7:50:26,只用了28秒鐘就構建成功了!

wKioL1dOlTvizHByAABnK78qFsU500.png

wKioL1dOlTuzrXisAAAvF5xnFWE298.png

有了這樣的整合,後續我們就可以考慮將Ansible也加進來,做持續部署,當把jenkins pipeline, docker, ansible都整合到一起,就是CI/CD完全整合工作了,或者用Mesos+Marathon+Docker雲資料中心的方式來做持續部署。