一、介绍
二、安装
Jenkins官网: https://www.jenkins.io/
2.1 安装方式
2.1.1 Liunx
方式一:直接下载war包,执行java命令启动(推荐)
java -jar jenkins.war
2.1.2 Windows
2.1.3 其他

安装过程中注意事项:
- 端口指定,默认8080,可自定义。这里自定义为8848
三、基础配置
3.1 初始化配置
- 初始界面访问
访问http://[localhost/127.0.0.1/本地ip]:8848/ ,进入初始配置界面
- 解锁Jenkins
首次访问界面,会有密码输入,初始密码获取,在访问界面有提示,如下图红色字体
一般,
Linux:/root/.jenkins/secrets/initialAdminPassword
windows:C:\ProgramData\Jenkins.jenkins\secrets\initialAdminPassword 。注意:ProgramData是隐藏文件夹
- 初始插件安装
初始插件安装,分为官网推荐和自选择安装,这个根据自己需求来选择,不是很了解的新手可以选择官网推荐安装,推荐安装的插件基本上都是很实用的官方推荐,如:汉化插件等,当然安装后也可在管理界面中选择去卸载的。
- 创建第一个管理员用户
可选操作,也可不创建,不创建可以使用默认的admin用户去登陆使用,密码就是initialAdminPassword中的初始密码
3.2 插件管理
执行目录:Dashboard->Manage Jenkins->Manage Plugins->一级目录->二级目录->…
3.2.1 用户权限管理
功能:用于管理Jenkins用户权限 插件名称:Role-based Authorization Strategy
1.开启权限全局安全配置
setp1: 全局安全配置(一级目录)
step2:开启基于角色的配置(二级目录)
step3:管理和分配角色(一级目录)
step4:管理角色(二级目录)
setp5:创建角色(三级目录)
默认情况下,具有3种角色,Global roles,Item roles,Node roles
- Global roles:全局角色,管理员等高级用户可以创建基于全局的角色
- Item roles:针对某个或者某些项目的角色
- Slave roles:节点相关的权限
2.创建用户
step1: 用户管理(一级目录)
step2: 新建用户(二级目录)
也可开启用户自己注册模式,详见 3.2.3-4
3.给用户分配权限
step1:管理和分配角色(一级目录)
step2:分配角色(二级目录)
step3:新增用户及分配权限(三级目录)
同理,也可分配 itemRole和slaverRole
3.2.2 凭据管理
功能:可用于存储需要密文保护的数据库密码、Gitlab密码信息、Docker私有仓库密码等,方便Jenkins于第三方应用交互。
插件名称:Credentials Binding Plugin 执行目录:Dashboard->Manage Jenkins->凭据管理|配置->一级目录->二级目录->…
1.创建凭据(凭据配置)
step1: 新增凭据(一级目录)
- Username with password:用户名和密码,如:拉取gitlab代码使用”Clone with HTTPS”时使用
- SSH Username with private key: 使用SSH用户和密钥,如:拉取gitlab代码使用”Clone with SSH”时使用
- Secret file:需要保密的文本文件,使用时Jenkins会将文件复制到一个临时目录中,再将文件路径设置到一个变量中,等构建结束后,所复制的Secret file就会被删除。
- Secret text:需要保存的一个加密的文本串,如Github的api token或钉钉机器人等
- Certificate:通过上传证书文件的方式
2.管理凭据(Manage Credentials)
3.2.3 其他
1.下载源配置
修改Jenkins插件下载地址,Jenkins国外官方插件地址下载速度慢,可修改为国内插件地址
原装:https://updates.jenkins.io/update-center.json清华下载源:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json


2.汉化包配置
功能:用于Jenkins管理界面的汉化 插件名称:Localization: Chinese (Simplified)
如果已经安装官网新版,且使用了推荐插件安装,则默认已经安装了汉化,但是汉化的不够彻底,部分依然是英文显示,有强迫症的同学可以忽略安装。
3.Git配置
功能:安装Git插件和Git工具 ,可用于GitLab代码拉取
插件名称:Git plugin
4.开启首页用户注册


