为什么我的jenkins代理记录了一个致命错误,但仍保持连接-非法字节序列错误

hfsqlsce  于 9个月前  发布在  Jenkins
关注(0)|答案(1)|浏览(119)

我正在通过systemd运行jenkins代理。下面是单元文件:

[Unit]
Description=Jenkins Agent

[Service]
User=myuser
WorkingDirectory=/home/myuser/jenkins
ExecStart=/bin/bash /home/myuser/jenkins/start-jenkins-agent.sh
Restart=always

[Install]
WantedBy=multi-user.target

字符串
首先使用sudo systemctl enable jenkins-agent.service,然后使用sudo systemctl start jenkins-agent.service。下面是start-jenkins-agent.sh脚本:

cd /home/myuser/jenkins
# secret-file must be present in this folder and contain the secret key
# Just in case we would have upgraded the controller, we need to make sure that the agent is using the latest version of the agent.jar
curl -sO https://myinfra.mysite.io/jenkins/jnlpJars/agent.jar
java -jar agent.jar -jnlpUrl https://myinfra.mysite.io/jenkins/manage/computer/myServer2/jenkins-agent.jnlp -secret @secret-file -workDir /home/myuser/jenkins
exit 0


secret-file存在,我按照Jenkins服务器的指示通过echo 'secret_here' > secret-file生成了它。
以前这是在一个screen会话中运行的,除了启动日志之外没有记录太多,然后就没有了。这工作得很好。但是,自从移动到systemd之后,我注意到一些奇怪的日志。
首先,journalctl -u jenkins-agent显示的日志与我进行screen会话时的日志相同,并且没有错误。此外,我检查了Jenkins服务器上的代理连接状态,它始终处于连接状态,并且运行构建时没有任何问题。
然而,当我运行journalctl -f时,我注意到更多来自jenkins和java的日志。这大约每20-30秒循环一次:

systemd[739]: jenkins-agent.service: Main process exited, code=exited, status=1/FAILURE
systemd[739]: jenkins-agent.service: Failed with result 'exit-code'.
systemd[739]: jenkins-agent.service: Scheduled restart job, restart counter is at 1618834.
systemd[739]: Stopped Jenkins Agent for myinfra.
systemd[739]: Started Jenkins Agent for myinfra.
java[994857]: Dec 12, 2023 9:11:07 AM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
java[994857]: INFO: Using /home/myuser/jenkins/remoting as a remoting work directory
java[994857]: Dec 12, 2023 9:11:07 AM org.jenkinsci.remoting.engine.WorkDirManager setupLogging
java[994857]: INFO: Both error and output logs will be printed to /home/myuser/jenkins/remoting
java[994857]: [Fatal Error] :1:1: Invalid byte 1 of 1-byte UTF-8 sequence.
java[994857]: Exception in thread "main" org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Invalid byte 1 of 1-byte UTF-8 sequence.
java[994857]:         at java.xml/com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:262)
java[994857]:         at java.xml/com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
java[994857]:         at java.xml/javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:122)
java[994857]:         at hudson.remoting.Launcher.loadDom(Launcher.java:604)
java[994857]:         at hudson.remoting.Launcher.parseJnlpArguments(Launcher.java:546)
java[994857]:         at hudson.remoting.Launcher.run(Launcher.java:346)
java[994857]:         at hudson.remoting.Launcher.main(Launcher.java:297)
java[994857]: Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.
java[994857]:         at java.xml/com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:702)
java[994857]:         at java.xml/com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:568)
java[994857]:         at java.xml/com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1699)
java[994857]:         at java.xml/com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1565)
java[994857]:         at java.xml/com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1603)
java[994857]:         at java.xml/com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:158)
java[994857]:         at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:860)
java[994857]:         at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824)
java[994857]:         at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
java[994857]:         at java.xml/com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:246)
java[994857]:         ... 6 more
systemd[739]: jenkins-agent.service: Main process exited, code=exited, status=1/FAILURE
systemd[739]: jenkins-agent.service: Failed with result 'exit-code'.


我找不到任何关于非utf8文件,我不知道它试图解析和失败的文件。
下面是服务器上的Java版本:

