jenkins介绍
Jenkins 是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。官网: http://jenkins-ci.org/。https://www.jenkins.io/zh/
Jenkins的特征:
- 开源的 Java语言开发持续集成工具,支持持续集成,持续部署。
- 易于安装部署配置:可通过 yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理。
- 消息通知及测试报告:集成 RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告。
- 分布式构建:支持 Jenkins能够让多台计算机一起构建/测试。
- 文件识别: Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。
- 丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如 git,svn,maven,docker等。
工作原理


1 )首先,开发人员每天进行代码提交,提交到Git仓库
2)然后,Jenkins作为持续集成工具,使用Git工具到Git仓库拉取代码到集成服务器,再配合JDK,
Maven等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新
再执行一次整个流程。
3)最后,Jenkins把生成的jar或war包分发到测试服务器或者生产服务器,测试人员或用户就可以访问
应用。
jenkins安装
- 启动docker,下载Jenkins镜像文件
docker pull jenkins/jenkins
创建Jenkins挂载目录并授权权限(我们在服务器上先创建一个jenkins工作目录 /var/jenkins_mount,赋予相应权限,稍后我们将jenkins容器目录挂载到这个目录上,这样我们就可以很方便地对容器内的配置文件进行修改。 如果我们不这样做,那么如果需要修改容器配置文件,将会有点麻烦,因为虽然我们可以使用docker exec -it —user root 容器id /bin/bash 命令进入容器目录,但是连简单的 vi命令都不能使用)
mkdir -p /var/jenkins_mountchmod 777 /var/jenkins_mount
创建并启动Jenkins容器
-d 后台运行镜像
-p 10240:8080 将镜像的8080端口映射到服务器的10240端口。
-p 10241:50000 将镜像的50000端口映射到服务器的10241端口
-v /var/jenkins_mount:/var/jenkins_mount /var/jenkins_home目录为容器jenkins工作目录,我们将硬盘上的一个目录挂载到这个位置,方便后续更新镜像后继续使用原来的工作目录。这里我们设置的就是上面我们创建的 /var/jenkins_mount目录
-v /etc/localtime:/etc/localtime让容器使用和服务器同样的时间设置。
—name myjenkins 给容器起一个别名
docker run -d -p 10240:8080 -p 10241:50000 -v /var/jenkins_mount:/var/jenkins_home -v /etc/localtime:/etc/localtime --name myjenkins jenkins/jenkins
- 配置镜像加速,进入 cd /var/jenkins_mount/ 目录。

修改 vi hudson.model.UpdateCenter.xml里的内容
修改前
将 url 修改为 清华大学官方镜像:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
修改后
修改jenkins校验源defalut.json的内容,两个一致清华源的镜像地址即可。
cd /var/jenkins_mount/updatessed -i 's/https:\/\/updates.jenkins.io\/download/http:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
- 访问Jenkins页面,输入你的ip加上10240

管理员密码获取方法,编辑initialAdminPassword文件查看,把密码输入登录中的密码即可,开始使用。
vi /var/jenkins_mount/secrets/initialAdminPassword

到此以全部安装成功,尽情的使用吧!

用户名/密码 root/root
常用插件
Jenkins->Manage Jenkins->Manage Plugins,点击Available
下载中文汉化插件:Chinese
用户权限管理:Role-based Authorization Strategy
①Publish Over SSH用于连接远程服务器
②Deploy to container插件用于把打包的应用发布到远程服务器
Jenkins用户权限管理
jenkins的权限管理比较粗糙,需要使用这个插件管理用户权限.
我们可以利用Role-based Authorization Strategy 插件来管理Jenkins用户权限
要在Jenkins使用凭证管理功能,需要安装Credentials Binding插件
插件安装
开启权限全局安全配置

