一、介绍

20200417142903886.png

二、安装

Jenkins官网: https://www.jenkins.io/

2.1 安装方式

2.1.1 Liunx

方式一:直接下载war包,执行java命令启动(推荐)

  1. java -jar jenkins.war

方式二:wget下载安装

2.1.2 Windows

下载软件包双击安装

2.1.3 其他

image.png
安装过程中注意事项:

  • 端口指定,默认8080,可自定义。这里自定义为8848

三、基础配置

3.1 初始化配置

  1. 初始界面访问

访问http://[localhost/127.0.0.1/本地ip]:8848/ ,进入初始配置界面

  1. 解锁Jenkins

首次访问界面,会有密码输入,初始密码获取,在访问界面有提示,如下图红色字体
image.png
一般,
Linux:/root/.jenkins/secrets/initialAdminPassword
windows:C:\ProgramData\Jenkins.jenkins\secrets\initialAdminPassword 。注意:ProgramData是隐藏文件夹

  1. 初始插件安装

初始插件安装,分为官网推荐和自选择安装,这个根据自己需求来选择,不是很了解的新手可以选择官网推荐安装,推荐安装的插件基本上都是很实用的官方推荐,如:汉化插件等,当然安装后也可在管理界面中选择去卸载的。

  1. 创建第一个管理员用户

可选操作,也可不创建,不创建可以使用默认的admin用户去登陆使用,密码就是initialAdminPassword中的初始密码
image.png

3.2 插件管理

执行目录:Dashboard->Manage Jenkins->Manage Plugins->一级目录->二级目录->…

image.png

3.2.1 用户权限管理

功能:用于管理Jenkins用户权限 插件名称:Role-based Authorization Strategy

1.开启权限全局安全配置

setp1: 全局安全配置(一级目录)
image.png
step2:开启基于角色的配置(二级目录)
image.png
step3:管理和分配角色(一级目录)
image.png
step4:管理角色(二级目录)
image.png
setp5:创建角色(三级目录)
默认情况下,具有3种角色,Global roles,Item roles,Node roles

  • Global roles:全局角色,管理员等高级用户可以创建基于全局的角色
  • Item roles:针对某个或者某些项目的角色
  • Slave roles:节点相关的权限

image.png

2.创建用户

step1: 用户管理(一级目录)
image.png
step2: 新建用户(二级目录)
也可开启用户自己注册模式,详见 3.2.3-4
image.png

3.给用户分配权限

step1:管理和分配角色(一级目录)
image.png
step2:分配角色(二级目录)
image.png
step3:新增用户及分配权限(三级目录)
同理,也可分配 itemRole和slaverRole
image.png

3.2.2 凭据管理

功能:可用于存储需要密文保护的数据库密码、Gitlab密码信息、Docker私有仓库密码等,方便Jenkins于第三方应用交互。
插件名称:Credentials Binding Plugin 执行目录:Dashboard->Manage Jenkins->凭据管理|配置->一级目录->二级目录->…

image.png

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:通过上传证书文件的方式

image.png

2.管理凭据(Manage Credentials)

可对凭据进行添加域、更新、删除、移动等
image.png

3.2.3 其他

1.下载源配置

修改Jenkins插件下载地址,Jenkins国外官方插件地址下载速度慢,可修改为国内插件地址

  1. 原装:https://updates.jenkins.io/update-center.json
  2. 清华下载源:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

image.png
image.png

2.汉化包配置

功能:用于Jenkins管理界面的汉化 插件名称:Localization: Chinese (Simplified)

如果已经安装官网新版,且使用了推荐插件安装,则默认已经安装了汉化,但是汉化的不够彻底,部分依然是英文显示,有强迫症的同学可以忽略安装。

3.Git配置

功能:安装Git插件和Git工具 ,可用于GitLab代码拉取
插件名称:Git plugin

4.开启首页用户注册

image.png
image.png

3.3 全局工具配置

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

image.png
step1: Maven配置(一级目录)

Java项目打包工具

(1)Maven的安装目录
image.png
(2) 指定Maven配置文件
image.png
step2:JDK配置(一级目录)

Java服务启动及运行环境

image.png
step3: Git配置(一级目录)

Git相关代码仓库(GitLab、GitHub)连接、拉取代码等所需环境

