[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
  1. Jenkins需要安装Gitee 插件。
  2. 如果安装了,则尝试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$,很意外,以后记笔记更顺畅了(博客园不支持,不过也在情理之中)。

posted @   Digitzh  阅读(928)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示