授权策略切换为”Role-Based Strategy”,保存.转成比较细粒度的权限控制!!!!
创建角色
在系统管理页面进入 Manage and Assign Roles————>点击”Manage Roles”
Global roles(全局角色):管理员等高级用户可以创建基于全局的角色
Project roles(项目角色):针对某个或者某些项目的角色
Slave roles(奴隶角色):节点相关的权限
我们添加以下三个角色:
baseRole:该角色为全局角色。这个角色需要绑定Overall下面的Read权限,是为了给所有用户绑定最基本的Jenkins访问权限。注意:如果不给后续用户绑定这个角色,会报错误:用户名 is missing the Overall/Read permission
role1:该角色为项目角色。使用正则表达式绑定”itcast.“,意思是只能操作itcast开头的项目。
role2:该角色也为项目角色。绑定”itheima.“,意思是只能操作itheima开头的项目。
新建用户
系统管理—>用户管理—>新建用户
分别创建两个用户:jack/132456和itcast/123456
给用户分配角色:
系统管理页面进入Manage and Assign Roles,点击Assign Roles
绑定规则如下:
- eric用户分别绑定baseRole和role1角色
- jack用户分别绑定baseRole和role2角色
创建项目测试权限
创建两个自由风格的项目:
结果为:
eric用户登录,只能看到itcast01项目
jack用户登录,只能看到itheima01项目
Jenkins凭证管理
要在Jenkins使用凭证管理功能,需要安装Credentials Binding插件,凭据可以用来存储需要密文保护的数据库密码、Gitlab密码信息、Docker私有仓库密码等,以便Jenkins可以和这些第三方的应用进行交互。
系统管理—>Manage Credentials—>管理凭据—->全局凭据—->添加凭据
- Username with password:用户名和密码
- SSH Username with private key:使用SSH用户和密钥
- Secret file:需要保密的文本文件,使用时Jenkins会将文件复制到一个临时目录中,再将文件路径设置到一个变量中,等构建结束后,所复制的Secret file就会被删除。
- Secret text:需要保存的一个加密的文本串,如钉钉机器人或Github的api token
- Certificate:通过上传证书文件的方式
从gitlib拉取代码
为了让Jenkins支持从Gitlab拉取源码,需要安装Git插件以及在CentOS7上安装Git工具。


测试凭证是否可用
打开新建的项目,test01—->配置
点击应用和保存:选择git地址和凭证

进入容器可以看到代码已经拉取成功:
SSH密钥类型登录

1)使用root用户生成公钥和私钥
ssh-keygen -t rsa
在/root/.ssh/目录保存了公钥和使用
- id_rsa:私钥文件
- id_rsa.pub:公钥文件
2)把生成的公钥放在Gitlab中
以root账户登录->点击头像->Settings->SSH Keys
复制刚才id_rsa.pub文件的内容到这里,点击”Add Key”
3)在Jenkins中添加凭证,配置私钥
在Jenkins添加一个新的凭证,类型为”SSH Username with private key”,把刚才生成私有文件内容复制过来

4)测试凭证是否可用
新建”test02”项目->源码管理->Git,这次要使用Gitlab的SSH连接,并且选择SSH凭证

同样尝试构建项目,如果代码可以正常拉取,代表凭证配置成功!
持续集成环境-Maven安装和配置
可以使用maven的插件进行打包,再手动更改maven的setting配置文件!!

测试Maven是否配置成功
新创建一个任务,选择构建maven任务
配置上git等参数.点击构建.

Jenkins构建Maven项目
Jenkins项目构建类型-构建的项目类型介绍
Jenkins中自动构建项目的类型有很多,常用的有以下三种:
- 自由风格软件项目(FreeStyle Project)
- Maven项目(Maven Project)
- 流水线项目(Pipeline Project)
每种类型的构建其实都可以完成一样的构建过程与结果,只是在操作方式、灵活度等方面有所区别,在
实际开发中可以根据自己的需求和习惯来选择。(PS:个人推荐使用流水线类型,因为灵活度非常高)
Jenkins-自由风格项目构建——略
下面演示创建一个自由风格项目来完成项目的集成过程:
拉取代码->编译->打包->部署
拉取代码
1)创建项目
2)配置源码管理,从gitlab拉取代码
编译打包
构建->添加构建步骤->Executor Shell
echo "开始编译和打包"mvn clean packageecho "编译和打包结束"
部署
把项目部署到远程的Tomcat里面
1)安装 Deploy to container插件
Jenkins本身无法实现远程部署到Tomcat的功能,需要安装Deploy to container插件实现
2)添加Tomcat用户凭证
3)添加构建后操作


