深度!使用阿里雲容器服務實現持續集成和Docker鏡像構建
持續集成作為敏捷開發重要的一步,其目的在於讓產品快速迭代的同時,儘可能保持高質量。每一次代碼更新,都要通過自動化測試來檢測代碼和功能的正確性,只有通過自動測試的代碼才能進行後續的交付和部署。本文主要介紹如何將時下最流行的持續集成工具之一的Jenkins結合阿里雲容器服務,實現自動測試和鏡像構建推送。
接下來的演示是如何通過阿里雲容器服務Jenkins實現自動測試和Docker鏡像構建,實現高質量的持續集成。
具體場景:每次代碼提交到GitHub上的nodejs的項目中,阿里雲容器服務Jenkins都會自動觸發單元測試,測試通過則繼續鏡像構建及推送到目標鏡像倉庫中,最後郵件通知結果。大致流程如下圖所示:
Advertisements
slave-nodejs-ut是用來進行單元測試的slave節點。
slave-nodejs-image-build是用來進行build鏡像和推送鏡像的slave節點。
1.使用容器服務部署Jebkins
1.1 創建Jenkins編排模版
新建模版,以如下內容為基礎,創建編排。
jenkins:
image: 'registry.aliyuncs.com/acs-sample/jenkins:1.651.2-alpine'
ports:
- '8080:8080'
- '50000:50000'
volumes:
- /var/lib/docker/jenkins:/var/jenkins_home
privileged: true
Advertisements
restart: always
environment:
- user=1000
labels:
aliyun.scale: '1'
aliyun.probe.url: 'tcp://container:8080'
aliyun.probe.initial_delay_seconds: '10'
aliyun.routing.port_8080: jenkins
1.2 創建Jenkins應用
當然也可以直接使用阿里雲提供的jenkins示例模版創建Jenkins應用。
打開容器服務提供的訪問端點,就可以使用剛剛部署的jenkins應用。
Jenkins是基於Java開發的一種開源持續集成工具,監控並觸發持續重複的工作,具有開源,支持多平台和插件擴展,安裝簡單,界面化管理等特點。Jenkins使用job來描述每一步工作,節點是用來執行項目的環境。Master節點是Jenkins job的默認執行環境,也是Jenkins應用本身的安裝環境。
2.Jenkins相關介紹
2.1 master/slave
master/slave相當於server和agent的概念。master提供web介面讓用戶來管理job和slave,job可以運行在master本機或者被分配到slave上運行。一個master可以關聯多個slave用來為不同的job或相同的job的不同配置來服務。
可以通過配置多個slave為不同項目準備單獨的測試和構建環境。
2.2 配置Jenkins插件
如果代碼託管在GitHub中,安裝Git plugin和GitHub plugin來實現代碼變更自動觸發Jenkins job。
如果直接安裝不成功,可以通過http://updates.jenkins-ci.org/download/plugins/手動下載 .hpi文件安裝。
Tips: 本文中提到的Jenkins job和項目均指的是Jenkins一個構建單元,執行單元。
3. 使用容器服務實現自動化測試
3.1 創建slave-nodejs-ut鏡像
本示例在本地創建slave-nodejs-ut鏡像,然後將鏡像推送到容器服務Hub。
首先在Dockerfile所在路徑下執行如下命令創建鏡像。
docker build –t qinyujia-test/slave-nodejs-ut .
Dockerfile如下:
# Docker-in-Docker Jenkins Slave
# See: https://github.com/tehranian/dind-jenkins-slave
# See: https://dantehranian.wordpress.com/2014/10/25/building-docker-images-within-docker-containers-via-jenkins/
# Following the best practices outlined in:
# http://jonathan.bergknoff.com/journal/building-good-docker-images
FROM evarga/jenkins-slave
ENV DEBIAN_FRONTEND noninteractive
# Adapted from: https://registry.hub.docker.com/u/jpetazzo/dind/dockerfile/
# Let's start with some basic stuff.
RUN apt-get update -qq && apt-get install -qqy \
apt-transport-https \
ca-certificates \
curl \
lxc \
iptables && \
rm -rf /var/lib/apt/lists/*
RUN echo deb https://apt.dockerproject.org/repo ubuntu-trusty main > /etc/apt/sources.list.d/docker.list && \
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
ENV DOCKER_VERSION 1.11.1-0~trusty
# Install Docker from Docker Inc. repositories.
RUN apt-get update && apt-get install -y docker-engine=$DOCKER_VERSION && rm -rf /var/lib/apt/lists/*
ADD wrapdocker /usr/local/bin/wrapdocker
RUN chmod +x /usr/local/bin/wrapdocker
VOLUME /var/lib/docker
# Make sure that the "jenkins" user from evarga's image is part of the "docker"
# group. Needed to access the docker daemon's unix socket.
RUN usermod -a -G docker jenkins
# place the jenkins slave startup script into the container
ADD jenkins-slave-startup.sh /
CMD ["/jenkins-slave-startup.sh"]
# Install nodejs for demo purpose
RUN curl -sL https://deb.nodesource.com/setup | sudo bash -
RUN apt-get install -y nodejs
在容器服務主頁選擇鏡像,新建鏡像。
輸入倉庫名稱,設置代碼源為本地倉庫。
通過如下指令將slave-nodejs-ut鏡像推送到阿里雲容器Hub。
3.2 使用編排模版創建slave-nodejs-ut容器
slave-nodejs-ut編排模版如下:
slave-nodejs-ut:
image: 'registry.aliyuncs.com/qinyujia-test/slave-nodejs-ut'
privileged: true
restart: always
labels:
aliyun.scale: '1'
3.3 將slave-nodejs-ut容器配置成Jenkins的slave節點
打開Jenkins應用,進入系統設置界面,選擇管理節點,新建節點,配置相應參數。如下圖所示。
Note1: 標籤為slave的唯一標識。
Note2: slave容器和Jenkins容器同時運行在阿里雲平台上,因此填寫外網訪問不到的容器節點IP,隔離測試環境。
Note3: 添加Credential的時候,使用創建slave-nodejs-ut鏡像的Dockerfile里的Jenkins帳戶和密碼。
3.4 創建項目實現自動化測試
新建Item,選擇構建一個自由風格的軟體項目。
填寫項目名稱,並選擇項目運行節點,此示例填寫上述準備的slave-nodejs-ut節點。默認情況下,Jenkins會使用master節點,也就是Jenkins運行主機作為項目運行節點,很可能因為缺少各種環境配置導致測試失敗。即使能夠執行成功,我們仍然更推薦使用slave節點來執行項目。
配置源碼管理和代碼分支,此示例中源代碼使用GitHub管理。
配置構建觸發器,此示例採用結合GitHub Webhooks & services實現自動觸發項目執行。
最後在GitHub中添加Jenkins的service hook,完成自動觸發實現。
在GitHub 項目主頁點擊settings tab,左側菜單欄選擇Webhooks & services, Add Service,下拉框中選擇Jenkins(Git plugin)。
在Jenkins hook url對話框中填寫${Jenkins IP}/github-webhook/, eg:
http://jenkins.cd****************.cn-beijing.alicontainer.com/github-webhook/
增加Execute shell類型的構建步驟,編寫shell腳本執行測試。
本示例中的Command如下:
pwd
ls
cd chapter2
npm test
4. 使用阿里雲容器服務實現自動化構建,推送鏡像
本章節與章節3中相同的配置就不重複編寫,重點說明需要注意的地方。
4.1 使用阿里雲容器服務創建slave-nodejs-image-build容器
使用章節3中的模板和鏡像,創建進行構建鏡像,推送鏡像的slave-nodejs-image-build容器。
4.2 將slave-nodejs-image-build容器配置成Jenkins的slave節點
打開Jenkins應用,進入系統設置界面,選擇管理節點,新建節點,配置相應參數。如下圖所示。
4.3 創建項目實現自動構建,推送鏡像
執行job的節點配置為slave-nodejs-image-build。
如果希望每次在單元測試成功之後再執行自動構建鏡像,設置如下觸發器。
最後編寫構建鏡像和推送鏡像的shell腳本。
本示例的Command如下:
cd chapter2
docker build -t registry.aliyuncs.com/qinyujia-test/nodejs-demo .
docker login -u ${yourAccount} -p ${yourPassword} registry.aliyuncs.com
docker push registry.aliyuncs.com/qinyujia-test/nodejs-demo
5. 自動重新布局應用
5.1 首次部署應用
使用編排模板,將章節4中創建的鏡像部署到容器服務中,創建nodejs-demo應用。示例如下:
express:
image: 'registry.aliyuncs.com/qinyujia-test/nodejs-demo'
expose:
- '22'
- '3000'
restart: always
labels:
aliyun.routing.port_3000: express
5.2 自動重新部署
選擇剛剛創建的應用nodejs-demo, 創建觸發器。
在章節4.3的shell腳本中添加一行,地址即為上文創建的觸發器給出的觸發器鏈接。
curl 『https://cs.console.aliyun.com/hook/trigger?triggerUrl=***==&secret=***』
把4.3中的示例的Command改為:
cd chapter2
docker build -t registry.aliyuncs.com/qinyujia-test/nodejs-demo .
docker login -u ${yourAccount} -p ${yourPassword} registry.aliyuncs.com
docker push registry.aliyuncs.com/qinyujia-test/nodejs-demo
curl 『https://cs.console.aliyun.com/hook/trigger?triggerUrl=***==&secret=***』
到此,鏡像推送之後,Jenkins會自動觸發重新部署nodejs-demo應用。
6. 配置郵件推送結果
如果希望單元測試或者鏡像構建的結果能夠通過郵件推送給相關開發人員或者項目執行發起者。可以通過如下配置來實現。
首先在Jenkins主頁,選擇系統管理,系統設置,配置Jenkins系統管理員郵箱。
安裝Extended Email Notification plugin,配置SMTP server等相關信息,並設置默認郵件接收人列表。如下圖所示。
以上是Jenkins應用系統參數設置,下面是為需要用郵件推送結果的Jenkins項目進行相關配置。
在Jenkins項目中添加構建后操作步驟,選擇Editable Email Notification類型,填寫郵件接收人列表。
添加郵件發送觸發器。
7. 總結
利用Docker鏡像和Compose模版,容器服務就能快速創建自動測試和構建的環境,簡化持續集成的環境搭建和擴展。容器服務提供的監控,日誌,存儲等功能,進一步為用戶提供方便統一,功能完善的各種環境管理。
更多深度技術內容,請關注云棲社區微信公眾號:yunqiinsight。