跳到主要内容

1、jenkins

Jenkins

image-20230320203016197

目录

[toc]

本节实践

实战名称
💘 实践:创建自由风格流水线-2023.3.21(测试成功)
💘 实践:自定义agent通信端口-2023.3.21(测试成功)
💘 实践:Jenkins配置node方法-2023.3.21(测试成功)
💘 实践:如何在流水线构建的时候使用页面参数-2023.3.22(测试成功)
💘 实践:pipeline里调shell的方式-2023.3.22(测试成功)
💘 实践:流水线回放功能-2023.3.22(测试成功)
💘 实践:pipeline里配置丢弃历史构建-2023.3.22(测试成功)
💘 实践:pipeline中字符参数和选项参数-2023.3.22(测试成功)
💘 实践:pipeline里配置远程构建-2023.3.22(测试成功)
💘 实践:Jenkins项目分类-2023.3.23(测试成功)
💘 实践:Jenkins 凭据管理-2023.3.25(测试成功)
💘 实践:Jenkins BlueOcean安装-2023.3.25(测试成功)

简介

image-20230319103340484

jenkins 概述:是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

对于持续集成工具现在也有很多,目前应用最多的是Jenkins

  • Jenkins前身是Hudson使用java语言开发的自动化发布工具。

  • Jenkins是跨平台的可以在Win、Linux、MacOS部署。

  • Jenkins是应用最广的开源免费的持续集成服务器,企业中普遍使用Jenkins来作为项目集成发布工具

  • Jenkins官方提供的插件使Jenkins更为强大

目前发展超过17年,比较成熟的CI工具(也可以CD)能够实现自动化集成发布。目前普遍使用Jenkins完成持续集成CI/持续部署CD等相关技术实践。 可以把Jenkins想象成一个脚本执行器,我们可以通过编写代码的方式灵活的控制Jenkins作业的运行与控制。

⚠️ 注意:插件是jenkins的一大优势,也是其一大弊端。Jenkins的另外一个特点(也是存在缺陷的地方),功能比较齐全是因为有丰富的插件库。基本上有1-2千个可以使用的插件。这些插件对可以无限的去扩展Jenkins一些功能

1.推荐按需使用。尽量少装一些插件。为什么呢?当以后jenkins越来越大,任务越来越多时,如果插件很多,可能在重启jenkins后会因一些插件问题而导致jenkins无法启动。 (如果插件过多没有更新管理。当在Jenkins更新的时候可能会因为插件的原因导致) 2.能不用插件实现的尽量不要使用插件!可以写一些代码来实现,这样可以减少插件的依赖。另外一点,对你的技能提升也是有很大的帮助。

Jenkins是企业里面应用最广的、开源的持续集成系统。在企业里面不管是中小型企业还是大型企业,甚至有一些专门做DevOps的厂商也在基于Jenkins来做CI/CD平台。Jenkins是开源免费的,用java语言开发的CI/CD系统。可以用Jenkins来做CI也可以用来做CD。Jenkins本质上是用来做任务的编排和可视化的一套工具。

回想18年的时候我们还在大量使用**自由风格(freestyle)**类型的项目,并没有使用Pipeline特性。 而目前Jenkins大量应用Pipeline类型的项目来进行作业构建。Pipeline类型的项目是可以通过代码进行描述的。可以通过Pipeline+Groovy对Jenkins延伸扩展,例如可以直接导入Groovy的package对Jenkins Pipeline扩展。所以使用这种模式我们将不再关心有没有实现哪些功能插件了,而是直接编写特性代码来实现功能。

image-20220411184657793

  • jenkins发布周期(每周发布一次)

image-20210428060510962

应用场景

image-20230319103939364

  • 持续集成实践

    • 集成svn/git客户端实现源代码下载检出
    • 集成maven/ant/gradle/npm构建工具实现源码编译打包单元测试
    • 集成sonarqube对源代码进行质量检查(坏味道、复杂度、新增bug等)
  • 持续部署实践

    • 集成SaltStack/Ansible实现自动化部署发布

      ⚠️ jenkins本身没有发布能力,它只是集成了这些工具的特性来实现发布,jenkins只是来调度的。

  • 自动化测试实践

    • 集成Jmeter(压力测试、接口测试)/Soar(小米开源的一个sql扫描)/Kubernetes/.....

      sonarqube也能支持sql扫描,但是需要付费;