java -version
openjdk version "11.0.21" 2023-10-17
OpenJDK Runtime Environment (build 11.0.21+9-post-Ubuntu-0ubuntu120.04)
OpenJDK 64-Bit Server VM (build 11.0.21+9-post-Ubuntu-0ubuntu120.04, mixed mode, sharing)


我有三个问题:
1.为什么journalctl -u jenkins-agent的日志没有显示任何问题,但根据journalctl,我可以清楚地看到jenkins-agent.service在摆动?
1.除了日志垃圾邮件之外,这真的是一个问题吗?
1.如何解决Invalid byte 1 of 1-byte UTF-8 sequence.的问题?

34gzjxbg

34gzjxbg1#

您可以尝试在start-jenkins-agent.sh脚本中启用verbose logging,这可能会提供有关该问题的更多信息。

cd /home/myuser/jenkins
curl -sO https://myinfra.mysite.io/jenkins/jnlpJars/agent.jar

# Enable verbose logging
JAVA_OPTS="-Djava.util.logging.config.file=/home/myuser/jenkins/logging.properties"

java $JAVA_OPTS -jar agent.jar -jnlpUrl https://myinfra.mysite.io/jenkins/manage/computer/myServer2/jenkins-agent.jnlp -secret @secret-file -workDir /home/myuser/jenkins
exit 0

字符串
您需要在指定的目录中创建一个logging.properties文件,并设置相应的日志记录级别。
还要检查JNLP文件的内容(有效且格式正确)和secret-file是否存在任何异常或非UTF-8字符。
请确定secret-file是以UTF-8编码储存。您可以使用iconv或类似的工具来检查并转换档案编码(如果需要)。
注意:日志输出(journalctl -u vs journalctl)的差异可能是由于systemd处理和重定向输出的方式造成的。

  • journalctl -u jenkins-agent可能只显示标准输出或过滤视图,
  • journalctl -f则提供所有系统日志(包括错误和系统消息)的实时、未过滤视图。

根据您的意见,我相信我们可以排除secret-file和Jenkins代理基本设置的问题。当您故意使用不正确的密码时,您会看到特定的错误,这一事实证实了该密码正在被正确地读取和使用。
由于您已经确认JNLP文件在本地下载时是UTF-8编码的,因此有必要检查在服务器上下载该文件时是否也是如此。
直接在服务器上从start-jenkins-agent.sh脚本运行curl命令,并检查下载的JNLP文件。

  • 使用file命令检查编码:file -i jenkins-agent.jnlp
  • 使用文本编辑器或cat命令直观地检查文件是否存在任何异常。

错误cannot load log handler "java.util.logging.FileHandler"表明日志记录配置有问题。可能是记录器试图写入文件但没有权限,或者是指定的路径不正确。

  • 请确保日志文件的目录存在,并且运行Jenkins代理的用户可以写入该目录。
  • 请考虑在logging.properties文件中使用绝对路径作为文件处理程序。

此问题可能受运行Jenkins代理的系统环境的影响,尤其是因为它以前在screen会话中运行时没有问题。请检查screen会话和systemd服务上下文之间可能不同的环境变量。特别是,查找与Java或字符编码相关的变量,如JAVA_OPTSLANGLC_*的值。该值为
作为诊断步骤,请尝试使用start-jenkins-agent.sh脚本中的相同命令手动运行Jenkins代理。这可能会显示与systemd环境相关的问题。如果手动启动时成功运行,请比较手动运行与systemd服务之间的环境变量和系统上下文。
基于Joao Vitorino所提及的“Jenkins 0 How to fix: Invalid byte 2 of 2-byte UTF-8 sequence?“:
确保秘密文件正确编码为UTF-8,并重新生成它:echo {secret} > secret-file,用从Jenkins控制器获得的实际秘密密钥替换{secret}
请确保代理下载的JNLP文件正确且完整,并检查JNLP文件的编码以确保其为UTF-8。
此外,请检查JNLP文件是否存在任何格式问题或可能导致语法分析错误的意外内容。请使用XML验证器工具检查JNLP文件的格式是否正确。

相关问题