# 3.Jenkins

# 使用简介

Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。

xcooo

相关概念:

  • 流水线:Jenkins Pipeline(或简称为 "Pipeline")是一套插件,将持续交付的实现和实施集成到 Jenkins 中。

    Jenkins Pipeline 提供了一套可扩展的工具,用于将“简单到复杂”的交付流程实现为“持续交付即代码”。Jenkins Pipeline 的定义通常被写入到一个文本文件(称为 Jenkinsfile )中,该文件可以被放入项目的源代码控制库中。

  • 节点:节点是一个机器,主要用于执行jenkins任务

  • 阶段:定义不同的执行任务,比如:构建、测试、发布(部署)

  • 步骤:相当于告诉Jenkins现在要做些什么,比如shell命令。

xcooo

Jenkins的界面

xcooo

任务详情页面

xcooo

Jenkins任务日志

# 安装方式

  1. 环境要求

    • 机器要求:
      • 256 MB 内存,建议大于 512 MB
      • 10 GB 的硬盘空间(用于 Jenkins 和 Docker 镜像)
    • 需要安装以下软件:
      • Java 8 ( JRE 或者 JDK 都可以)
      • Docker (opens new window) (导航到网站顶部的Get Docker链接以访问适合您平台的Docker下载)
  2. 常规安装

    • 安装JDK

      官方地址 (opens new window)

      下载对应的操作系统的JDK,然后解压进行安装。以Linux为例:

      下载最新版本,上传到Linux服务器

      # 上传到 /opt/jdk8目录下
      
      # tar解压JDK安装包
      mkdir -p /opt/jdk8
      tar zxvf jdk-8u211-linux-x64.tar.gz -C /opt/jdk8 --strip-components 1
      
      # vi /etc/profile
      export JAVA_HOME=/opt/jdk8
      export JRE_HOME=${JAVA_HOME}/jre
      export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
      export PATH=${JAVA_HOME}/bin:$PATH
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
    • 安装Jenkins

      下载Jenkins最新的war包:Latest (opens new window)

      mkdir -p /opt/jenkins && cd /opt/jenkins
      
      wget -O /opt/jenkins/jenkins.war http://mirrors.jenkins.io/war-stable/latest/jenkins.war
      
      java -jar jenkins.war --httpPort=8080
      
      1
      2
      3
      4
      5

      就嗯可以打开,http://localhost:8080了

      注意一段这样的话:

      *************************************************************
      *************************************************************
      *************************************************************
      
      Jenkins initial setup is required. An admin user has been created and a password generated.
      Please use the following password to proceed to installation:
      
      63196690ae7d47c49506480ee0e1af4a
      
      This may also be found at: /root/.jenkins/secrets/initialAdminPassword
      
      *************************************************************
      *************************************************************
      *************************************************************
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14

      这里的63196690ae7d47c49506480ee0e1af4a就是初始的安装的管理员密码。

  3. 使用Docker安装

    • 安装Docker

      # From https://get.docker.com:
      curl -fsSL https://get.docker.com -o get-docker.sh
      sh get-docker.sh
      
      #From https://test.docker.com:
      curl -fsSL https://test.docker.com -o test-docker.sh
      sh test-docker.sh
      
      # From the source repo (This will install latest from the test channel):
      sh install.sh
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
    • 配置Docker镜像加速,使用阿里云容器加速服务 (opens new window)

      左侧的加速器帮助页面就会显示为你独立分配的加速地址

      例如:
      公网Mirror:[系统分配前缀].mirror.aliyuncs.com
      
      1
      2

      使用配置文件 /etc/docker/daemon.json(没有时新建该文件)

      {
          "registry-mirrors": ["<your accelerate address>"]
      }
      
      1
      2
      3

      重启Docker Daemon就可以了

      systemctl daemon-reload
      systemctl restart docker
      
      1
      2

      docker ps 查看容器运行状态

      docker logs 容器ID/容器名称 查看管理员初始密码

    • 安装Docker-compose.yml文件(可选)

      安装方法:

      #下载
      sudo curl -L https://github.com/docker/compose/releases/download/1.20.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
      #安装
      chmod +x /usr/local/bin/docker-compose
      #查看版本
      docker-compose --version
      
      1
      2
      3
      4
      5
      6
    • 安装Jenkins

      版本选择:

      Jenkins: https://hub.docker.com/r/jenkins/jenkins/

      Jenkins with Blue Ocean: https://hub.docker.com/r/jenkinsci/blueocean

      Blue Ocean 重新思考Jenkins的用户体验,从头开始设计Jenkins Pipeline (opens new window), 但仍然与自由式作业兼容,Blue Ocean减少了混乱而且进一步明确了团队中每个成员 Blue Ocean 的主要特性包括:

      • 持续交付(CD)Pipeline的 复杂可视化 ,可以让您快速直观地理解管道状态。
      • Pipeline 编辑器 - 引导用户通过直观的、可视化的过程来创建Pipeline,从而使Pipeline的创建变得平易近人。
      • 个性化 以适应团队中每个成员不同角色的需求。
      • 在需要干预和/或出现问题时 精确定位 。 Blue Ocean 展示 Pipeline中需要关注的地方, 简化异常处理,提高生产力
      • 本地集成分支和合并请求, 在与GitHub 和 Bitbucket中的其他人协作编码时实现最大程度的开发人员生产力。****

      安装命令:

      # Jenkins
      docker run \
        -itd \
        -u root \
        -p 8080:8080 \
        -v jenkins-data:/var/jenkins_home \
        -v /var/run/docker.sock:/var/run/docker.sock \
        -v /usr/bin/docker:/usr/bin/docker \
        --name jenkins-master \
        jenkins/jenkins
        
      # Jenkins blueocean
      docker run \
        -itd \
        -u root \
        -p 8080:8080 \
        -v jenkins-data:/var/jenkins_home \ 
        -v /var/run/docker.sock:/var/run/docker.sock \
        -v /usr/bin/docker:/usr/bin/docker \
        --name jenkins-master \
        jenkinsci/blueocean
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
  4. 配置Jenkins插件加速

    进入jenkins系统管理->插件管理中->高级选项卡->升级站点,使用清华源:

    https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json
    
    1