image-20230319105959811

  • 对于运维同学:自动化一些运维任务,例如定时备份,自动发布等;
  • 对于开发同学:自动化持续集成,对代码进行编译验证等等;
  • 对于测试同学:普遍的是在测试脚本开发后进行自动化测试;

其实在分享Jenkins的具体应用场景时,不能只从运维或者开发的角度去讲,而应该是从不同的角度。例如:谁在用Jenkins。

==对于运维同学==: 一直在使用Jenkins。使用Jenkins来对管理运维相关的任务。例如, 清理一下镜像仓库里面的垃圾镜像,那准备写了个脚本,跑一下就清理完了。可以将脚本集成到Jenkins, 编写Jenkins Pipeline在流水线里面去运行脚本。 还可以通过参数化构建进行参数传递。

手动在机器上面或者通过Jenkins运行的脚本内容都是一样的,但是jenkins可以按照不同的阶段运行并将日志和运行的进度可视化的展示出来。

==对于开发同学==:每天都要提代码。例如: 代码提到版本控制系统之后,能够自动的去跑一些对提交代码验证的任务。没有Jenkins之前通过编写脚本结合Crontab定时任务来定期轮询版本控制系统。 有了Jenkins之后可以开启构建触发器轻松实现系统之间的集成。

==对于测试同学==:一般都会写一些测试用例。 没有Jenkins之前在本机上面通过命令行直接去运行。有了Jenkins之后可以将代码存储到版本控制系统然后通过Jenkins自动化地运行测试用例。还可以通过一些现有的工具对测试结果进行分析。

Jenkins就是一个中间人的角色, 如果你有一个脚本需要由Jenkins来运行。其实Jenkins启动一个shell来执行脚本。大概率出现的问题都是脚本的自身原因导致的而并非是Jenkins的执行错误。

例如: Jenkins集成maven进行构建和打包,出现编译失败的错误就需要找开发同学查看代码了。这一块之前本人是踩到坑踩的比较多了,这点经验还是告诉大家。

那除了上面描述的场景外,其实还有很多场景。可以这样认为: 你想要自动化的一些东西,都可以通过Jenkins来帮你去完成

功能特点

image-20230319110703245

  • 开源免费
  • 安装配置简单
  • 分布式主从架构
  • 可视化管理页面
  • Jenkins 2.0 核心=Pipeline As Code
  • DSL 领域特定语言,基于Groovy进行无限扩展

主从分布式架构:

jenkins:
master:做调度的。//1个master可以对应若干个agent。
agent:运行实际任务的。

⚠️ master本身也具有作业构建的能力,但是一般我们用master节点作为调度。master节点不做构建,它只是用来存储这些任务。真正构建的时候,我们在agent上构建。我们做测试的时候,可能会用master节点来做一些任务。但是实际生产环境中,我们绝对不能用master节点去构建任务。因为任务一旦多了,会影响jenkins性能,导致你直接宕机了。

Jenkins的特点:开源免费、安装简单。主从的分布式架构,分为Server和Agent。 Server主要是负责作业调度,Agent是Pipeline真正运行的节点。 (此处类似于Kubernetes的架构,尽量不要在主控节点运行任务)

可视化的管理页面:通过UI管理页面对Jenkins系统进行配置管理。 BlueOcean更加简洁和漂亮的UI页面。

Jenkins2.0核心特性:Pipeline As Code,以代码的方式描述流水线作业。特别适合大规模下的流水线复用,即多条流水线使用相同一套流水线模板。

训练营中最重要的一部分就是Jenkins PIpeline As Code,是最核心的内容。 Pipeline + Groovy YYDS!

Groovy这门语言其实与Python编程语言语法上很类似。

数据目录管理

image-20230320203252325

  • Jenkins采用本地文件的数据存储方式;

  • Jenkins的所有数据都存储在JENKINS_HOME变量定义的数据目录下;

  • 默认JENKINS_HOME的值是**/var/lib/jenkins**;

  • 注意:jenkins_home

jenkins把所有的数据都存放在了文件系统里面。

rpm方式安装的jenkins: 其家目录在/var/lib/jenkins 目录下;#注意
docker方式安装的jenkins: 其家目录在/var/jenkins_home 目录下;

jenkins所有的配置文件都是以.xml格式存储的!

docker方式安装的jenkins:

