UU Blog

Jenkins Docker插件故障 JSONException

有同志容器的日志写到了自己容器里面。但是出问题后,一直写,导致磁盘写满。

以上是问题出现的前奏。

我接着清理下无用的容器,先快速释放部分空间出来。

1
docker system prune -a

紧接着我就出去帮忙别的东西了。

过一会被告知,Jenkins构建失败,而不止一个项目。每个项目出错如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
ERROR: Build step failed with exception
net.sf.json.JSONException: A JSONObject text must begin with '{' at character 0 of
at net.sf.json.util.JSONTokener.syntaxError(JSONTokener.java:499)
at net.sf.json.JSONObject._fromJSONTokener(JSONObject.java:919)
at net.sf.json.JSONObject._fromString(JSONObject.java:1145)
at net.sf.json.JSONObject.fromObject(JSONObject.java:162)
at net.sf.json.JSONObject.fromObject(JSONObject.java:132)
at org.jenkinsci.plugins.docker.commons.credentials.DockerRegistryToken$1.call(DockerRegistryToken.java:102)
at org.jenkinsci.plugins.docker.commons.credentials.DockerRegistryToken$1.call(DockerRegistryToken.java:82)
at hudson.remoting.LocalChannel.call(LocalChannel.java:45)
at org.jenkinsci.plugins.docker.commons.credentials.DockerRegistryToken.newKeyMaterialFactory(DockerRegistryToken.java:82)
at org.jenkinsci.plugins.docker.commons.credentials.DockerRegistryEndpoint.newKeyMaterialFactory(DockerRegistryEndpoint.java:219)
at org.jenkinsci.plugins.docker.commons.credentials.DockerRegistryEndpoint.newKeyMaterialFactory(DockerRegistryEndpoint.java:204)
at org.jenkinsci.plugins.docker.commons.credentials.DockerRegistryEndpoint.newKeyMaterialFactory(DockerRegistryEndpoint.java:196)
at com.cloudbees.dockerpublish.DockerBuilder$Perform.executeCmd(DockerBuilder.java:455)
at com.cloudbees.dockerpublish.DockerBuilder$Perform.executeCmd(DockerBuilder.java:431)
at com.cloudbees.dockerpublish.DockerBuilder$Perform.buildAndTag(DockerBuilder.java:373)
at com.cloudbees.dockerpublish.DockerBuilder$Perform.exec(DockerBuilder.java:311)
at com.cloudbees.dockerpublish.DockerBuilder$Perform.access$100(DockerBuilder.java:291)
at com.cloudbees.dockerpublish.DockerBuilder.perform(DockerBuilder.java:262)
at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:744)
at hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.build(MavenModuleSetBuild.java:945)
at hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.doRun(MavenModuleSetBuild.java:896)
at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:504)
at hudson.model.Run.execute(Run.java:1724)
at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:543)
at hudson.model.ResourceController.execute(ResourceController.java:97)
at hudson.model.Executor.run(Executor.java:429)
Build step 'Docker Build and Publish' marked build as failure

问题排查

看提示,是json数据问题,在想会不会是插件向docker请求数据的时候,没有返回正确的格式。联想到是我清理容器命令后出现的问题貌似,所以,重启了下docker。

问题依旧,感觉事态严重。百度谷姐都没有什么有用的信息。

后来想会不会是Jenkins什么东西被破坏了。迁移数据目录,快速重装了一下Jenkins,问题依旧。

然后新建一个项目 build,没问题,加上docker插件,又有问题了。

到此基本确定是docker插件的问题了。

接着测试了下,去掉认证,可能正常build。

加上仓库认证后,就出错了。

这里基本确定是仓库认证的问题了。

之前我们登录仓库认证,它会生成一个~/.docker/config.json或~/.dockercfg 来保存认证token。恰好是json格式。找到发现它是空的,有点符合出错的描述,不是一个有效的json格式。

删除之,构建,一气呵成。

料想是写满的时候,构建的时候,认证生成token写入到该文件的时候,能创建文件,但是写不了信息。而文件存在的时候,它又不会重新认证写入,直接读取导致出的问题。

解决方案

具体步骤可以按如下:

  1. 登录Jenkins查看信息 http://<Jenkins Address>/systemInfo

确定Jenkins HOME 的位置,我这里就是/var/lib/jenkins

  1. 删除仓库认证信息 rm -f /var/lib/jenkins/.dockercfg
给作者打一针鸡血