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

相关概念:
流水线:Jenkins Pipeline(或简称为 "Pipeline")是一套插件,将持续交付的实现和实施集成到 Jenkins 中。
Jenkins Pipeline 提供了一套可扩展的工具,用于将“简单到复杂”的交付流程实现为“持续交付即代码”。Jenkins Pipeline 的定义通常被写入到一个文本文件(称为
Jenkinsfile
)中,该文件可以被放入项目的源代码控制库中。节点:节点是一个机器,主要用于执行jenkins任务
阶段:定义不同的执行任务,比如:构建、测试、发布(部署)
步骤:相当于告诉Jenkins现在要做些什么,比如shell命令。

Jenkins的界面

任务详情页面

Jenkins任务日志
# 安装方式
环境要求
- 机器要求:
- 256 MB 内存,建议大于 512 MB
- 10 GB 的硬盘空间(用于 Jenkins 和 Docker 镜像)
- 需要安装以下软件:
- Java 8 ( JRE 或者 JDK 都可以)
- Docker (opens new window) (导航到网站顶部的Get Docker链接以访问适合您平台的Docker下载)
- 机器要求:
常规安装
安装JDK
下载对应的操作系统的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
就是初始的安装的管理员密码。
使用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
2docker 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
配置Jenkins插件加速
进入jenkins系统管理->插件管理中->高级选项卡->升级站点,使用清华源:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json
1


关于官方所有的镜像列表:
http://mirrors.jenkins-ci.org/status.html (opens new window)
环境配置
- Jenkins 的URL路径
- 全局工具的配置:Docker, JDK(JAVA)...
用户权限配置
- 矩阵权限的配置
- 添加管理员用户所有的权限
- 添加Authorize Project (opens new window)插件,并且在系统管理中进行配置。配置逻辑,就给用户当前项目的矩阵权限!
与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发布,比较合适于静态资源的发布。
Performance Plugin
该插件可以读取和解析测试框架输出的报告,并且在 Jenkins 上绘制性能和稳定性相关的图表。Performance Plugin 支持的测试框架有 JUnit、JMeter, Twitter 的 Lago 和 Taurus。下图是该插件输出的示例图:

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 可以让项目管理员针对系统持续集成步骤设置一系列关联的任务,任务之间可以设置不同的触发条件,以确认何时需要人工介入。该插件可以让整个持续集成流程变得非常直观:

https://github.com/jenkinsci/build-pipeline-plugin
# 配置自动化任务
两种执行方法:
- 配置自由风格的项目
- 配置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
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'
}
}
}
}
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.'
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)
2
3
4
5
6
7
思路:
- 使用一台单独的Nginx服务器发布,使用Publish Over SSH插件上传
- 使用Docker在本地发布或者远程发布
- 使用Dockerfile进行镜像内的构建,使用docker镜像进行发布
← 2.持续集成 4.TravisCI →