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等。

工作原理

Jenkins - 图1

Jenkins - 图2
1 )首先,开发人员每天进行代码提交,提交到Git仓库
2)然后,Jenkins作为持续集成工具,使用Git工具到Git仓库拉取代码到集成服务器,再配合JDK,
Maven等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新
再执行一次整个流程。
3)最后,Jenkins把生成的jar或war包分发到测试服务器或者生产服务器,测试人员或用户就可以访问
应用。

jenkins安装

  1. 启动docker,下载Jenkins镜像文件
    1. docker pull jenkins/jenkins
  1. 创建Jenkins挂载目录并授权权限(我们在服务器上先创建一个jenkins工作目录 /var/jenkins_mount,赋予相应权限,稍后我们将jenkins容器目录挂载到这个目录上,这样我们就可以很方便地对容器内的配置文件进行修改。 如果我们不这样做,那么如果需要修改容器配置文件,将会有点麻烦,因为虽然我们可以使用docker exec -it —user root 容器id /bin/bash 命令进入容器目录,但是连简单的 vi命令都不能使用)

    1. mkdir -p /var/jenkins_mount
    2. chmod 777 /var/jenkins_mount
  2. 创建并启动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 给容器起一个别名

  1. 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
  1. 配置镜像加速,进入 cd /var/jenkins_mount/ 目录。

Jenkins - 图3

修改 vi hudson.model.UpdateCenter.xml里的内容
修改前
Jenkins - 图4
将 url 修改为 清华大学官方镜像:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
修改后
Jenkins - 图5

修改jenkins校验源defalut.json的内容,两个一致清华源的镜像地址即可。

  1. cd /var/jenkins_mount/updates
  2. sed -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
  1. 访问Jenkins页面,输入你的ip加上10240

Jenkins - 图6

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

    1. vi /var/jenkins_mount/secrets/initialAdminPassword

    Jenkins - 图7

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

Jenkins - 图8
用户名/密码 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插件

插件安装

image.png

开启权限全局安全配置

image.png
授权策略切换为”Role-Based Strategy”,保存.转成比较细粒度的权限控制!!!!

创建角色

在系统管理页面进入 Manage and Assign Roles————>点击”Manage Roles”
image.pngGlobal roles(全局角色):管理员等高级用户可以创建基于全局的角色
Project roles(项目角色):针对某个或者某些项目的角色
Slave roles(奴隶角色):节点相关的权限

我们添加以下三个角色:
baseRole:该角色为全局角色。这个角色需要绑定Overall下面的Read权限,是为了给所有用户绑定最基本的Jenkins访问权限。注意:如果不给后续用户绑定这个角色,会报错误:用户名 is missing the Overall/Read permission
role1:该角色为项目角色。使用正则表达式绑定”itcast.“,意思是只能操作itcast开头的项目。
role2:该角色也为项目角色。绑定”itheima.
“,意思是只能操作itheima开头的项目。
image.png

新建用户

系统管理—>用户管理—>新建用户
image.png
分别创建两个用户:jack/132456和itcast/123456

给用户分配角色:
系统管理页面进入Manage and Assign Roles,点击Assign Roles
绑定规则如下:

  • eric用户分别绑定baseRole和role1角色
  • jack用户分别绑定baseRole和role2角色

image.png

创建项目测试权限

创建两个自由风格的项目:
image.png

结果为:
eric用户登录,只能看到itcast01项目
jack用户登录,只能看到itheima01项目

Jenkins凭证管理

要在Jenkins使用凭证管理功能,需要安装Credentials Binding插件,凭据可以用来存储需要密文保护的数据库密码、Gitlab密码信息、Docker私有仓库密码等,以便Jenkins可以和这些第三方的应用进行交互。
系统管理—>Manage Credentials—>管理凭据—->全局凭据—->添加凭据
image.png

  • 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工具。
image.png

image.png
image.png

测试凭证是否可用

打开新建的项目,test01—->配置
点击应用和保存:选择git地址和凭证
image.png
image.png image.png
进入容器可以看到代码已经拉取成功:
image.png

