4、jenkins-faq
jenkins-faq
Workflow & Airflow
1、jenskins属于workflow。(但基本工程软件领域,jenbkins已经足够了)
2、Airflow:适用于机器学习领域,pythn写的,可支持几百个或上千个阶段。
jenkins里报错排查方法
- 错误代码
- 正确代码(这里是没逗号的。)
- 看这里就行
jenkins使用公共账号去拉代码
jar包命名规范
JsonPath语法文档
https://github.com/json-path/JsonPath
插件文档学习方法
注意:插件文档:https://plugins.jenkins.io/generic-webhook-trigger/
方法:批量修改Jenkins作业参数的方法
打印调试信息到日志中
触发条件过滤:仅满足条件才能触发此作业
demo
安装stage view插件
ts:节点 is offline报错
出现卡顿情况:
1.节点不在线
2.可能标签不对
问题:静态节点/动态节点
- 问题现象
回答:
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的这个页面你可以理解为前端的表单,提交表单,然后后台去处理。
jenkins这里按个字母就能够找到
如何获取jenkins的构建日志
1、通过Cosnsole Output
获取
http://172.29.9.101:8080/job/pipeline-demo/16/consoleText
2、也可以通过服务器上去拿它的日志
3、也可以通过blueocean的api去拿
自定义agent通信端口
==💘 实践:自定义agent通信端口-2023.3.21(测试成功)==
⚠️ 注意:这里默认使用50000端口即可!尽量使用指定端口,如果使用随机端口的话,后续区域网络申请放行网络权限时,不好做!
配置地方如下(保持默认即可):系统管理
-安全/全局安全设置
:
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 内容
-
如果直接修改agent这里的
config.xml
内容的话,那么也是可以的,但是要记得reload一下,不然不会生效 -
web界面查看当前配置的数值是5
- 我们来直接修改下这个节点的配置文件
[root@Devops6 build01]#vim /data/devops6/jenkins_home/nodes/build01/config.xml
将
<numExecutors>5</numExecutors>
改成
<numExecutors>6</numExecutors>
- 配置完,我们刷新下浏览器,测试依然为5个触发器
- 此时,我们reload一下jenkins,再次观察下效果
可以看到,这里的触发器数量变成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呢?
这里输入kill就好:
点击Retry using POST
:
可以看到:job被取消了
Q:为什么关闭默认的checkout, 默认的checkout有什么问题吗
默认的checkout不会判断项目,只根据git地址下载。建议还是skip它。
Q:老师,jenkins的In-process Script Approval是干嘛用的。每次我执行都让我确认
这个是jenkins的安全限制,防止一些高危的代码执行。但是后台可以审批通过后就可以执行了。
(这个自己还没遇见过哦……)