[root@Devops6 ~]#docker exec -it jenkins bash
jenkins@d6139736ef4c:/$ cd /var/jenkins_home/
jenkins@d6139736ef4c:~$ ls
config.xml hudson.model.UpdateCenter.xml jenkins.install.InstallUtil.lastExecVersion jenkins.model.JenkinsLocationConfiguration.xml jobs nodeMonitors.xml plugins secret.key secrets userContent war
copy_reference_file.log identity.key.enc jenkins.install.UpgradeWizard.state jenkins.telemetry.Correlator.xml logs nodes queue.xml.bak secret.key.not-so-secret updates users
jenkins@d6139736ef4c:~$

jenkins容器对应宿主机数据目录位置:

[root@Devops6 ~]#cd /data/devops6/jenkins_home/
[root@Devops6 jenkins_home]#ls
config.xml hudson.model.UpdateCenter.xml jenkins.install.InstallUtil.lastExecVersion jenkins.model.JenkinsLocationConfiguration.xml jobs nodeMonitors.xml plugins secret.key secrets userContent war
copy_reference_file.log identity.key.enc jenkins.install.UpgradeWizard.state jenkins.telemetry.Correlator.xml logs nodes queue.xml.bak secret.key.not-so-secret updates users

image-20230320204032066

Jenkins启动后会读取JENKINS_HOME变量,根据次变量的值来决定数据存储的位置。Jenkins是以XML格式的文件存储到数据目录。

image-20230320204101715

注意:我们以后做集成的时候,会经常和这个config.xml文件打交道。

但是需要注意的是,这里有个坑,在做集成前,一定要对这个文件做个备份。万一在做用户权限时,不小心把自己权限给设置错了,此时就需要用到这个文件来救场了。

Jenkins目录的用途:

  • caches: 系统缓存数据
  • jobs: Jenkins项目作业
  • nodes: Jenkins slave节点信息
  • secrets: 秘钥信息
  • userContent: 类似于web站点目录,可以上传一些文件 (这里可以放一个index.html文件,然后它会给你展示出来!类似于sftp功能,用的不是很多!)
  • workspace: 默认的工作目录
  • fingerprints: 指纹验证信息
  • logs : 日志信息
  • plugins: 插件相关配置
  • updates: 插件更新目录
  • users: jenkins系统用户目录

⚠️ 注意:

workspace :默认的工作目录

一般要把这个工作目录和jenkins的数据目录要分开存放,要不万一你这个目录io比较高的话,也会对jenkins有影响!

这个目录非常重要,就是我们以后运行的每一个流水线作业,它是在哪里工作,是在这个workspace目录下工作的!

默认情况下,这个workspace目录也是在jenkins_home下,但是我们一般是去自定义这个目录的!

Jenkins项目类型-Pipeline

image-20230321061113967

  • 参数化构建: 为流水线传参
    • String 字符参数
    • Choice 选项参数
  • 历史构建管理
    • 丢弃历史构建: 保留 5天内 10个构建
  • 并行构建控制

范例:创建自由风格流水线

==💘 实践:创建自由风格流水线-2023.3.21(测试成功)==

接下来我们新创建1条流水线:

默认是自由风格类型流水线;(如果要创建Pipeline类型流水线,则需要安装pipeline插件才行。)
  • 创建自由风格流水线

点击+New Item

image-20230321061616399

填写item name,点击ok

image-20230321061700151

此时,一个自由风格的流水线项目就被创建成功了,接下来,我们只需要填写一些配置参数就好:

image-20230321062229200

  • 配置参数

全局配置:

  • 丢弃旧的构建

image-20230321062751943

  • 参数化构建

image-20230321062904129

image-20230321063014612

image-20230321063525794

  • 并行构建控制

image-20230321063610564

  • Build:

image-20230321064006336

完成后,点击Save

点击Build with Parameters

image-20230321064111128

填写构建版本 和构建环境,点击Build

image-20230321064146238

可以看到构建成功被完成了:

image-20230321064207635

image-20230321064220475

测试结束。😘

范例:创建pipeline流水线

==💘 实践:创建pipeline流水线-2023.3.21(测试成功)==

  • 在使用Pipeline类型的项目时,需要提前安装Jenkins的Pipeline插件。

点击管理Jenkins-管理插件

image-20230321064440995

Availabe里查找pipeline插件,完成安装:

image-20230321064601766

image-20230321064626775

  • 安装好插件后新建一个Pipeline类型的作业:

image-20230321065652562

🍊 自由风格和pipeline风格的区别

  • 自由风格项目和Pipeline类型的项目区别是:自由风格项目构建部分的操作都是在页面上面完成的,而Pipeline的构建任务描述都是通过代码的方式。