xcooo xcooo

关于官方所有的镜像列表:

http://mirrors.jenkins-ci.org/status.html (opens new window)

  1. 环境配置

    • Jenkins 的URL路径
    • 全局工具的配置:Docker, JDK(JAVA)...
  2. 用户权限配置

    • 矩阵权限的配置
    • 添加管理员用户所有的权限
    • 添加Authorize Project (opens new window)插件,并且在系统管理中进行配置。配置逻辑,就给用户当前项目的矩阵权限!
  3. 与gitlab进行联接

    • 设置一个SSH Key,方便Jenkins去拉取Gitlab中的项目
    • GItlab项目中去配置SSH Key的Deploy权限。Settings -> Repository -> Deploy keys -> Public Deploy Keys
    • Jenkins添加SSH的私钥

    这样就完成了Jenkins可以访问gitlab的联接的过程。

    Jenkins层面,需要去安装Gitlab相关插件。

# 插件介绍

  • Publish over SSH

    这个是一个远程Shell工具,可以远程去执行一些shell命令

  • HTTP Request Plugin

    跨平台调用,在构建前后可以通过该插件以http形式调用各种api接口实现和内部系统的联动

  • Publish Over FTP

    用于远程使用FTP发布,比较合适于静态资源的发布。

    xcooo
  • Performance Plugin

​ 该插件可以读取和解析测试框架输出的报告,并且在 Jenkins 上绘制性能和稳定性相关的图表。Performance Plugin 支持的测试框架有 JUnit、JMeter, Twitter 的 Lago 和 Taurus。下图是该插件输出的示例图:

xcooo

​ https://plugins.jenkins.io/performance

  • Gitlab Merge Request Builder Plugin

​ Gitlab Merge Request Builder Plugin 可以方便的自动发起代码审查,它在创建 pull request 的时候,会自动带上关联任务的运行结果,以方便代码审查着确认改动的正确性。

​ 同时,这款插件还支持自动合并,既在代码审查通过后自动合并该 pull request 内容。

​ https://github.com/timols/jenkins-gitlab-merge-request-builder-plugin

  • JIRA Plugin

​ JIRA Plugin 可以让 Jenkins 任务和 JIRA 集成起来,这样项目管理者可以通过 JIRA 了解项目进度,开发者也可以通过该插件直接更改 JIRA 上的 issue 状态。

​ https://plugins.jenkins.io/jira

  • Kubernetes Plugin

​ 和最近大热的容器编排框架 Kubernetes 集成当然不能落下了。另外,Jenkins 对执行机的管理一直比较弱,无法做到快速的扩容和缩容。Kubernetes Plugin 通过引入 Kubernetes 的容器编排能力,让 Jenkins 执行机运行在 Kubernetes 环境中。

​ https://github.com/jenkinsci/kubernetes-plugin

  • Build Pipeline plugin

