持续集成CI实施指南一--搭建Jenkins
一、 关于持续集成
1.1 什么是持续集成
持续集成, 简称CI(continuous integration).是一种软件开发实践,即团队开发成员经常集成他们的工作,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
传统瀑布模型(水平划分项目阶段):
敏捷开发与CI模型(垂直划分项目阶段):
1.2 为什么要持续集成
- 保证质量:CI是敏捷开发重要的一步,其目的在于让产品快速迭代的同时,尽可能保持高质量
- 减少风险:CI讲求开发、部署、测试100%通过,通过多次集成,便于检查错误
- 较少重复过程:自动化的构建、部署与测试节省重复工作,让团队能集中精力去做更重要的事
- 增强项目可见性:每一次集成不论成功或失败,都能获得数据和信息供团队分析与决策
- 增强团队协作:团队成员能清楚知道每一次提交代码后产生的影响,成员之间需要更密切的沟通来保证集成成功
二、 搭建Jenkins
2.1 什么是jenkins
Jenkins是一款用Java编写的开源的持续集成工具,是目前使用范围最广的CI工具。他长这样:
2.2 Jenkins for Docker
上文也说到Jenkins使用Java编写,所以支持跨平台。详细的介绍和安装说明可以查看官网
我们这里用到另一种方式,Jenkins for Docker. 这种方式在使用上更为轻量,不用在服务器上安装JDK,甚至不需要去研究如何安装Jenkins. 另外通过编写Dockerfile,能定制出符合我们需求的Jenkins配置,同时能够方便的复用和迁移。
2.2.1 准备工作
需要一台装有Docker的宿主机(必要)
需要一些Docker的基础知识与常用命令(必要)
docker宿主机设置代理(非必要)
创建代理配置文件
1
2mkdir -p /etc/systemd/system/docker.service.d
vi /etc/systemd/system/docker.service.d/http-proxy.conf内容填写参考如下
1
2[Service]
Environment="HTTP_PROXY=http://192.168.2.100:1080/" "HTTPS_PROXY=https://192.168.2.100:1080/" "NO_PROXY=localhost,127.0.0.1"表示使用192.168.2.100:1080作为代理,且localhost不走代理
更新配置
1
systemctl daemon-reload
重启Docker
1
systemctl restart docker
2.2.2 拉取Jenkins for Docker
宿主机执行命令拉取Jenkins的Docker Image
1
docker pull jenkins
这个镜像体积不小,约800M,由于受国内网络环境影响,下载可能很慢,如果需要给docker设置代理请参考2.2.1 “docker宿主机设置代理”
查看Jenkins镜像
1
docker images
到这里已经可以使用jenkins了,但我们还需做一些定制,比如给Jenkins镜像安装Nodejs、dotnet Core SDK等
2.2.3 通过Dockerfile定制jenkins
根据需要编写Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28FROM jenkins
MAINTAINER wurang
USER root
# 将 shell 替换为 bash
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
# 设置中科大软件镜像源
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's|security.debian.org|mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list
# upgrade
RUN apt-get update && apt-get upgrade -y && apt-get install -y apt-utils sudo
# 安装必要软件包
RUN apt-get install -y build-essential curl libunwind8 gettext apt-transport-https nasm autoconf automake libtool libpng-dev pkg-config
# 安装dotnet core 2.0
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg \
&& mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg \
&& sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-debian-stretch-prod stretch main" > /etc/apt/sources.list.d/dotnetdev.list' \
&& apt-get update && apt-get install -y dotnet-sdk-2.0.0
# 安装nodejs
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - && apt-get install -y nodejs
# 安装cnpm
RUN npm install -g cnpm --registry=https://registry.npm.taobao.org
# 清理缓存
RUN apt-get clean && apt-get autoclean
# 解决时区问题
RUN rm -f /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 设置环境变量,设置时区和降低安全配置以允许查看测试报告时访问到css
ENV JAVA_OPTS="-Duser.timezone=Asia/Shanghai -Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';\""
USER jenkins生成定制镜像
1
docker build -t auto-jenkins .
查看镜像
1
docker images
auto-jenkins即为通过Dockerfile生成的定制镜像
2.2.4 使用Jenkins for Docker
运行Jenkins容器
1
docker run --name myjenkins -d -p 8081:8080 -p 50000:50000 -v jenkins:/var/jenkins_home auto-jenkins
- –name myjenkins 表示为运行的docker容器命名myjenkins
- -d 表示用后台执行命令
- -p 8081:8080 将Jenkins容器的8080端口映射至宿主机的8081端口,必须映射容器的8080端口到宿主机,考虑到宿主机8080端口可能被占用,所以这里映射到了8081端口,记住这个端口将用于对Jenkins的访问
- -p 50000:50000 将Jenkins容器的50000端口映射至宿主机的50000端口,必须映射容器的50000端口到宿主机
- -v jenkins:/var/jenkins_home 将Jenkins容器的home目录作为卷挂载到宿主机 /var/lib/docker/volumes/jenkins 目录,jenkins容器的所有配置、工作信息都会存放在这里。也可以挂载到宿主机的其他目录,不过需要注意权限问题
- auto-jenkins 表示从我们创建的名为auto-jenkins的镜像启动容器
访问Jenkins
启动容器后,可以看到如下所示的信息,记住红框内的密钥信息
启动完成后就可以通过访问宿主机IP+容器8080的映射端口来访问Jenkins了,如通过上面的配置,我们可以访问 http://XXXX:8081
这里需要填入刚才记住的密钥,如果忘记了,可以在宿主机的挂载卷内找到
1
cat /var/lib/docker/volumes/jenkins/_data/secrets/initialAdminPassword
然后安装推荐插件
设置管理员账号
开机自动运行容器
最后不要忘了给宿主机设置开机启动Jenkins容器,可添加下面的开机脚本命令
1
docker start myjenkins
2.2.4 如何复用与迁移
如果需要迁移整套jenkins或者在其他服务器复用,可以按照下面的步骤:
- 新服务器安装Docker
- 新服务器拉取Jenkins Image
- 拷贝之前编写好的Dockerfile到新服务器,运行build脚本创建auto-jenkins镜像
- 运行容器
- 访问Jenkins
- 拷贝旧服务器的挂载卷 /var/lib/docker/volumes/jenkins 到新服务器对应位置(迁移则需要这一步,复用不需要)
2.3 如何升级Jenkins
初次访问Jenkins for Docker,一般会遇到升级提示
升级步骤如下:
右键”download”获取更新包地址
进入jenkins容器
1
docker exec -it -u root myjenkins /bin/bash
执行命令
1
2
3
4cd /usr/share/jenkins/ # 进入jenkins目录
mkdir bak # 创建备份文件夹
mv jenkins.war bak/jenkins.war.bak # 备份war包
wget http://updates.jenkins-ci.org/download/war/2.73.2/jenkins.war # 下载更新包,地址为第一步获取的更新地址重启jenkins
访问jenkins_url/restart 如 “http://XXXX:8081/restart” 重启jenkins
持续集成CI实施指南一--搭建Jenkins