跳到主要内容

4、jenkins-faq

jenkins-faq

Workflow & Airflow

1、jenskins属于workflow。(但基本工程软件领域,jenbkins已经足够了)
2、Airflow:适用于机器学习领域,pythn写的,可支持几百个或上千个阶段。

jenkins里报错排查方法

  • 错误代码

image-20230408103734739

image-20230408103841510

  • 正确代码(这里是没逗号的。)

image-20230408103924569


  • 看这里就行

image-20240619101633360

jenkins使用公共账号去拉代码

image-20230408161543474

jar包命名规范

image-20230408161513364

JsonPath语法文档

https://github.com/json-path/JsonPath

image-20220511085822372

插件文档学习方法

注意:插件文档https://plugins.jenkins.io/generic-webhook-trigger/

image-20220510231323203

image-20220510125012132

方法:批量修改Jenkins作业参数的方法

image-20220423210938197

打印调试信息到日志中

img

触发条件过滤:仅满足条件才能触发此作业

img

demo

img

安装stage view插件

image-20220420101212851

image-20220420141906084

ts:节点 is offline报错

出现卡顿情况:

1.节点不在线

2.可能标签不对

image-20220419212240413

image-20220419212329484

问题:静态节点/动态节点

  • 问题现象

image-20231022080721065

回答:

slave,我们有2种情况。我们再jenkins里面添加节点的时候,它有一个概念叫做固定节点(静态节点),也有一个叫动态节点

1、动态节点:可能你按照作业的数量,假如说来了10个作业,那我可能就会临时拉取10个agent来进行构建。那拉取的这个过程,肯定会耗时间的。因为它也是调k8s的api,去给你创建一个pod。

2、还有一种方法叫做静态pod:静态pod不会随时给你销毁掉,它是一直运行在k8s集群里面的,它一直在连着jenkins的master,来了认为它就去执行。因为部署在了k8s里面,它也具有这个水平扩展能力,动态的弹性也是有的。

所以你要是觉得动态那种方式慢的话,那建议及就改成静态这种方式。

静态的就是有些浪费资源,所以这个要平衡一下。

如果现在用的是jenkins那个插件的话,要考虑到构建时间、资源情况,那就得自己去搞一个这样的平台了,把这个逻辑去实现一下,因为jenkins那个插件还是有点慢的。

重点学习jenkins的思想

我们去学习一个工具,不仅是学它这个技术本身,而是去了解这个技术的设计思想。比如jenkins,这个工具已经有16 17年了,已经很稳定了,但也面临着一个被替换的局面。但实际jenkins背后的这些思想和这个设计,很值得我们去学习。你只要把jenkins后面的思想掌握了之后,后面你再用任何一款ci工具,或者我们市面上见的这些devops平台,你都可以一通百通。

我们通常一般可以用jenkins来完成任何你想自动化的任务。比如你想做一个自动构建打包,自动构建发布。 一句话,你想要做的jenkins都能去帮你实现! 只要能调接口实现的,jenkins都可以去包一层的!

未来: 后面,我们把jenkins做成一个引擎,外面包了一个devops平台,然后devops平台去调jenkins,这样就不用让用户再操作jenkins了。

devops: 我们是一个功能效能团队,提供的技术和支撑,什么时候来发,最终是交给开发,他们自己来发的。 现在有一种模式就是:自己开发的应用自己去维护。

学习jenkins后,需要学习一些语言的!

你会发现吗,用了jenkins之后,你要学习很多种语言! gooary,学完这个语言后,你后面写流水钱基本就没什么问题了! shell,python,go(k8s二开)

生产里一般使用2套jenkins

开发/测试:1套jenkins 生产环境:另一套jenkins (预发布环境和生产环境基本是一样的)

用jenkins做流水线时,基本上你想实现的都可以在jenkins里去运行!

并且,jenkins的这个页面你可以理解为前端的表单,提交表单,然后后台去处理。

image-20220604094211911

jenkins这里按个字母就能够找到

image-20220611143801303

如何获取jenkins的构建日志

1、通过Cosnsole Output获取

image-20230325122725586

http://172.29.9.101:8080/job/pipeline-demo/16/consoleText

image-20230325122738682

2、也可以通过服务器上去拿它的日志

image-20230325122952169

3、也可以通过blueocean的api去拿

自定义agent通信端口

==💘 实践:自定义agent通信端口-2023.3.21(测试成功)==

⚠️ 注意:这里默认使用50000端口即可!尽量使用指定端口,如果使用随机端口的话,后续区域网络申请放行网络权限时,不好做!

配置地方如下(保持默认即可):系统管理-安全/全局安全设置

image-20220414191124040

image-20220414191216232