自由风格:

image-20230321065819755

pipeline风格:

image-20230321070114158

但自由风格入门可能简单一点,这些配置我们都可以在这里选择,基本上,这一条流水线就调好了。

image-20220415151732956

范例:安装Stage View插件

注意:之前老版本在安装好Pipeline插件后,会一起安装Stage View插件的

但是当前新版本jenkins/jenkins:2.346.3-2-lts-jdk11,安装好Pipeline插件后,是不会一起安装Stage View插件的,因此需要我们单独安装此插件才行。

  • 未安装Stage View插件前

image-20230407070129956

  • 安装Stage View插件后

image-20230407070559350

范例:pipeline中字符参数和选项参数

==💘 实践:pipeline中字符参数和选项参数-2023.3.22(测试成功)==

选项参数和字符参数是我们用的最多的!

  • 同样,我们按照上面自由风格类型填写字符串参数,选项参数等配置

参数化构建是可以满足不同情况下我们可以在流水线运行前填写参数传递。这些参数会在构建流水线的页面展示。

如果我们需要填写一个具体的值,我们可以用字符参数。如果已经确定值的可选范围可以使用选项参数供用户选择。

image-20230321070308320

image-20230321070321638

  • 进行构建

image-20230321070626570

image-20230321070654198

image-20230321070712280

pipeline里配置丢弃历史构建

==💘 实践:pipeline里配置丢弃历史构建-2023.3.22(测试成功)==

  • Jenkins每一次构建都会生成对应的构建日志数据。进行大规模编译会有许多日志,占用磁盘空间。我们可以选择性的保留周期内的构建信息,例如: 1个月内的10次构建。具体的保留日期可以参考项目的发布周期。

image-20230321070246462

  • 进行多次构建并查看效果:发现这边只有最近的10次构建记录

image-20230322071740300

pipeline里配置并行构建

  • 并发构建选项,可以控制项目是否支持多次并行的构建。按照实际的场景进行选择。(默认就是开启并行构建的(只是一个选项配置而已))

image-20230321070545030

如何在流水线构建的时候使用页面参数(3种方)

==💘 实践:如何在流水线构建的时候使用页面参数-2023.3.22(测试成功)==

定义的参数可以通过${params.NAME}的方式使用。

其实在Jenkins运行时这些参数也会注入到env这个对象中,也可以通过${env.NAME}或者${NAME}

image-20230321071034214

pipeline {
agent any

stages {
stage('Hello') {
steps {
echo 'Hello World'
echo "${VERSION}"
echo "${env.VERSION}"
echo "${params.VERSION}"
}
}
}
}

image-20230321071104522

pipeline里调shell的方式

==💘 实践:pipeline里调shell的方式-2023.3.22(测试成功)==

image-20230321073644974

pipeline {
agent any

stages {
stage('Hello') {
steps {
echo 'Hello World'
echo "${VERSION}"
echo "${env.VERSION}"
echo "${params.VERSION}"
sh "ls -l"
}
}
}
}

注意:这里的引号一定要是双引号。

image-20230321073701989

流水线回放功能

==💘 实践:流水线回放功能-2023.3.22(测试成功)==

  • 使用回放功能测试代码

image-20230321074326744

image-20230321074353464

image-20230321074428691

另外,在回放里测试的代码是不会保存到自己的流水线代码里的,要记得及时保存代码哦。

⚠️ 注意:

如果某次的构建失败了的话,那么本次回放是不可用的,即上次的代码会丢失!(注意:推荐在本地编辑器编辑代码,然后复制到回放中就好)

image-20220420075928437

image-20220420080126050

Jenkins项目构建方式

image-20230321061154278

  • 定时构建:到具体时间进行触发。
  • API 触发构建
  • 与其他系统联动
    • Gitlab提交代码后通过webhook触发构建(主动)
    • Jenkins 轮训Gitlab检测到代码变更触发构建(被动)

image-20230321063742284

image-20230321063913332

==💘 实践:pipeline里配置远程构建-2023.3.22(测试成功)==

远程构建:配置一个认证token,触发时必须带有token才行。

image-20230322075548160

触发命令:

#触发
curl -uadmin:admin http://192.168.1.200:8080/job/demo-pipeline/build?token=zeyang

#触发并传递参数
curl -uadmin:admin "http://192.168.1.200:8080/job/demo-pipeline/buildWithParameters?token=zeyang&VERSION=4.4.4&ENV_NAME=uat"

