目录

  1. 一、 关于持续集成
    1. 1.1 什么是持续集成
    2. 1.2 为什么要持续集成
  2. 二、 搭建Jenkins
    1. 2.1 什么是jenkins
    2. 2.2 Jenkins for Docker
      1. 2.2.1 准备工作
      2. 2.2.2 拉取Jenkins for Docker
      3. 2.2.3 通过Dockerfile定制jenkins
      4. 2.2.4 使用Jenkins for Docker
      5. 2.2.4 如何复用与迁移
    3. 2.3 如何升级Jenkins

一、 关于持续集成

1.1 什么是持续集成

持续集成, 简称CI(continuous integration).是一种软件开发实践,即团队开发成员经常集成他们的工作,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

传统瀑布模型(水平划分项目阶段):

1

敏捷开发与CI模型(垂直划分项目阶段):

2

1.2 为什么要持续集成

  • 保证质量:CI是敏捷开发重要的一步,其目的在于让产品快速迭代的同时,尽可能保持高质量
  • 减少风险:CI讲求开发、部署、测试100%通过,通过多次集成,便于检查错误
  • 较少重复过程:自动化的构建、部署与测试节省重复工作,让团队能集中精力去做更重要的事
  • 增强项目可见性:每一次集成不论成功或失败,都能获得数据和信息供团队分析与决策
  • 增强团队协作:团队成员能清楚知道每一次提交代码后产生的影响,成员之间需要更密切的沟通来保证集成成功

二、 搭建Jenkins

2.1 什么是jenkins

Jenkins是一款用Java编写的开源的持续集成工具,是目前使用范围最广的CI工具。他长这样:

3

2.2 Jenkins for Docker

上文也说到Jenkins使用Java编写,所以支持跨平台。详细的介绍和安装说明可以查看官网

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

2.2.1 准备工作

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

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

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

    • 创建代理配置文件

      1
      2
      mkdir -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

    4

    到这里已经可以使用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
    28
    FROM 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

    5

    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

    启动容器后,可以看到如下所示的信息,记住红框内的密钥信息

    6

    启动完成后就可以通过访问宿主机IP+容器8080的映射端口来访问Jenkins了,如通过上面的配置,我们可以访问 http://XXXX:8081

    7

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

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

    然后安装推荐插件

    8

    9

    设置管理员账号

    10

  • 开机自动运行容器

    最后不要忘了给宿主机设置开机启动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,一般会遇到升级提示

11

升级步骤如下:

  • 右键”download”获取更新包地址

  • 进入jenkins容器

    1
    docker exec -it -u root myjenkins /bin/bash
  • 执行命令

    1
    2
    3
    4
    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