持续集成CI实施指南一--搭建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

持续集成CI实施指南一--搭建Jenkins

https://wurang.net/jenkins01_docker/

作者

Wu Rang

发布于

2017-11-03

更新于

2021-12-06

许可协议

评论