注意: 当流水线选择了参数化构建就需要用参数化构建的URL进行触发参数构建也要注意,传递选项参数时值必须在值列表内

测试过程:

  • 配置远程构建

在pipeline-demo项目里,Build Triggers里勾选Trigger builds remotely,配置一个认证toktenpipeline-demo,点击Save

image-20230322075809490

  • (1)先使用curl命令测试

image-20230322123330673

curl -uadmin:admin "http://172.29.9.101:8080/job/pipeline-demo/buildWithParameters?token=pipeline-demo&VERSION=4.4.4&envName=pro"

image-20230322123038840

运行,观察效果:

image-20230322123133469

image-20230322123204656

image-20230322123217265

  • (2)这里我们使用postman再次测试下
http://172.29.9.101:8080/job/pipeline-demo/buildWithParameters?token=pipeline-demo&VERSION=4.4.4&envName=pre

image-20230322125640102

image-20230322125652403

运行:

image-20230322125741995

image-20230322130019768

  • 注意:

注意: 当流水线选择了参数化构建就需要用参数化构建的URL进行触发参数构建也要注意,传递选项参数时值必须在值列表内

image-20230322130104977

Jenkins项目分类

image-20230323074122825

项目分类:

使用视图或者文件夹来进行分类。

视图中可以使用正则表达式匹配一组作业而不用手动添加到视图。


==💘 实践:Jenkins项目分类-2023.3.23(测试成功)==

  • 使用视图进行分类: 创建一个demo的视图,用于归类demo team的作业。

image-20230323122807348

  • 选择纳入devops视图的作业, 可以手动选择作业。当作业很多的时候,推荐使用正则表达式进行匹配。(参考Java正则表达式的语法)

image-20230323123054196

注意:这里的正则表达式写法

.*表示匹配任意长度的任意字符

? 匹配其前面的字符0或1次,即:可有可无

因此这里可以写成:^devops01-.*也是可以的。(推荐不写?)。

image-20240616091808300

  • 验证

image-20230323123157464

  • 同样,我们创建2个pipeline流水线,名称叫做devops-app-servicedevops-merge-service,不配置什么,只简单创建,用于测试视图功能。

image-20230323123431680

创建一个叫做devops的视图:

image-20230323123538759

image-20230323123607642

  • 验证:

image-20230323123627985

符合预期。

Jenkins忘记密码与找回

  • 如果Jenkins登录的用户名忘记了,可以进入JENKINS_HOME/users目录中查看。

tstmp_20230323124602

取消认证则需要修改config.xml,然后重启Jenkins。

<useSecurity>false</useSecurity> 默认值为true,代表开始安全设置,false则关闭。

<denyAnonymousReadAccess>false</denyAnonymousReadAccess> 默认值为true,代码禁止匿名用户访问,false则允许。

(此处仅关闭安全设置,然后重启Jenkins服务器即可)

  • 重启后:修改用户密码,然后进入全局安全设置中开启用户认证。

tstmp_20230323124636

⚠️ 注意:当前jenkins/jenkins:2.346.3-2-lts-jdk11版本jenkins如下用户的config.xml文件里无法找到这2处配置。以上方法仅仅作为记录。

vim /data/devops6/jenkins_home/users/admin_14059091204073200622/config.xml

image-20230323124737719

image-20230323124724300

Jenkins用户管理

image-20230324065636106

  • 用户来源

    • 本地存储数据库
    • 其他认证系统[ gitlab/ ldap/ github ]
  • 用户操作

    • 增删改查禁用
  • Jenkins默认使用自带的数据库管理用户, 也可以通过安装插件实现LDAP、GitLab认证集成。

企业里Jenkins一般与ldap系统做集成; 也可以与gitalb做单点登录;

image-20230324065857100

Jenkins使用文件存储,在JENKINS_HOME/users目录中可以看到每个用户的配置。

image-20230324070035164

  • 系统设置, 用户管理,可以查看到当前的用户列表。 可以对用户新建、更新、删除。

image-20230324070142482

image-20230324070152987

Jenkins授权管理

image-20230324072022782

  • 插件: Role-Based Strategy
  • Role类型
    • Global roles 全局角色
    • Iterm roles 定义一类项目
  • Role授权

