持续集成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编写,所以支持跨平台。详细的介绍和安装说明可以查看官网: https://jenkins.io/

我们这里用到另一种方式,Jenkins for Docker. 这种方式在使用上更为轻量,不用在服务器上安装JDK,甚至不需要去研究如何安装Jenkins. 另外通过编写Dockerfile,能定制出符合我们需求的Jenkins配置,同时能够方便的复用和迁移。

2.2.1 准备工作

  • 需要一台装有Docker的宿主机(必要)

  • 需要一些Docker的基础知识与常用命令(必要)

  • docker宿主机设置代理(非必要)

创建代理配置文件

mkdir -p /etc/systemd/system/docker.service.d
vi /etc/systemd/system/docker.service.d/http-proxy.conf

内容填写参考如下

[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不走代理

更新配置

systemctl daemon-reload

重启Docker

systemctl restart docker

2.2.2 拉取Jenkins for Docker

  • 宿主机执行命令拉取Jenkins的Docker Image
docker pull jenkins

这个镜像体积不小,约800M,由于受国内网络环境影响,下载可能很慢,如果需要给docker设置代理请参考2.2.1 “docker宿主机设置代理”

  • 查看Jenkins镜像
docker images

未分类

到这里已经可以使用jenkins了,但我们还需做一些定制,比如给Jenkins镜像安装Nodejs、dotnet Core SDK等

2.2.3 通过Dockerfile定制jenkins

  • 根据需要编写Dockerfile
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
# 安装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  
ENV JAVA_OPTS=-Duser.timezone=Asia/Shanghai 
USER jenkins
  • 生成定制镜像
docker build -t auto-jenkins .
  • 查看镜像
docker images

未分类

auto-jenkins即为通过Dockerfile生成的定制镜像

2.2.4 使用Jenkins for Docker

运行Jenkins容器

docker run --name myjenkins -p 8081:8080 -p 50000:50000 -v jenkins:/var/jenkins_home auto-jenkins
  • –name myjenkins 表示为运行的docker容器命名myjenkins

  • -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

未分类

这里需要填入刚才记住的密钥,如果忘记了,可以在宿主机的挂载卷内找到

cat /var/lib/docker/volumes/jenkins/_data/secrets/initialAdminPassword

然后安装推荐插件

未分类

未分类

设置管理员账号

未分类

  • 开机自动运行容器

最后不要忘了给宿主机设置开机启动Jenkins容器,可添加下面的开机脚本命令

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容器

docker exec -it -u root myjenkins /bin/bash

执行命令

cd /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