3.3 全局工具配置
功能:准备项目使用过程中涉及到的工具及开发环境 执行目录:Dashboard->Global Tool Configuration->一级目录->二级目录->…

step1: Maven配置(一级目录)
Java项目打包工具
(1)Maven的安装目录
(2) 指定Maven配置文件
step2:JDK配置(一级目录)
Java服务启动及运行环境

step3: Git配置(一级目录)
Git相关代码仓库(GitLab、GitHub)连接、拉取代码等所需环境

step4: 其他配置(一级目录)
如:Gradle、Ant等,具体根据项目和语言情况选定,如果没有相关配置,可安装对应插件进行添加
3.4 全局属性配置
根据自己的需要进行全局参数配置 Dashboard->Manage Jenkins->Configure System->一级目录

step1:配置GitLab连接(一级目录)
step2:配置Java项目使用的全局变量(一级目录)
以下三个全局变量配置仅供java项目使用
3.5 构建触发器配置
Jenkins常用的5种构建触发器
- Jenkins内置构建触发器
- 触发远程构建
- 前置工程构建后触发(Build after other projects are build)
- 定时构建(Build periodically)
- 轮询SCM(Poll SCM)
- 外置构建触发器
- GitLab webhook (Build When a change is pushed to GitLab)
3.5.1 触发远程构建
身份验证令牌自定义,一般设置为加密串
例如:
身份令牌为:6666
访问URL为:http://10.x.x.18:8848/job/x-speech-master/build?token=6666
访问方式:可在浏览器直接触发或者通过代码触发该URL进行构建
注意:
使用这种方式,必须要关掉代码分之选择,且需要将Pipleline脚本中的 $branch替换成指定的分之名称,否则URL触发会没有效果
3.5.2 前置工程构建后触发
指定一个或者多个前置工程,当前置工程构建完毕后,会触发当前工程的自动构建
例如:当前工程x-speech-master,前置工程配置为x_bim_tool(多个用逗号隔开),当x_bim_tool构建完成后,x-speech-master会自动构建
3.5.3 定时构建(Build periodically)
定时字符串从左往右分别为: 分 时 日 月 周
H代表形参(以保存配置为准)每30分钟构建一次: H/30 * * * *每2个小时构建一次: H H/2 * * *每天的6点,12点,20点,一天构建3次: (多个时间点中间用逗号隔开) 0 6,12,20 * * *每天中午12点定时构建一次: H 12 * * *在每个小时的前半个小时内的每10分钟 H(0-29)/10 * * * *每两小时一次,每个工作日上午9点到下午5点(也许是上午10:38,下午12:38,下午2:38,下午4:38) H H(9-16)/2 * * 1-5
3.5.4 轮询SCM(Poll SCM)
轮询SCM,是指定时扫描本地代码仓库的代码是否有变更,如果代码有变更就触发项目构建。时间设置规则同上。
注意:Jenkins会定时扫描本地整个项目的代码,增大系统的开销,因此轮训间隔时间不建议设置过短。

3.5.5 GitLab webhook
功能:利用Gitlab的webhook实现代码push到仓库,会立即触发项目自动构建。 (提交代码就触发构建) 插件名称:GitLab Plugin
勾选GitLab webhook选项,复制下面的url,应用+保存
登陆GitLab -> 项目 -> setting -> Webooks ->填写URL,就是上图中URL -> 勾选Push events(默认已经勾选)-> add webhook 保存

注意,这里需要在Jenkins中的 Manage Jenkins->Configure System ,否则测试会报错!!
配置成功后,测试,提价代码,会发现触发了构建操作。
四、项目构建
4.1 项目构建类型
4.1.1 项目构建类型介绍
Jenkins中自动构建项目的类型有很多,常用的有以下三种:
- 自由风格项目(FreeStyle Project)
- Maven项目(Maven Project)
- 流水线项目(Pipeline Project)