image.png
step4: 其他配置(一级目录)

如:Gradle、Ant等,具体根据项目和语言情况选定,如果没有相关配置,可安装对应插件进行添加

3.4 全局属性配置

根据自己的需要进行全局参数配置 Dashboard->Manage Jenkins->Configure System->一级目录

image.png
step1:配置GitLab连接(一级目录)
image.png
step2:配置Java项目使用的全局变量(一级目录)
以下三个全局变量配置仅供java项目使用
image.png

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)

image.png

3.5.1 触发远程构建

身份验证令牌自定义,一般设置为加密串
例如:
身份令牌为:6666
访问URL为:http://10.x.x.18:8848/job/x-speech-master/build?token=6666
访问方式:可在浏览器直接触发或者通过代码触发该URL进行构建
image.png
注意:
使用这种方式,必须要关掉代码分之选择,且需要将Pipleline脚本中的 $branch替换成指定的分之名称,否则URL触发会没有效果
image.png

3.5.2 前置工程构建后触发

指定一个或者多个前置工程,当前置工程构建完毕后,会触发当前工程的自动构建
例如:当前工程x-speech-master,前置工程配置为x_bim_tool(多个用逗号隔开),当x_bim_tool构建完成后,x-speech-master会自动构建
image.png
image.png

3.5.3 定时构建(Build periodically)

定时字符串从左往右分别为: 分 时 日 月 周

  1. H代表形参(以保存配置为准)
  2. 30分钟构建一次: H/30 * * * *
  3. 2个小时构建一次: H H/2 * * *
  4. 每天的6点,12点,20点,一天构建3次: (多个时间点中间用逗号隔开) 0 6,12,20 * * *
  5. 每天中午12点定时构建一次: H 12 * * *
  6. 在每个小时的前半个小时内的每10分钟 H(0-29)/10 * * * *
  7. 每两小时一次,每个工作日上午9点到下午5点(也许是上午10:38,下午12:38,下午2:38,下午
  8. 4:38) H H(9-16)/2 * * 1-5

例如,配置每隔两分钟自动进行一次构建
image.png
image.png

3.5.4 轮询SCM(Poll SCM)

轮询SCM,是指定时扫描本地代码仓库的代码是否有变更,如果代码有变更就触发项目构建。时间设置规则同上。
注意:Jenkins会定时扫描本地整个项目的代码,增大系统的开销,因此轮训间隔时间不建议设置过短。
image.png
image.png
image.png

3.5.5 GitLab webhook

功能:利用Gitlab的webhook实现代码push到仓库,会立即触发项目自动构建。 (提交代码就触发构建) 插件名称:GitLab Plugin

勾选GitLab webhook选项,复制下面的url,应用+保存
image.png

登陆GitLab -> 项目 -> setting -> Webooks ->填写URL,就是上图中URL -> 勾选Push events(默认已经勾选)-> add webhook 保存
image.png
image.png
注意,这里需要在Jenkins中的 Manage Jenkins->Configure System ,否则测试会报错!!
image.png
配置成功后,测试,提价代码,会发现触发了构建操作。
image.png
image.png

四、项目构建

4.1 项目构建类型

4.1.1 项目构建类型介绍

Jenkins中自动构建项目的类型有很多,常用的有以下三种:

  • 自由风格项目(FreeStyle Project)
  • Maven项目(Maven Project)
  • 流水线项目(Pipeline Project)

image.png
自由风格项目(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 自由风格项目

TODO

4.2.2 Maven项目

TODO

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:新建项目
image.png
step2: 项目命名及配置项目框架类型选择
image.png

2.项目配置

(1)General配置

step1:项目描述配置(可选)
image.png
step2:GitLab连接配置选择(必填,见3.4 step1中配置)
image.png
step3:项目全局参数配置(可选)
多种参数可供选择配置,可在Web UI 或 脚本中灵活使用
image.png
例如:选择 Choice Parameter,配置代码分支
1) 配置示例
image.png
2)引用:$名称
image.png
3)页面效果
不配则没有该菜单选项
image.png

(2)构建触发器配置(可选)

不配置则进行手动触发构建(详见3.5 构建触发器配置)
image.png

(3)流水线配置

step1:流水线定义配置(必填)

