前言
前一篇對jenkins的環(huán)境搭建做了簡單介紹虾标,這一篇內容主要是如何借助jenkins,自動構建并run一個目標docker灌砖¤岛基本流程是當gitlab上有新的push產生時,觸發(fā)jenkins構建任務基显,jenkins在pull項目并完成如build/make等上線前的準備工作后蘸吓,將build/make后的文件打包到docker中,并將其run起來撩幽。
關鍵字
Docker库继、DooD(Docker outside of Docker)、CI窜醉、Jenkins
預備知識
- Docker / Dockerfile / Docker Compose
重構Jenkins鏡像
新建Dockerfile宪萄,以官方Jenkins為基本鏡像(不建議使用alpine的版本,雖然鏡像文件比較小酱虎,但是后面的過程中遇到了很多問題雨膨,最好還是果斷棄坑回到ubuntu),將jenkins用戶加入到docker的group中读串,原因后面會說聊记,并安裝nodejs(這個可選)。
FROM jenkins
USER root
ARG dockerGid=978
ENV NODE_VERSION 6.9.4
#add jenkins to docker group and install nodejs/npm
RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group \
&& cd /home \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& xz -d "node-v$NODE_VERSION-linux-x64.tar.xz" \
&& tar xvf "node-v$NODE_VERSION-linux-x64.tar" \
&& ln -s /home/node-v$NODE_VERSION-linux-x64/bin/node /usr/local/bin/node \
&& ln -s /home/node-v$NODE_VERSION-linux-x64/bin/npm /usr/local/bin/npm \
&& rm -rf "node-v$NODE_VERSION-linux-x64.tar"
USER jenkins
這里的dockerGid參數為host上docker用戶組的groupid恢暖,運行命令:
docker build -t local_jenkins .
構建自己的本地jenkins鏡像
啟動容器
這里選擇使用docker compose工具排监,將各項參數寫到文件中。
** * 這里相比上一篇多了兩個掛載點杰捂,一個是/bin/docker舆床,一個是/var/run/docker.sock。實現DooD(Docker outside of Docker)的關鍵就在這里嫁佳,通過將docker挨队、docker.scok暴露到jenkins的容器中,由于jenkins用戶已在docker的組中蒿往,故有權限使用docker命令盛垦,且run起來的container實際上就是是運行在host主機上。* **
- docker-compose.yml文件:
version: '2'
services:
my_jenkins:
image: local_jenkins
volumes:
- /root/docker/jenkins:/var/jenkins_home
- /bin/docker:/usr/bin/docker
- /var/run/docker.sock:/var/run/docker.sock
ports:
- "9000:8080"
運行命令:
docker-compose up
我們定制好的jenkins container就可以正常工作了瓤漏。
構建任務
首先是一些準備工作腾夯。目標任務是一個AngularJS的前端項目(可以參看我的另一篇文章webpack-angular颊埃,基本類似),需要nodejs/npm準備環(huán)境蝶俱,由于全部為靜態(tài)文件班利,所以選用nginx作為服務器。
目標Container的Dockerfile:將webpack構建后的文件(位于build目錄)拷貝到容器的html目錄內榨呆。不推薦使用掛載點的方式進行罗标,盡量減少容器的依賴。
FROM nginx:stable-alpine
COPY ./build/* /usr/share/nginx/html/
我這里是直接把Dockerfile文件放在了前端項目的根目錄下积蜻。
- 登錄Jenkins馒稍,新建一個自由風格的軟件項目。
- 源碼管理選擇git浅侨,并添加Repository URL、Credentials
-
構建觸發(fā)器選擇Gitlab trigger(如果不存在該選項证膨,則自行到jenkins的插件管理頁面安裝該插件)
- 構建選擇 Execute Shell如输,命令如下:
npm update;
npm start test;
docker stop front_dev || true;
docker rm front_dev || true;
docker build -t front_dev .;
docker run --name front_dev -p 10080:80 -d front_dev;
這里有幾個注意點:
** docker stop/rm 命令后加上 || true**
當shell中有命令執(zhí)行失敗時,jenkins會判定構建失敗央勒,從而結束構建工作不见。加上||true,無論當前front_dev 是否在運行崔步,是否有稳吮,該命令都返回執(zhí)行成功,使shell可以繼續(xù)執(zhí)行下去**docker run -d **
-d 表示容器以daemon狀態(tài)運行井濒,有些鏡像run之后會處于掛起狀態(tài)灶似,使得構建的shell腳本一直無法結束shell中的front_dev為鏡像、容器名字瑞你,可以自行重命名
Gitlab Trigger
登錄gitlab酪惭,進入項目頁面。右上角選擇Webhooks:
在設置頁面的URL中填寫 在構建Jenkins任務選擇Gitlab Triggers上方出現的Service URL者甲。點擊Add春感。
添加完成后可以點擊Test按鈕或者進行git push操作,查看是否可以觸發(fā)自動構建任務虏缸。
至此鲫懒,持續(xù)集成環(huán)境的主流程基本完成。流程中后續(xù)可以繼續(xù)添加測試等環(huán)節(jié)刽辙。