自由风格项目(FreeStyle Project)
功能:构建自定义风格项目
Maven项目(Maven Project)
功能:构建Maven项目 插件名称:Maven Integration plugin
流水线项目(Pipeline Project)
功能:一套运行在 Jenkins 上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。 插件名称:Pipeline
- Pipeline 脚本由 Groovy 语言实现的
- Pipeline 支持两种语法
- Declarative(声明式) : 官方推荐
- Scripted Pipeline(脚本式) :早期使用,目前也可兼容使用
- Pipeline 两种脚本创建方式
- Jenkins 的 Web UI 界面中编辑脚本
- 创建Jenkinsfile 脚本文件,放在对应项目中,提交到项目源码库(SVN/GitLab)中,使用时从源代码控制(SCM)中载入 Jenkinsfile(推荐 )
- 优缺点
- 优点
- 代码:以代码的形式实现,通常被检入源代码控制,使团队能够编辑,审查和迭代其传送流程。
- 持久:无论是计划内的还是计划外的服务器重启,Pipeline都是可恢复的。
- 可停止:可接收交互式输入,以确定是否继续执行Pipeline。
- 多功能:支持现实世界中复杂的持续交付要求。支持fork/join、循环执行,并行执行任务的功能。
- 可扩展:插件支持其DSL的自定义扩展 ,以及与其他插件集成的多个选项。
- 集成:灵活度较高、便于集成大型的分布式项目及各种集成docker、k8s等
- 缺点
- 脚本编写需要了解Groovy语法规则。不过官方提供了流水线语法成功工具,简单使用问题不大。
- 优点
综上,每种类型的构建都可以完成一样的构建过程与结果,只是在操作方式、灵活度等方面有所区别,可以根据自己的需求和习惯来选择。推荐使用流水线项目类型。
4.2 项目构建实战
4.2.1 自由风格项目
4.2.2 Maven项目
4.2.3 流水线项目
通用配置: Maven:apache-maven-3.5.3 JDK:jdk1.8.0_191 Git:GitLab 脚本:
- Jenkins-Pipline脚本(通用)
- Linux-shell脚本(仅Linux服务器项目部署使用)
- windows-bat脚本(仅windows服务器项目部署使用)
服务器环境介绍: Linux:
- 47.x.76.227
- JDK(已安装配置)
- 项目一(待部署)
windows:
- 10.x.29.18
- Jenkins、Maven、JDK(已安装配置)
- 项目二(待部署)
项目一:Liunx-Java-springboot项目构建及发布流程
1.项目创建
step1:新建项目
step2: 项目命名及配置项目框架类型选择
2.项目配置
(1)General配置
step1:项目描述配置(可选)
step2:GitLab连接配置选择(必填,见3.4 step1中配置)
step3:项目全局参数配置(可选)
多种参数可供选择配置,可在Web UI 或 脚本中灵活使用
例如:选择 Choice Parameter,配置代码分支
1) 配置示例
2)引用:$名称
3)页面效果
不配则没有该菜单选项
(2)构建触发器配置(可选)
不配置则进行手动触发构建(详见3.5 构建触发器配置)
(3)流水线配置
step1:流水线定义配置(必填)
Pipeline有两种配置方式:
- 方式一:Pipeline Script (脚本写在 Web UI 上)
- 方式二:Pipeline script from SCM(建立脚本文件由GitLab托管)
方式一:Pipeline Script
1)选择一个脚本模板,保留模板结构,替换模板中脚本代码,脚本代码编写,可辅助使用流水线语法
2)流水线生成器Web UI 界面介绍
方式二:Pipeline script from SCM
1)填写相关信息
- 填写Git信息(必填)

注意:
- 添加分支,根据自己的业务进行自定义添加(必填)