在企业中可能多个开发组织共用同一个Jenkins服务器, 不会让用户具有管理员权限的, 需要给用户分配对应的Group组织权限。例如: 张三, 属于devops1这个组织, 仅允许张三对devops1组织相关的jenkins作业进行构建操作。

就是后面我们把jenkins落地到了企业后,大家是如何登录这个系统呢?我们需要给它创建用户和账号,企业里面用户那么多,我们怎么给他们一一分配账号呢? 1、这里面有一种方法,叫做认证集成,你可以和LDAP系统做对接,LDAP是我们做统一认证的地方,用户的组织结构信息都在这里!然后我们可以拿LDAP的插件和jenkins做集成,最终实现的一个效果就是,可以用LDAP里面的账号和密码去去登录Jenkins。

2、如果你的集团里面可能没有LDAP,但是你有gitlab,那么Jenkins也可以支持gitlab的单点登录

所以,登录这一块,一个是它自己的数据库,刚才我们看到的那个jenkins_home目录就是它的数据库。另外一个就是跟认证系统做集成,或者和其他第三方平台做一个sso(类似于单点登录一样!)


==💘 实践:Jenkins授权管理-2023.3.24(测试成功)==

背景:

我们再刚开始安装的时候创建了一个admin账户,现在我们再创建一个账户xyy

点击系统管理-管理用户

image-20220414220842898

点击新建用户,创建新用户:账号:xyy 密码:123456

image-20220414220934658

查看创建好的xyy账户:

image-20220414220952675

然后退出当前用户,使用刚创建的xyy账户登录jenkins系统:

image-20220414221234295

image-20220414221258988

image-20220414221311898

我们会发现,本来自己是想创建一个普通用户来着的,结果创建的用户具有管理员权限,这可不得了。为什么会这样呢?

我们退出当前账户继续以admin账户登录jenkins:

点击系统管理-安全-全局安全设置:会发现当前授权策略是登录用户可以做任何事,原来产生上面那个现象的原因在这里!

image-20220414221505788

image-20220414221538422

要想解决以上问题,是需要安装一个叫Role-Base strategy的授权插件来着的:

现在,我们来开始安装一下这个插件:

⚠️ 好用的插件也就这个了。这个插件不光提供了ui界面,还提供了api。 很早之前,老师分享了一篇这个Role-Base strategyapi操作的文章,因为老师当时在后台给他们勾选权限的时候,都是框框……,看的眼睛真的受不了了!这个时候就可以调用api去加权限,特别恐怖,勾选一个权限,特别考验你的眼力!(当时老师应该有个公开课来着的)并且其api也没怎么变化!

还有其他同学使用矩阵matrix strategy插件:(这个Role-Base strategy要比矩阵插件好用一些!)

1、安装插件

Jenkins系统中授权插件应用最广的是Role-based Authorization Strategy, 在插件管理中安装。 安装插件后重启Jenkins服务器以使其生效。

tstmp_20230324072423

重启Jenkins服务器之后,进入系统设置,全局安全配置。 配置授权策略为Role-Based Strategy

tstmp_20230324072551

image-20240616144633555

你权限分配错了,会导致你进都进不去。!!!(需提前做好home目录数据备份)

然后保存修改, 返回Jenkins系统设置页面,可以看到Manage and Assign Roles设置。

tstmp_20230324072602

2、创建Role

进入Manage and Assign Roles设置, 选择Manage Roles

tstmp_20230324072945

接下来,我们演示一下有问题版本:

创建Gobal Role devops

  • 全局Read权限
  • 查看凭据权限
  • 代理Build权限
  • 任务构建、取消、配置、、工作目录权限
  • 视图无权限

image-20240616151444379

创建item roles devops: 使用正则表达式匹配关联的一组项目

  • 匹配以devops01-开头且任意结尾的作业生效。
  • 查看凭据权限
  • 任务构建、取消、配置、读取、工作目录权限
  • 视图读权限

image-20240616152036978

3、授权Role

  • 先创建2个用户:devdev1(密码同用户名)

image-20240616151612507

image-20240616151645015

  • 给dev用户赋予权限。

image-20240616152111700

  • 这里使用刚才创建的dev用户登入系统:

image-20240616152145538

可以看到,此时效果不符合预期。

那么是什么问题呢?

这里要给Gobal Role dev把作业的权限给去掉,因为全局配置会覆盖局部配置的:

因此,这里最终统一的配置为:

创建Gobal Role devops

  • 全局Read权限
  • 查看凭据权限
  • 代理Build权限
  • 任务构建、取消、配置、工作目录权限
  • 视图无权限