​ 对一个系统的持续集成会包含很多个方面,如果将它们都杂糅在一个 Jenkins 任务中,会提高排查成本,也不利于整个持续集成的运作。Build Pipeline plugin 可以让项目管理员针对系统持续集成步骤设置一系列关联的任务,任务之间可以设置不同的触发条件,以确认何时需要人工介入。该插件可以让整个持续集成流程变得非常直观:

xcooo

​ https://github.com/jenkinsci/build-pipeline-plugin

# 配置自动化任务

两种执行方法:

  1. 配置自由风格的项目
  2. 配置Pipeline使用Jenkinsfile

需要注意的地方

  • SSH插件:

    SSH

    SSH Agent

    SSH Pipeline Steps

    Publish Over SSH

  • git相关插件:

    Gitlab

    Github

  • 管理员界面配置:

    Settings -> network -> Outbound requests

    Allow requests to the local network from hooks and services 进行勾选

其他的一些用法:

  • 使用Jenkins配合Docker Hub,把前端代码打包成镜像,再远程部署
  • Jenkins配合自建Docker容器服务,把前端代码打包,使用Kubernetes进行发布。
  • 使用Docker进行远程发布(远程服务器上有Docker服务,并且设置了远程连接)

把构建、打包的工作放在Docker容器里面,用于应对不同的开发环境需求(node8,node10等)

# 前端项目中的应用

插件推荐:

  • nodejs插件

    主要是用于不同版本的Node打包

    特别需要注意的是,使用jenkinsci/blueocean镜像的同学,需要重新运行新的容器,以便nodejs插件生效。

    docker run \
      -itd \
      -u root \
      -p 8080:8080 \
      -v /var/jenkins_home:/var/jenkins_home \
      -v /var/run/docker.sock:/var/run/docker.sock \
      -v /usr/bin/docker:/usr/bin/docker \
      --name jenkins-master \
      jenkins/jenkins
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    注意:docker stop 容器名称 去停止之前的容器!

  • Publish Over SSH

    用于构建完成之后,推送到远程的web服务器

Jenkins发布到Nginx Docker容器:

# !bin/bash
node -v
cnpm install
npm run build
ls -la
if [ "$(docker inspect -f '{{.State.Running}}' nginx)" = "true" ]; then
	docker stop nginx && docker rm nginx;
fi

docker run -itd --name nginx -v `pwd`/dist:/usr/share/nginx/html -p 20000:80 nginx
1
2
3
4
5
6
7
8
9
10

Pipleline演示:

pipeline {
  agent {
    docker {
      image 'node:10'
      args '-p 20000:8080'
    }

  }
  stages {
    stage('Build') {
      steps {
        sh 'yarn install'
      }
    }
    stage('Deploy') {
      steps {
        sh './scripts/deploy.sh'
        input 'Finished using the web site? (Click "Proceed" to continue)'
        sh './scripts/kill.sh'
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

deploy.sh文件

#!/usr/bin/env sh
set -x
npm run serve &
sleep 1
echo $! > .pidfile
set +x

echo 'Now...'
echo 'Visit http://localhost:8080 to see your Node.js/Vue application in action.'
1
2
3
4
5
6
7
8
9

set命令用法:

set指令能设置所使用shell的执行方式,可依照不同的需求来做设置  -a  标示已修改的变量,以供输出至环境变量。  -b  使被中止的后台程序立刻回报执行状态。  -C  转向所产生的文件无法覆盖已存在的文件。  -d  Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。  -e  若指令传回值不等于0,则立即退出shell。    -f   取消使用通配符。  -h  自动记录函数的所在位置。  -H Shell  可利用"!"加<指令编号>的方式来执行history中记录的指令。  -k  指令所给的参数都会被视为此指令的环境变量。  -l  记录for循环的变量名称。  -m  使用监视模式。  -n  只读取指令,而不实际执行。  -p  启动优先顺序模式。  -P  启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。  -t  执行完随后的指令,即退出shell。  -u  当执行时使用到未定义过的变量,则显示错误信息。  -v  显示shell所读取的输入值。  -x  执行指令后,会先显示该指令及所下的参数。

+<参数>  取消某个set曾启动的参数。

kill.sh文件:

#!/usr/bin/env sh

echo 'The following command terminates the "npm run serve" process using its PID'
echo '(written to ".pidfile"), all of which were conducted when "deloy.sh"'
echo 'was executed.'
set -x
kill $(cat .pidfile)
1
2
3
4
5
6
7

思路:

  1. 使用一台单独的Nginx服务器发布,使用Publish Over SSH插件上传
  2. 使用Docker在本地发布或者远程发布
  3. 使用Dockerfile进行镜像内的构建,使用docker镜像进行发布
上次更新: 2020/11/7 下午6:47:53