注意:此处不能使用 $branch项目全局变量,执行会报错
- 脚本路径(必填)
默认为Jenkinsfile(可改,但不推荐修改,区分大小写)
注意:此处的名字要和后面的脚本文件名字一一对应
2) 脚本文件创建
在项目工程的根目录中,创建文件名为Jenkinsfile(脚本路径名字修改了则做对应调整)的脚本文件
3)将脚本代码复制到Jenkinsfile中,保存,提交到Gitlab仓库中,构建时Jenkins会自动检出文件中的脚本进行执行
3.Jenkins-Pipeline脚本编写
pipeline {
agent any
tools {
maven 'maven-3.5.3'
}
stages {
stage('Pull remote code') {
steps {
echo "位置1:这里替换GitLab代码拉取的配置信息"
}
}
stage('Compile build') {
steps {
echo "位置2:这里替换Maven构建命令信息"
}
}
stage('sshPublisher & deployment') {
steps {
echo "位置3:这里替换jar包替换备份及服务重启"
}
}
}
}
脚本执行步骤:
第一步:从GitLab中拉取代码(位置1)
第二步:将拉取的代码打包成jar(位置2)
第三步:将jar包上传到指定服务器(位置3)
第四步:备份、替换、重启服务(位置3)
具体执行步骤明细:
需要借助流水线语法进行脚本生成
(1)第一步:从GitLab中拉取代码
选择:checkout:Check out from version control
填写信息

生成流水线脚本,复制脚本替换掉结构模板中-位置1处的注释,实现代码拉取
(2)第二步:将拉取的代码打包成jar
Jenkins调用配置的maven工具将拉取的代码打包成jar包,选择:bat:Windows Batch Script(注意:由于Maven工具是装在windows服务器上的,所以调用需要使用bat,调用Linux中的Maven则不能使用该方式,应当使用sh:shell Script),复制脚本替换掉结构模板中-位置2处的注释,实现打包功能
mvn clean && mvn package -DskipTests=true
bat 'mvn clean && mvn package -DskipTests=true'
(3)第三步:将jar包上传到指定服务器 ,第四步:备份、替换、重启服务
第三四步可在一个代码生成器中完成(也可拆开,拆开第四步需要重新连接远程Linux服务器,因此我放在一步完成),选择:sshPublisher:Send build artifacts over SSH