SSH密钥类型登录

image.png
1)使用root用户生成公钥和私钥
ssh-keygen -t rsa

在/root/.ssh/目录保存了公钥和使用
image.png

  • id_rsa:私钥文件
  • id_rsa.pub:公钥文件

2)把生成的公钥放在Gitlab中
以root账户登录->点击头像->Settings->SSH Keys
复制刚才id_rsa.pub文件的内容到这里,点击”Add Key”
image.png

3)在Jenkins中添加凭证,配置私钥
在Jenkins添加一个新的凭证,类型为”SSH Username with private key”,把刚才生成私有文件内容复制过来
image.png

image.png
4)测试凭证是否可用
新建”test02”项目->源码管理->Git,这次要使用Gitlab的SSH连接,并且选择SSH凭证
image.png
image.png
同样尝试构建项目,如果代码可以正常拉取,代表凭证配置成功!

持续集成环境-Maven安装和配置

可以使用maven的插件进行打包,再手动更改maven的setting配置文件!!
image.png

image.png

测试Maven是否配置成功

新创建一个任务,选择构建maven任务
image.png

配置上git等参数.点击构建.

image.png

Jenkins构建Maven项目

Jenkins项目构建类型-构建的项目类型介绍

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

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

每种类型的构建其实都可以完成一样的构建过程与结果,只是在操作方式、灵活度等方面有所区别,在
实际开发中可以根据自己的需求和习惯来选择。(PS:个人推荐使用流水线类型,因为灵活度非常高)

Jenkins-自由风格项目构建——略

下面演示创建一个自由风格项目来完成项目的集成过程:
拉取代码->编译->打包->部署
拉取代码
1)创建项目
2)配置源码管理,从gitlab拉取代码
编译打包
构建->添加构建步骤->Executor Shell

  1. echo "开始编译和打包"
  2. mvn clean package
  3. echo "编译和打包结束"

部署
把项目部署到远程的Tomcat里面
1)安装 Deploy to container插件
Jenkins本身无法实现远程部署到Tomcat的功能,需要安装Deploy to container插件实现
image.png
2)添加Tomcat用户凭证
image.png
3)添加构建后操作
image.png image.png

image.png
点击”Build Now”,开始构建过程
image.png
4)部署成功后,访问项目 http://192.168.66.102:8080/web_demo-1.0-SNAPSHOT/

Jenkins-Maven项目构建

1)安装Maven Integration插件
2)创建Maven项目
3)配置项目 拉取代码和远程部署的过程和自由风格项目一样,只是”构建”部分不同
image.png

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版本以后推荐使用声明式

创建项目:
image.png
流水线->选择HelloWorld模板
image.png

  • stages:代表整个流水线的所有执行阶段。通常stages只有1个,里面包含多个stage
  • stage:代表流水线中的某个阶段,可能出现n个。一般分为拉取代码,编译构建,部署等阶段。
  • steps:代表一个阶段内需要执行的逻辑。steps里面是shell脚本,git拉取代码,ssh远程发布等任意内
  • 容。

编写一个简单声明式Pipeline:

  1. pipeline {
  2. agent any #代理/工具/环境等
  3. stages {
  4. stage('拉取代码') {
  5. steps {
  6. echo '拉取代码'
  7. }
  8. }
  9. stage('编译构建') {
  10. steps {
  11. echo '编译构建'
  12. }
  13. }
  14. stage('项目部署') {
  15. steps {
  16. echo '项目部署'
  17. }
  18. }
  19. }
  20. }

点击构建:
image.png

2)Scripted Pipeline脚本式-Pipeline