image-20240616152328051

创建item roles devops: 使用正则表达式匹配关联的一组项目

  • 匹配以devops01-开头且任意结尾的作业生效。
  • 查看凭据权限
  • 任务构建、取消、配置、读取、工作目录权限
  • 视图读权限

image-20240616152424705

  • 这里再次测试:

使用dev用户登入系统,只能看到devops08组织的项目

image-20240616152456890

符合预期。

  • 注意:如果未赋予用户赋予权限时会报错如下。

image-20240616152531195

测试结束。😘

Jenkins 凭据管理

image-20230324221828427

  • 用途: 存储构建需要与其他系统认证所使用的账户或者密码信息。

  • 类型:

    • ssh-key
    • secret-text
    • secret-file
    • username/password
    • …..
  • Username with password类型:存储Harbor或者其他系统的用户名和密码。

  • GitLab API token类型:存储Gitlab的用户API token。

  • Secret text类型:可以用来存储OpenShift等系统中的token。

  • Certificate类型:可以用户存储证书,例如k8s的用户证书。

凭据管理,这个在装pipelin插件就会装好了的。

其实,jenkins的凭据管理不是很安全,但总比明文密码要强很多!

==💘 实践:Jenkins 凭据管理-2023.3.25(测试成功)==

1、创建凭据:

image-20220415201428647

image-20220415201449920

image-20220415201501489

image-20220415201644300

保存凭据, 后面流水线中使用凭据的原理是根据凭据ID进行定位的

注意:可以指定ID,如果不指定,默认是一串uid值。

image-20220415201703318

image-20230324223029251

2、使用凭据:

图形化界面,其实我们不推荐大家使用了!

image-20220415202106762

image-20220415202130853

image-20220415202246816

以后都是使用流水线pipeline:

image-20220415202340028

image-20220415202534246

image-20220415202607397

后期流水线里,我们就是用这种方式去写,这样的话,它就会把这个凭据对应的账号和密码都赋予给对应的变量,我们就可以像使用环境变量一样去调用username和password。

测试结束。

Jenkins数据备份

image-20230325064451544

  • 备份方式
    • 编写备份脚本,通过Crontab脚本备份;
    • 通过Jenkins插件进行定时备份;
  • 备份排除范围
    • workspace目录
  • 备份触发时间
    • 每天凌晨 1-2点,保留最近3、5天的备份

备份的目录是JENKINS_HOME目录, 可以通过编写脚本结合Crontab定时任务自动备份。或者使用Jenkins的插件进行备份。

也可以使用rsync同步;

备份时,插件目录很大。如果你的插件时用docker镜像来管理的话,那么插件是不用备份的,你只需要备份下job和credentials就行。

介绍下使用ThinBackup插件进行备份, 安装插件然后重启jenkins。

tstmp_20230325064656

系统设置, 最下方:

tstmp_20230325064740

填写备份目录,此目录需要存在哦:

tstmp_20230325064803

tstmp_20230325064812

点击立即备份:

tstmp_20230325064826

进入到备份的目录查看备份文件: 出现备份压缩包成功。

tstmp_20230325064840

可以基于时间点进行数据还原:

tstmp_20230325064853

Jenkins版本升级

image-20230325074404152

  • 不要跨太高的版本号
  • 数据目录要使用同一个
  • 升级前进行数据目录备份
  • RPM部署: rpm –uvh
  • Docker部署: 替换新版本镜像

对于升级可能是最容易出现问题的地方。 升级后重启Jenkins无法正常运行的情况出现过很多。 大部分是由于插件的版本导致的, 这个怎么排查呢?可以通过Jenkins logs日志定位具体的问题。

对于升级, 我们要升级一个版本后,就到插件管理更新插件。 然后再升级,再更新插件,再升级....循环。 这样可以减少因为插件的原因导致的jenkins升级后无法运行。--先升级jenkins版本,再升级插件

  • 跨小版本升级;
  • 升级前备份数据目录;

docker方式不是的Jenkins可以直接替换docker镜像, rpm方式部署的应用可以在yum源中下载jenkins的安装包,然后rpm -Uvh更新升级。

jenkins BlueOcean

image-20230325151536995

Blue Ocean减少了混乱而且进一步明确了团队中每个成员