Pipeline有两种配置方式:

  • 方式一:Pipeline Script (脚本写在 Web UI 上)
  • 方式二:Pipeline script from SCM(建立脚本文件由GitLab托管)

image.png

方式一:Pipeline Script
1)选择一个脚本模板,保留模板结构,替换模板中脚本代码,脚本代码编写,可辅助使用流水线语法
image.png

2)流水线生成器Web UI 界面介绍
image.png
方式二:Pipeline script from SCM
1)填写相关信息

  1. 填写Git信息(必填)

image.png
注意:
image.png

  1. 添加分支,根据自己的业务进行自定义添加(必填)

image.png
注意:此处不能使用 $branch项目全局变量,执行会报错

  1. 脚本路径(必填)

默认为Jenkinsfile(可改,但不推荐修改,区分大小写)
image.png
注意:此处的名字要和后面的脚本文件名字一一对应

2) 脚本文件创建
在项目工程的根目录中,创建文件名为Jenkinsfile(脚本路径名字修改了则做对应调整)的脚本文件
image.png
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
image.png
填写信息
image.png
image.png
生成流水线脚本,复制脚本替换掉结构模板中-位置1处的注释,实现代码拉取

(2)第二步:将拉取的代码打包成jar

Jenkins调用配置的maven工具将拉取的代码打包成jar包,选择:bat:Windows Batch Script(注意:由于Maven工具是装在windows服务器上的,所以调用需要使用bat,调用Linux中的Maven则不能使用该方式,应当使用sh:shell Script),复制脚本替换掉结构模板中-位置2处的注释,实现打包功能
image.png

mvn clean && mvn package -DskipTests=true

bat 'mvn clean && mvn package -DskipTests=true'

(3)第三步:将jar包上传到指定服务器 ,第四步:备份、替换、重启服务

第三四步可在一个代码生成器中完成(也可拆开,拆开第四步需要重新连接远程Linux服务器,因此我放在一步完成),选择:sshPublisher:Send build artifacts over SSH
image.png
image.png

  • 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钩子的配置策略会执行相应的触发构建操作。
image.png

项目二:Windows-Java-springboot项目构建及发布流程

1.项目创建

同项目一

2.项目配置

同项目一

3.Jenkins-Pipeline脚本编写

(1)第一步:从GitLab中拉取代码

同项目一

(2)第二步:将拉取的代码打包成jar

同项目一

(3)第三步:将jar包上传到指定服务器,第四步:备份、替换、重启服务

这里的目标服务器和Jenkins同在一台服务器,所以省去了远程连接目标服务器的操作,直接执行windows命令即可完成第三四步骤,复制脚本替换掉结构模板中-位置3处的注释,完成服务替换、备份、重启相关功能。
image.png

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.发布

同项目一

五、其他操作

  1. 代码分支选择 TODO
  2. 服务器间远程传输问题(SSH)TODO

六、构建过程中遇到的问题

问题1:Jenkins启动杀死衍生进程

现象描述:Jenkins执行脚本启动目标服务,脚本运行成功并正常结束,目标服务未重启成功。
场景:Jenkins Pipeline Job,执行脚本(Linux-shell/windows-bat),用脚本来停止、换包、启动目标服务,当Jenkins Pipeline Job执行完成后,发现后台目标服务进程没有正常启动

本质原因:Jenkins会在构建完成后,默认使用processTreeKiller杀掉了所有子进程(衍生进程)
问题处理:

  1. 没有合理设置环境变量BUILD_ID、JENKINS_NODE_COOKIE
    1. 对于Jenkins普通Job,更改Jenkins的ProcessTreeKiller寻找的环境变量BUILD_ID
    2. 对于Jenkins Pipeline Job,使用 JENKINS_NODE_COOKIE 代替BUILD_ID
  2. 执行nohup java -jar xxx.jar &命令时已经离开了该 job 的WORKSPACE
    1. 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属性。
  3. ssh管道到其他node执行nohup java -jar xxx.jar &时环境变量缺失
    1. source /etc/profile 刷新环境变量,使得在当前终端中有效
  4. 子进程没有足够的时间启动
    1. 保证服务时间正常启动 ,例如延时5秒
      1. Linux :sleep 5s
      2. Windows:ping 127.0.0.1 -n 5>nul (约延时5s)