[Jenkins] openEuler Embedded CI 报错及解决方案汇总
[Jenkins] openEuler Embedded CI的20次失败构建及10大问题总结
亲身测试用Jenkins做openEuler Embedded构建CI时踩过的坑。
目前构建失败了20次,但终于修正了许多问题,现在问题缩小到了ci.py本身。
构建问题的简要总结
序号 | 问题 | 此时未发现的问题 |
---|---|---|
#1 | Q1(unexpected char) | |
#2 | Q2(doesn’t have label) | Q1.1(\) |
#3 | Q3.1(Could not resolve host: gitee.com) | Q1.1(\) |
#4 | Q4(groovy.lang.MissingPropertyException) | Q1.1(\) |
#5 | Q4(groovy.lang.MissingPropertyException) | Q1.1(\) |
#6 | Q6(pipeline script注释报错) | Q1.1(\) |
#7 | Q1.5(unrecognized arguments) | Q1.1(\) |
#8 | Q1.2(expected str,not NoneType) | Q1.2( ) |
#9 | Q1.2(expected str,not NoneType) | Q1.2( ) |
#10 | Q1.2(expected str,not NoneType) | Q1.2( ) |
#11 | Q9(paramiko) | 127.0.0.1 |
#12 | Q7(和#13同时运行导致宕机) | |
#13 | Q7(和#12同时运行导致宕机) | 127.0.0.1, Q1.2( ) |
#14 | Q3.2(Could not resolve host: gitee.com) | 127.0.0.1, Q1.2( ) |
#15 | Q1.2(expected str,not NoneType) | 127.0.0.1, Q1.2( ) |
#16 | Q9(paramiko) | 127.0.0.1 |
#17 | Q8(root不能用于ci) | 127.0.0.1 |
#18 | Q9(paramiko) | 127.0.0.1 |
#19 | Q10(Value error: build project bas error) | |
#20 | Q10(Value error: build project bas error) |
其中#12
是在#11
的基础上误打误撞修改了"回放",这次本应是正确的,可惜因为错误设置日程表,宕机了,所以不知道正确,task本身的配置又没变,所以#14
又重复了错误,直到#19
才解决问题。现在的问题是ci.py文件中的Value error: build project bas error
,有待解决。
详细原因及解决方案
可能的问题如下:
问题1:unexpected char: '\
'
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 24: unexpected char: '\' @ line 24, column 51.
-e /usr1/build/output \
路径和最后的"\
"只隔了1个空格。
解决方法:反斜杠和前面的参数之间多打几个空格。如下:
sh """python3 main.py ci
-e /usr1/build/output \
-i "127.0.0.1" \
-u $USERNAME \
-w $PASSWORD \
-dm \
-o openeuler \
-p yocto-meta-openeuler
问题1.1:unrecognized arguments
在问题1出现后,我尝试在每行末尾添加2个'\
',下面是错误的(GPT出的馊主意)!应该只有1个'\
'!
sh """python3 main.py ci
-e /usr1/build/output \\
-i "127.0.0.1" \\
...
问题1.2:TypeError: expected str, bytes or os.PathLike object, not NoneType
File "/usr/lib64/python3.9/posixpath.py", line 76, in join
a = os.fspath(a)
TypeError: expected str, bytes or os.PathLike object, not NoneType
这个问题的报错不清楚,排查了半天!结果是因为我去掉了'\
'(应该有1个)!去掉是因为问题1出现后,我没想到是要加空格,感觉应该去掉"\
"或者改为"\\
"(因为python的三引号可以跨行,所以去掉它似乎可以,但实际上不行)!下面是错误的!
sh """python3 main.py ci
-e /usr1/build/output
-i "127.0.0.1"
-u $USERNAME
...
问题2:‘Jenkins’ doesn’t have label ‘ci_agt’
Still waiting to schedule task
‘Jenkins’ doesn’t have label ‘ci_agt’
首先检查Agent Templates和pipeline scripts两处的label名称是否一致,不一致则需修改。
如果是没有配置名称为ci_agt的从节点,则影响不大,提示之后仍然可以继续运行。因为检测到没有之后,Jenkins会自动创建一个新节点。(有待研究)
问题3:Could not resolve host: gitee.com
+ git clone https://gitee.com/openeuler/embedded-ci.git -v /home/jenkins/agent/embedded-ci --depth=1
Cloning into '/home/jenkins/agent/embedded-ci'...
fatal: unable to access 'https://gitee.com/openeuler/embedded-ci.git/': Could not resolve host: gitee.com
- Jenkins需要安装Gitee 插件。
- 如果安装了,则尝试
ping gitee.com
,如果可以ping通,vim /etc/hosts
看最后一行是否有180.76.198.77 gitee.com
,没有则添加。
问题4:groovy.lang.MissingPropertyException
Also: org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: e498480d-51b9-4db5-bb0e-af9e3c413e48
groovy.lang.MissingPropertyException: No such property: USERNAME for class: groovy.lang.Binding
at groovy.lang.Binding.getVariable(Binding.java:63)
需要安装groovy postbuild插件。
问题5:UnknownHostException: updates.jenkins.io
There were errors checking the update sites: UnknownHostException: updates.jenkins.io
参考:https://www.cnblogs.com/yunzimo/p/15003154.html
换源:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json
问题6:pipeline script 中的注释报错
+ python3 main.py ci -e /usr1/build/output ' ' $'//\345\241\253\345\206\231\344\275\240\346'
main.py ci: error: unrecognized arguments: //����������������
pipeline scripts 中的注释被识别了,去掉注释即可。
问题7:运行多个build导致服务器宕机
之前每次构建在2440min不等(不稳定),所以设置了日程,每2小时构建一次,不幸的是,某次构建超过了2小时(事实上前面是因为有各种问题才时间短...解决了各种问题后的构建已经至少需要34小时了,但这是后话,现在不知道需要这么久),导致同一时刻有2个构建在运行,第2天查看时服务器宕机了...
解决方法:在构建时长稳定之前避免使用日程表,或者将构建间隔设置久一点。
问题8:can not use oebuild in root
File "/home/jenkins/.local/lib/python3.9/site-packages/oebuild/app/main.py", line 330, in check_user
log.err("can not use oebuild in root")
NameError: name 'log' is not defined
openEuler Embedded CI只能以普通用户构建(credentials的用户名不能为root)。
问题9:paramiko Unable to connect to port 22 on 127.0.0.1
File "/usr/local/lib/python3.9/site-packages/paramiko/client.py", line 409, in connect
raise NoValidConnectionsError(errors)
paramiko.ssh_exception.NoValidConnectionsError: [Errno None] Unable to connect to port 22 on 127.0.0.1
原因:在pipeline script中的配置:
-i "127.0.0.1" \ //填写你想存储构建产物的机器的ip地址
这是错误的,不能为127.0.0.1(即使想构建到本机)!正确的写法是写本机IP地址!
注:为什么ssh user@127.0.0.1都能登录,这里却不能将构建IP填写为127.0.0.1?我是这样发现问题原因的:首先进入正在构建的docker:
[root@localhost ssh]# docker exec -it --user root 45ac /bin/bash
然后参照相关链接,用paramiko尝试ssh连接127.0.0.1:
[root@45acf119f96a agent]# python
>>> import paramiko
>>> ssh = paramiko.SSHClient()
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect("127.0.0.1", username="user", password="xxx")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.9/site-packages/paramiko/client.py", line 409, in connect
raise NoValidConnectionsError(errors)
paramiko.ssh_exception.NoValidConnectionsError: [Errno None] Unable to connect to port 22 on 127.0.0.1
>>> ssh.connect("<myIP>", username="root", password="xxx")
>>>
其中<myIP>
是我的局域网IP地址。由此可见,paramiko不支持ssh 127.0.0.1!
问题10:ValueError: build project bas error
Traceback (most recent call last):
File "/home/jenkins/agent/embedded-ci/main.py", line 25, in <module>
main()
File "/home/jenkins/agent/embedded-ci/main.py", line 22, in main
app.run(argv or sys.argv[1:])
File "/home/jenkins/agent/embedded-ci/app/app.py", line 90, in run
self.run_command(argv)
File "/home/jenkins/agent/embedded-ci/app/app.py", line 76, in run_command
cmd.run(subargs, unknow)
File "/home/jenkins/agent/embedded-ci/app/command.py", line 44, in run
self.do_run(args=args, unknow=unknow)
File "/home/jenkins/agent/embedded-ci/app/plugins/ci/ci.py", line 85, in do_run
self.exec(
File "/home/jenkins/agent/embedded-ci/app/plugins/ci/ci.py", line 256, in exec
raise ValueError("build project bas error")
ValueError: build project bas error
终于,我们来到了ci.py本身的问题,待解决...
注意事项:Jenkins查看初始密码:cat /var/lib/jenkins/secrets/initialAdminPassword
注:已经出现过数次重新登录时密码错误的情况...需要重置
Jenkins之忘记管理员账户密码重置方法(参考链接)
关闭安全设置
vim /var/lib/jenkins/config.xml
删除下面的内容:
<useSecurity>true</useSecurity>
<authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy">
<denyAnonymousReadAccess>true</denyAnonymousReadAccess>
</authorizationStrategy>
<securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
<disableSignup>true</disableSignup>
<enableCaptcha>false</enableCaptcha>
</securityRealm>
重启Jenkins:
systemctl restart jenkins
##### 设置密码
在Dashboard - Manage Jenkins - Security - 安全域,选择"Jenkins' own user database"
在Dashboard - Manage Jenkins - Users - admin - 设置 - Password,设置密码。
设置授权策略
在Dashboard - Manage Jenkins - Security - 授权策略,选择"登陆用户可做任何事",以防匿名用户操作。
提示:可安装Locale插件为Jenkins设置中文,安装插件后,在:Manage Jenkins - System Configuration - Configure System - Locale的框中填zh_CN
,勾选下面的选项,保存即可。
pipeline script 示例
带注释的pipeline script(主要是看注释、了解作用,不建议直接使用):
pipeline {
agent { node "dockercloud" } //这里的dockercloud即之前在 Docker Agent templates 中配置的Labels值
environment {
PATH = "/home/jenkins/.local/bin:${env.PATH}"
}
stages {
stage('clone openeuler-ci') {
steps {
dir('/home/jenkins/agent'){
script {
if(fileExists('embedded-ci') == false) {
sh 'git clone https://gitee.com/openeuler/embedded-ci.git -v /home/jenkins/agent/embedded-ci --depth=1'
}
}
}
}
}
stage('run ci') {
steps {
dir('/home/jenkins/agent/embedded-ci'){
script{
withCredentials([usernamePassword(credentialsId: 'test_credentials', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
sh """python3 main.py ci \
-e /path \ //填写你想存储构建产物的路径
-i "101.1.10.101" \ //填写你想存储构建产物的机器的ip地址
-u $USERNAME \ //登录构建产物存储的机器时,使用的用户名
-w $PASSWORD \ //登录构建产物存储的机器时,使用的密码
-dm \ //删除构建的tmp目录,该选项,默认为真,因为tmp目录使用较大空间,所以默认会删除tmp目录
-o openeuler \ //此参数当前无用,保留即可
-p yocto-meta-openeuler //此参数当前无用,保留即可
"""
}
}
}
}
}
}
}
经测试可用的pipeline script(去掉了注释, 增加了反斜杠前的空格):
pipeline {
agent { node "ci_agt" }
environment {
PATH = "/home/jenkins/.local/bin:${env.PATH}"
}
stages {
stage('clone openeuler-ci') {
steps {
dir('/home/jenkins/agent'){
script {
if(fileExists('embedded-ci') == false) {
sh 'git clone https://gitee.com/openeuler/embedded-ci.git -v /home/jenkins/agent/embedded-ci --depth=1'
}
}
}
}
}
stage('run ci') {
steps {
dir('/home/jenkins/agent/embedded-ci'){
script{
withCredentials([usernamePassword(credentialsId: 'test_credentials', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
sh """python3 main.py ci
-e /usr1/build/output \
-i "127.0.0.1" \
-u $USERNAME \
-w $PASSWORD \
-dm \
-o openeuler \
-p yocto-meta-openeuler
"""
}
}
}
}
}
}
}
题外话
通过VSCode写博文发现了2个tip,1个是反斜杠没法直接打出来,需要以代码块格式\
,1个是~两端波浪号~的效果是文字下标。
另外,markdown竟然支持$LATEX$,很意外,以后记笔记更顺畅了(博客园不支持,不过也在情理之中)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)