创建流水线:demo728_pipline02
这次选择”Scripted Pipeline”

  1. node {
  2. def mvnHome
  3. stage('Preparation') { // for display purposes
  4. // Get some code from a GitHub repository
  5. git 'https://github.com/jglick/simple-maven-project-with-tests.git'
  6. // Get the Maven tool.
  7. // ** NOTE: This 'M3' Maven tool must be configured
  8. // ** in the global configuration.
  9. mvnHome = tool 'M3'
  10. }
  11. stage('Build') {
  12. // Run the maven build
  13. withEnv(["MVN_HOME=$mvnHome"]) {
  14. if (isUnix()) {
  15. sh '"$MVN_HOME/bin/mvn" -Dmaven.test.failure.ignore clean package'
  16. } else {
  17. bat(/"%MVN_HOME%\bin\mvn" -Dmaven.test.failure.ignore clean package/)
  18. }
  19. }
  20. }
  21. stage('Results') {
  22. junit '**/target/surefire-reports/TEST-*.xml'
  23. archiveArtifacts 'target/*.jar'
  24. }
  25. }
  • 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

  1. node {
  2. def mvnHome
  3. stage('拉取代码') {
  4. echo '拉取代码'
  5. }
  6. stage('编译构建') {
  7. echo '编译构建'
  8. }
  9. stage('项目部署') {
  10. echo '项目部署'
  11. }
  12. }

构建结果和声明式一样

生成脚本

image.png

  1. 创建拉取代码脚本

image.png

  1. 创建编译代码脚本

    sh ‘mvn clean package’

image.png

  1. 创建项目部署脚本
  1. sh 'scp /var/jenkins_home/workspace/demo728_pipline/target/demo2-0.0.1-SNAPSHOT.jar root@192.168.154.147:/opt'

安装jdk1.8做为部署环境

  1. docker pull kdvolder/jdk8
  2. docker run -di --name=jdk1.8 kdvolder/jdk8

或者远程安装jdk

  1. yum install -y java-1.8.0-openjdk-devel.x86_64

部署jar包到远程服务器

  1. 安装插件

①Publish Over SSH用于连接远程服务器
②Deploy to container插件用于把打包的应用发布到远程服务器

  1. 在jenkins所在服务器,生成公钥和私钥。

命令如下:

  1. ssh-keygen

默认会保存在~/.ssh目录下

  1. id_rsa # 私有证书
  2. id_rsa.pub # 公有证书

如果对方主机想要访问此主机,需要把此主机的公钥交给它即可

  1. 生成之后把生成的公钥放在需要部署jar的服务器的.ssh/authorized_keys文件中。然后进入jenkins系统配置

image.png

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