Jenkins配置node方法

==💘 实践:Jenkins配置node方法-2023.3.21(测试成功)==

  • 测试版本:
jenkins/jenkins:2.346.3-2-lts-jdk11
  • 查看那jenkins agent节点配置内容
[root@Devops6 jenkins_home]#pwd
/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
[root@Devops6 jenkins_home]#cd nodes/
[root@Devops6 nodes]#ls
build01
[root@Devops6 nodes]#cd build01/
[root@Devops6 build01]#ls
config.xml
[root@Devops6 build01]#cat config.xml
<?xml version='1.1' encoding='UTF-8'?>
<slave>
<name>build01</name>
<description>my first node</description>
<remoteFS>/opt/jenkinsagent</remoteFS>
<numExecutors>5</numExecutors>
<mode>EXCLUSIVE</mode>
<retentionStrategy class="hudson.slaves.RetentionStrategy$Always"/>
<launcher class="hudson.slaves.JNLPLauncher">
<workDirSettings>
<disabled>false</disabled>
<internalDir>remoting</internalDir>
<failIfWorkDirIsMissing>false</failIfWorkDirIsMissing>
</workDirSettings>
<webSocket>false</webSocket>
</launcher>
<label>build maven golang</label>
<nodeProperties/>
</slave>
[root@Devops6 build01]#

注意:之前在agent web上配置的参数就是这里的config.xml 内容

image-20230320212432110

  • 如果直接修改agent这里的config.xml内容的话,那么也是可以的,但是要记得reload一下,不然不会生效

  • web界面查看当前配置的数值是5

image-20230320212716005

  • 我们来直接修改下这个节点的配置文件
[root@Devops6 build01]#vim /data/devops6/jenkins_home/nodes/build01/config.xml

<numExecutors>5</numExecutors>
改成
<numExecutors>6</numExecutors>

image-20230320212828941

  • 配置完,我们刷新下浏览器,测试依然为5个触发器

image-20230320213002216

image-20230320212937082

  • 此时,我们reload一下jenkins,再次观察下效果

image-20230320213054893

image-20230320213107809

image-20230320213116906

image-20230320213132183

可以看到,这里的触发器数量变成6个了,符合预期。

Jenkins高可用

通过HA proxy来创建多个jenkins,但最后会发现有一个问题:2个Jenkins读的数据是不能同时加载的。也就是说这个本地数据目录只支持一个Jenkins

后来我们做的方式,比如这个Jenkins挂了,那么另外一个jenbkins会reload一下这个数据,那么就可以拿到这个数据了。

但是,现在也没必要做Jenkins高可用了,直接把它放在k8s里,出了问题,它会直接给你启动。

高可用还有一种情况,就是我们把agent给忽略掉。你可以理解为Jenkins就没有agent。比如起一个任务,我们就给他起一个jebnkins master,然后去构建这个任务。这也是一种调度的实践方式吧。那这样子的话,jenkins也不需要去存储它的数据了。

还有一种,就是把jenkins所有配置放在自己的平台上面。把jenkins做成无状态的,它挂了也无所谓。重新启动就可以,只把它作为一个引擎,只让它去运行任务就可以了。所有的数据都在外面存储。

所以说,还是它存储这一块不太给力,如果它有数据库的话,可能会更好一些。

Jenkins更新最佳实践

最佳实践:

在企业里,我们会对Jenkins做版本管理。Jenkins有个configAsCode这个插件,它可以支持你通过一个类似于yaml文件,启动的时候,它会按照yaml文件里定义的内容去做一些配置。

我们没用这种方式,我们直接用的是一个dockerfile,直接建的那个repo,会定时的去打这样一个镜像。需要哪些插件,我就会写到这个插件目录,然后build一个镜像。直接去启这个镜像。

因为configAsCode这个插件有时候会出现一些问题,比如说加载的问题,还有一个就是你在启动的时候,它会应用这些配置,有可能会导致启动失败。

所以,我们干脆打成docker镜像,经过测试之后,直接用这个镜像去起master,去更新就可以了。

这也是关于jenkins更新的一个实践。

范例:如何取消被卡主的job呢?

image-20240616213632621

这里输入kill就好:

image-20240616213654709

点击Retry using POST:

image-20240616213724622

可以看到:job被取消了

image-20240616213823157

Q:为什么关闭默认的checkout, 默认的checkout有什么问题吗

默认的checkout不会判断项目,只根据git地址下载。建议还是skip它。

Q:老师,jenkins的In-process Script Approval是干嘛用的。每次我执行都让我确认

这个是jenkins的安全限制,防止一些高危的代码执行。但是后台可以审批通过后就可以执行了。

(这个自己还没遇见过哦……)