- SSH-Server-name为目标服务器,已在凭据中配置好了,选择即可,但是需要勾选Retry进行服务器验证
- Source files :打包的jar位置(一般在jenkins安装目录下的workspace目录下,参考:C:\ProgramData\Jenkins.jenkins\workspace\项目名称\target), 格式严格按照截图中填写,有些时候会带上项目名称(有坑,注意避让)
- Remote Prefix:移除前缀,可不填
- Remote directory:jar包上传到的远程目录,上传路径可自定义
- Exec Commond:上传完jar后,继续执行操作命令进行后续操作
Exec Commond,这里执行的是第四步:备份、替换、重启服务的操作,发布的命令我写在了shell脚本(脚本需要授权 chmod +x)中了,也可直接在此处写Linux执行命令的代码,但是会不通用,建议写成shell脚本(此处有坑,详见六)。
点击生成流水线脚本,复制脚本替换掉结构模板中-位置3处的注释,完成服务替换、备份、重启相关功能。
target/*.jar
target/
/jenkins/jar/issue
source /etc/profile
cd /root/jenkins/sh/issue
sh deploy.sh
#!/bin/bash
#上传的jar目录
tmp_dir="/root/jenkins/jar/xxx"
#部署目录
dir="/xxx/xxx/xxx"
#名称
projectName="xxx-speech-1.0.x.RELEASE"
# 配置类型
profiles=test
echo "上传的jar目录:"$dir", 部署目录:"$tmp_dir", 项目名称:"$projectName", 配置类型:"$profiles
if [ -f "$dir/${projectName}.jar" ];then
mv $dir/${projectName}.jar $dir/${projectName}.jar-`date "+%Y%m%d_%H%M%S"`
cp $tmp_dir/${projectName}.jar $dir/${projectName}.jar
echo "清除进程"
ps aux | grep ${projectName}.jar | grep -v "grep" | awk '{print "kill -9 "$2}' | sh
echo "启动服务"
nohup java -jar $dir/${projectName}.jar --spring.profiles.active=$profiles >/dev/null 2>&1 &
sleep 5s
echo "服务启动完毕"
else
echo "服务启动失败"
fi
echo "结束发布"
4.发布
根据Jenkins钩子的配置策略会执行相应的触发构建操作。
项目二:Windows-Java-springboot项目构建及发布流程
1.项目创建
2.项目配置
3.Jenkins-Pipeline脚本编写
(1)第一步:从GitLab中拉取代码
(2)第二步:将拉取的代码打包成jar
(3)第三步:将jar包上传到指定服务器,第四步:备份、替换、重启服务
这里的目标服务器和Jenkins同在一台服务器,所以省去了远程连接目标服务器的操作,直接执行windows命令即可完成第三四步骤,复制脚本替换掉结构模板中-位置3处的注释,完成服务替换、备份、重启相关功能。
E:
cd E:\review\dev_3.0\bin
call stop_dms_3.1.x.bat
del /f E:\review\dev_3.0\lib\bim-dms-*.jar
copy %WORKSPACE%\target\bim-dms-*.jar E:\review\dev_3.0\lib
call start_dms_3.1.x.bat
@echo off
set JAR=tool_server-0.0.1-SNAPSHOT.jar
@echo %JAVA_HOME%
set JENKINS_NODE_COOKIE=DONTKILLME
start javaw -Dhudson.util.ProcessTree.disable=true -Dfile.encoding=UTF-8 -jar ..\lib\%JAR% --server.port=9901 --spring.profiles.active=dev
exit
@echo off
set port=9901
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do (
echo kill the process %%m who use the port %port%
taskkill /f /pid %%m
)
4.发布
同项目一
五、其他操作
- 代码分支选择 TODO
- 服务器间远程传输问题(SSH)TODO
六、构建过程中遇到的问题
问题1:Jenkins启动杀死衍生进程
现象描述:Jenkins执行脚本启动目标服务,脚本运行成功并正常结束,目标服务未重启成功。
场景:Jenkins Pipeline Job,执行脚本(Linux-shell/windows-bat),用脚本来停止、换包、启动目标服务,当Jenkins Pipeline Job执行完成后,发现后台目标服务进程没有正常启动
本质原因:Jenkins会在构建完成后,默认使用processTreeKiller杀掉了所有子进程(衍生进程)
问题处理:
- 没有合理设置环境变量BUILD_ID、JENKINS_NODE_COOKIE
- 对于Jenkins普通Job,更改Jenkins的ProcessTreeKiller寻找的环境变量BUILD_ID
- 对于Jenkins Pipeline Job,使用 JENKINS_NODE_COOKIE 代替BUILD_ID
- 执行nohup java -jar xxx.jar &命令时已经离开了该 job 的WORKSPACE
- Jenkins提供了hudson.util.ProcessTree.disable和hudson.util.ProcessTreeKiller.disable两个属性来控制衍生程序,值为true将禁用此特性。hudson.util.ProcessTree.disable从Jenkins 1.260开始使用,而使用1.315之前的Hudson时只能使用hudson.util.ProcessTreeKiller.disable,为了版本兼容,在Jenkins 1.260后这两个属性都可能使用,建议使用1.260之的Jenkins用户使用hudson.util.ProcessTree.disable属性。
- ssh管道到其他node执行nohup java -jar xxx.jar &时环境变量缺失
- source /etc/profile 刷新环境变量,使得在当前终端中有效
- 子进程没有足够的时间启动
- 保证服务时间正常启动 ,例如延时5秒
- Linux :sleep 5s
- Windows:ping 127.0.0.1 -n 5>nul (约延时5s)
- 保证服务时间正常启动 ,例如延时5秒