image.png

  1. 将jenkins的公钥传递到java服务器

    1. # i后面接的参数是保存你公钥的文件(我们这里是.ssh/id_rsa.pub);
    2. # git是远程主机的用户,这条指令会往git这个用户的主目录下的
    3. # .ssh/authorized_keys文件写入id_rsa.pub保存的公钥
    4. ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.154.147
  2. 创建流水线脚本,并执行 ``` pipeline { agent any stages {

    1. stage('拉取代码') {
    2. steps {
    3. 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']]])
    4. }
    5. }
    6. stage('编译构建') {
    7. steps {
    8. sh 'mvn clean package'
    9. }
    10. }
    11. stage('项目部署') {
    12. steps {
    13. sh 'scp /var/jenkins_home/workspace/demo728_pipline/target/demo2-0.0.1-SNAPSHOT.jar root@192.168.154.147:/opt'
    14. sh 'ssh root@192.168.154.147 "java -jar /opt/demo2-0.0.1-SNAPSHOT.jar & "'
    15. }
    16. }

    } }

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/729489/1627889197552-31d70877-27ee-4af7-9be9-9cb1459a7e2f.png#clientId=u6f969e3a-122e-4&from=paste&height=368&id=u461046d6&margin=%5Bobject%20Object%5D&name=image.png&originHeight=368&originWidth=805&originalType=binary&ratio=1&size=43622&status=done&style=none&taskId=ud1de09a7-ca32-4fcd-922d-bb5c598a80b&width=805)
  2. <a name="Y7PCo"></a>
  3. ### 常用构建触发器
  4. Jenkins内置4种构建触发器:
  5. - 触发远程构建
  6. - 其他工程构建后触发(Build after other projects are build
  7. - 定时构建(Build periodically
  8. - 轮询SCMPoll SCM
  9. <a name="hxfdb"></a>
  10. #### 触发远程构建
  11. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/729489/1627893206820-71460c0f-bba9-4b1f-a88c-3536e568218a.png#clientId=ue6a7fb32-27e1-4&from=paste&height=239&id=u25501107&margin=%5Bobject%20Object%5D&name=image.png&originHeight=239&originWidth=770&originalType=binary&ratio=1&size=36174&status=done&style=none&taskId=u4a1a312d-00f5-4662-83a7-260aadebc08&width=770)<br />发送链接:[http://192.168.154.139:10240](http://192.168.154.139:10240/)/job/demo728_pipline/build?token=6666
  12. <a name="CoH98"></a>
  13. #### 其他工程构建后触发
  14. 当前项目的构建依赖另外一个项目构建。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/729489/1627893712822-f5df02c7-0957-4a0d-b84f-4347f712c874.png#clientId=ue6a7fb32-27e1-4&from=paste&height=373&id=uefd24878&margin=%5Bobject%20Object%5D&name=image.png&originHeight=373&originWidth=1188&originalType=binary&ratio=1&size=34048&status=done&style=none&taskId=u145fbf1d-ca93-4076-845a-919a2b5b7bf&width=1188)
  15. <a name="nQPaI"></a>
  16. #### 定时构建
  17. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/729489/1627893967577-391bc12c-9cb3-4221-b8c0-593b9c3fb4e9.png#clientId=ue6a7fb32-27e1-4&from=paste&height=367&id=u80d92b31&margin=%5Bobject%20Object%5D&name=image.png&originHeight=367&originWidth=869&originalType=binary&ratio=1&size=41788&status=done&style=none&taskId=ubfcb1116-528b-4df8-9564-0a1b174aea9&width=869)<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,是指定时扫描本地代码仓库的代码是否有变更,如果代码有变更就触发项目构建。
image.png
注意:这次构建触发器,Jenkins会定时扫描本地整个项目的代码,增大系统的开销,不建议使用。

Git hook自动触发构建(*)

就是利用Gitlab的webhook实现代码push到仓库,立即触发项目自动构建。
image.png

安装Gitlab Hook插件

需要安装两个插件: Gitlab Hook和GitLab
很明显需要两点配置:1. gitlab发送请求。 2. jenkins配置流水线
继续使用demo728_pipline:
image.png

以root账户登录gitlab:
1)开启webhook功能 :允许发布外部请求。
使用root账户登录到后台,点击Admin Area -> Settings -> Network
勾选”Allow requests to the local network from web hooks and services”
image.png

2)在项目添加webhook
点击项目->Settings->Integrations
image.png

注意:以下设置必须完成,否则会报错!
Manage Jenkins->Configure System

image.png
重新发起测试:项目部署成功!!!
image.png

Jenkins的参数化构建

有时在项目构建的过程中,我们需要根据用户的输入动态传入一些参数,从而影响整个构建结果,这时
我们可以使用参数化构建。
Jenkins支持非常丰富的参数类型,添加字符串类型的参数
image.png
改动pipeline流水线代码
image.png

在git上新建分支:v1

点击Build with Parameters
image.png

image.png

整合邮件——-未尝试

常见问题

跑流水线提示mvn: not found

检查

由于我创建的的jenkins是使用docker进行创建的,需要先将maven通过cp复制到容器中!!!!

  1. 检查是否安装了Maven插件
    Jenkins - 图61
  2. 检查jenkins全局工具配置Maven及JDK安装目录
    Jenkins - 图62
    Jenkins - 图63
  3. 检查系统设置中是否配置了环境变量(发现未配置)
    Jenkins - 图64

    解决

    找到了此次问题所在,配置环境变量并重新执行构建,问题解决
    Jenkins - 图65
    [

](https://www.pianshen.com/article/54951541457/)