点击”Build Now”,开始构建过程
4)部署成功后,访问项目 http://192.168.66.102:8080/web_demo-1.0-SNAPSHOT/
Jenkins-Maven项目构建
1)安装Maven Integration插件
2)创建Maven项目
3)配置项目 拉取代码和远程部署的过程和自由风格项目一样,只是”构建”部分不同
Jenkins-Pipeline流水线项目构建(*)
Pipeline简介
1)概念 Pipeline,简单来说,就是一套运行在 Jenkins 上的工作流框架,将原来独立运行于单个或者多个节点
的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。
2)使用Pipeline有以下好处(来自翻译自官方文档): 代码:Pipeline以代码的形式实现,通常被检入源代码控制,使团队能够编辑,审查和迭代其传送流 程。持久:无论是计划内的还是计划外的服务器重启,Pipeline都是可恢复的。可停止:Pipeline可接
收交互式输入,以确定是否继续执行Pipeline。多功能:Pipeline支持现实世界中复杂的持续交付要
求。它支持fork/join、循环执行,并行执行任务的功能。可扩展:Pipeline插件支持其DSL的自定义扩
展,以及与其他插件集成的多个选项。
3)如何创建 Jenkins Pipeline呢?
安装Pipeline插件
安装的docker版本默认安装了流水线插件.
Pipeline语法快速入门
1)Declarative声明式-Pipeline———jenkins2.0版本以后推荐使用声明式
创建项目:
流水线->选择HelloWorld模板
- stages:代表整个流水线的所有执行阶段。通常stages只有1个,里面包含多个stage
- stage:代表流水线中的某个阶段,可能出现n个。一般分为拉取代码,编译构建,部署等阶段。
- steps:代表一个阶段内需要执行的逻辑。steps里面是shell脚本,git拉取代码,ssh远程发布等任意内
- 容。
编写一个简单声明式Pipeline:
pipeline {agent any #代理/工具/环境等stages {stage('拉取代码') {steps {echo '拉取代码'}}stage('编译构建') {steps {echo '编译构建'}}stage('项目部署') {steps {echo '项目部署'}}}}
点击构建:
2)Scripted Pipeline脚本式-Pipeline
创建流水线:demo728_pipline02
这次选择”Scripted Pipeline”
node {def mvnHomestage('Preparation') { // for display purposes// Get some code from a GitHub repositorygit 'https://github.com/jglick/simple-maven-project-with-tests.git'// Get the Maven tool.// ** NOTE: This 'M3' Maven tool must be configured// ** in the global configuration.mvnHome = tool 'M3'}stage('Build') {// Run the maven buildwithEnv(["MVN_HOME=$mvnHome"]) {if (isUnix()) {sh '"$MVN_HOME/bin/mvn" -Dmaven.test.failure.ignore clean package'} else {bat(/"%MVN_HOME%\bin\mvn" -Dmaven.test.failure.ignore clean package/)}}}stage('Results') {junit '**/target/surefire-reports/TEST-*.xml'archiveArtifacts 'target/*.jar'}}
- Node:节点,一个 Node 就是一个 Jenkins 节点,Master 或者 Agent,是执行 Step 的具体运行环境,后续讲到Jenkins的Master-Slave架构的时候用到。
- Stage:阶段,一个 Pipeline 可以划分为若干个 Stage,每个 Stage 代表一组操作,比如: Build、Test、Deploy,Stage 是一个逻辑分组的概念。
- Step:步骤,Step 是最基本的操作单元,可以是打印一句话,也可以是构建一个 Docker 镜像,由各类 Jenkins 插件提供,比如命令:sh ‘make’,就相当于我们平时 shell 终端中执行 make 命令一样。
编写一个简单的脚本式Pipeline
node {def mvnHomestage('拉取代码') {echo '拉取代码'}stage('编译构建') {echo '编译构建'}stage('项目部署') {echo '项目部署'}}
构建结果和声明式一样
生成脚本

- 创建拉取代码脚本

创建编译代码脚本
sh ‘mvn clean package’

- 创建项目部署脚本
sh 'scp /var/jenkins_home/workspace/demo728_pipline/target/demo2-0.0.1-SNAPSHOT.jar root@192.168.154.147:/opt'
安装jdk1.8做为部署环境
docker pull kdvolder/jdk8docker run -di --name=jdk1.8 kdvolder/jdk8
或者远程安装jdk
yum install -y java-1.8.0-openjdk-devel.x86_64
部署jar包到远程服务器
- 安装插件
①Publish Over SSH用于连接远程服务器
②Deploy to container插件用于把打包的应用发布到远程服务器
- 在jenkins所在服务器,生成公钥和私钥。
命令如下:
ssh-keygen
默认会保存在~/.ssh目录下
id_rsa # 私有证书id_rsa.pub # 公有证书
如果对方主机想要访问此主机,需要把此主机的公钥交给它即可
- 生成之后把生成的公钥放在需要部署jar的服务器的.ssh/authorized_keys文件中。然后进入jenkins系统配置

- 把生成的私钥放在key那里,path to key写上私钥的路径。

将jenkins的公钥传递到java服务器
# i后面接的参数是保存你公钥的文件(我们这里是.ssh/id_rsa.pub);# git是远程主机的用户,这条指令会往git这个用户的主目录下的# .ssh/authorized_keys文件写入id_rsa.pub保存的公钥ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.154.147
创建流水线脚本,并执行 ``` pipeline { agent any stages {
stage('拉取代码') {steps {checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '12612dfa-8b38-4d08-a41f-ee6e125c1640', url: 'http://192.168.154.139/itdemo_group/cicd-demo.git']]])}}stage('编译构建') {steps {sh 'mvn clean package'}}stage('项目部署') {steps {sh 'scp /var/jenkins_home/workspace/demo728_pipline/target/demo2-0.0.1-SNAPSHOT.jar root@192.168.154.147:/opt'sh 'ssh root@192.168.154.147 "java -jar /opt/demo2-0.0.1-SNAPSHOT.jar & "'}}
} }
<a name="Y7PCo"></a>### 常用构建触发器Jenkins内置4种构建触发器:- 触发远程构建- 其他工程构建后触发(Build after other projects are build)- 定时构建(Build periodically)- 轮询SCM(Poll SCM)<a name="hxfdb"></a>#### 触发远程构建<br />发送链接:[http://192.168.154.139:10240](http://192.168.154.139:10240/)/job/demo728_pipline/build?token=6666<a name="CoH98"></a>#### 其他工程构建后触发当前项目的构建依赖另外一个项目构建。<br /><a name="nQPaI"></a>#### 定时构建<br />定时字符串从左往右分别为:分时日月周<br />一些定时表达式的例子:H代表变化
每30分钟构建一次:H代表形参H/30 10:02 10:32 每2个小时构建一次:H H/2 每天的8点,12点,22点,一天构建3次: (多个时间点中间用逗号隔开)0 8,12,22 每天中午12点定时构建一次H 12 每天下午18点定时构建一次H 18 在每个小时的前半个小时内的每10分钟H(0-29)/10 每两小时一次,每个工作日上午9点到下午5点(也许是上午10:38,下午12:38,下午2:38,下午4:38)H H(9-16)/2 1-5 ```
轮询SCM
轮询SCM,是指定时扫描本地代码仓库的代码是否有变更,如果代码有变更就触发项目构建。
注意:这次构建触发器,Jenkins会定时扫描本地整个项目的代码,增大系统的开销,不建议使用。
Git hook自动触发构建(*)
就是利用Gitlab的webhook实现代码push到仓库,立即触发项目自动构建。
安装Gitlab Hook插件
需要安装两个插件: Gitlab Hook和GitLab
很明显需要两点配置:1. gitlab发送请求。 2. jenkins配置流水线
继续使用demo728_pipline:
以root账户登录gitlab:
1)开启webhook功能 :允许发布外部请求。
使用root账户登录到后台,点击Admin Area -> Settings -> Network
勾选”Allow requests to the local network from web hooks and services”
2)在项目添加webhook
点击项目->Settings->Integrations
注意:以下设置必须完成,否则会报错!
Manage Jenkins->Configure System
Jenkins的参数化构建
有时在项目构建的过程中,我们需要根据用户的输入动态传入一些参数,从而影响整个构建结果,这时
我们可以使用参数化构建。
Jenkins支持非常丰富的参数类型,添加字符串类型的参数
改动pipeline流水线代码
在git上新建分支:v1
点击Build with Parameters