Blue Ocean 的主要特性包括:

  • Jenkins 可视化页面

  • 美观 简洁

  • 持续交付(CD)Pipeline的 复杂可视化 ,可以让您快速直观地理解管道状态。

  • Pipeline 编辑器 - 引导用户通过直观的、可视化的过程来创建Pipeline,从而使Pipeline的创建变得平易近人。

  • 个性化 以适应团队中每个成员不同角色的需求。

  • 在需要干预和/或出现问题时 精确定位 。Blue Ocean 展示 Pipeline中需要关注的地方,简化异常处理,提高生产力。

  • 本地集成分支和合并请求, 在与GitHub 和 Bitbucket中的其他人协作编码时实现最大程度的开发人员生产力。

官方文档:https://jenkins.io/zh/doc/book/blueocean/getting-started/

BlueOcean也是需要很多很多的依赖,后来我们就自己开发了devops平台。

==💘 实践:Jenkins BlueOcean安装-2023.3.25(测试成功)==

BlueOcean是一套Jenkins的web ui页面,比原始的ui更美观和简洁一些。 需要安装插件,重启jenkins

tstmp_20230325122248

进入BlueOcean

tstmp_20230325122303

运行Pipeline

tstmp_20230325122318

查看构建日志

tstmp_20230325122343

Jenkins插件

Role-based Authorization Strategy 插件

安装授权插件。

Pipeline Utility Steps插件

这个插件可以帮我们处理yaml文件和json文件:

image-20230411132857145

image-20230411133038213

Stage View插件

注意:之前老版本在安装好Pipeline插件后,会一起安装Stage View插件的

但是当前新版本jenkins/jenkins:2.346.3-2-lts-jdk11,安装好Pipeline插件后,是不会一起安装Stage View插件的,因此需要我们单独安装此插件才行。

  • 未安装Stage View插件前

image-20230407070129956

  • 安装Stage View插件后

image-20230407070559350

timestamps插件

  • 报错现象:

image-20240617215546860

  • 安装插件

image-20240617215743325

  • 再次运行,观察现象

image-20240617220114017

pipeline util插件

  • 安装pipeline util插件(安装了这个插件后,才能使用这些语法)

image-20230411165815653

image-20230411165707838

  • 代码

image-20230411170933536

@Library("mylib") _ 

//import Common.groovy
def common = new org.devops.Common()

users = [
["id": 1, "name": "jenkins1"],
["id": 2, "name": "jenkins2"],
["id": 3, "name": "jenkins3"],
]


pipeline {
agent any

stages{
stage("Test"){
steps{
script{
echo "src output demo"
name = common.GetUserNameByID(users,1)
print(name)

echo "vars output demo"
name = GetUserName(users,2)
print(name)


echo "get resources"
data = libraryResource 'config/config.json' //这里是字符串数据
println(data)

//这里是json数据
data_json = readJSON text: data
println(data_json["id"])

}
}
}
}
}
  • 运行

image-20230411170538769

Jenkins排错

TS:pipline里代码语法写错排查方式-2023.3.22(已解决)

1、错误代码

image-20230322064607842

currentBuild.dispalyName = "Devops:commitID" #这里的displayName写成dispalyName了……
currentBuild.description = "Branch:master"
pipeline {
agent any

stages {
stage('Hello') {
steps {
echo 'Hello World'
echo "${VERSION}"
echo "${env.VERSION}"
echo "${params.VERSION}"
sh "ls -l"
}
}
}
}

2、报错现象

image-20230322064440110

image-20230322064537626

3、正确代码

  • 流水线代码

image-20230322064713764

currentBuild.displayName = "Devops:commitID"
currentBuild.description = "Branch:master"
pipeline {
agent any

stages {
stage('Hello') {
steps {
echo 'Hello World'
echo "${VERSION}"
echo "${env.VERSION}"
echo "${params.VERSION}"
sh "ls -l"
}
}
}
}
  • 构建

image-20230322064748264

image-20230322064808122

TS:解决Jenkins构建时间显示不正确的问题-2022.5.14(已解决)

image-20220514104955168

1、问题现象

jenkins构建时间显示有问题

image-20220514104602386

2、解决办法

解决办法:

点击管理jenkins--批命令处理--输入 :

System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')

image-20220514104652691

image-20220514104708104

3、验证

重新构建,时间显示正确

image-20220514104734730

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码 x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号 《云原生架构师实战》

image-20230107215126971

🍀 语雀

https://www.yuque.com/xyy-onlyone

image-20230306221144511

🍀 csdn https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎 https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!

image-20230325152951779