Jenkins API抛出IOException:无法持久化config.xml

Don*_*ert 12 jenkins jenkins-api

我正在尝试使用带有curl的Jenkins API在Ubuntu 17.10上创建一个新工作.我正在关注这个帖子的例子.创造面包屑效果很好.但是,创建作业的调用失败,并带有根本原因的堆栈跟踪:

[编辑添加堆栈跟踪的其余部分]

org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Premature end of file.
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1239)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:668)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:737)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:351)
    at jenkins.util.xml.XMLUtils._transform(XMLUtils.java:212)
    at jenkins.util.xml.XMLUtils.safeTransform(XMLUtils.java:84)
    at hudson.model.ItemGroupMixIn.createProjectFromXML(ItemGroupMixIn.java:272)
    at hudson.model.ItemGroupMixIn.createTopLevelItem(ItemGroupMixIn.java:189)
    at jenkins.model.Jenkins.doCreateItem(Jenkins.java:3816)
    at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627)
    at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:343)
    at org.kohsuke.stapler.interceptor.RequirePOST$Processor.invoke(RequirePOST.java:77)
    at org.kohsuke.stapler.PreInvokeInterceptedFunction.invoke(PreInvokeInterceptedFunction.java:26)
    at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:184)
    at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:117)
    at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:129)
    at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:715)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:845)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:649)
    at org.kohsuke.stapler.Stapler.service(Stapler.java:238)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:841)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650)
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:154)
    at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:157)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
    at jenkins.security.ApiCrumbExclusion.process(ApiCrumbExclusion.java:48)
    at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:73)
    ...
Caused: java.io.IOException: Failed to persist config.xml
    at hudson.model.ItemGroupMixIn.createProjectFromXML(ItemGroupMixIn.java:292)
    at hudson.model.ItemGroupMixIn.createTopLevelItem(ItemGroupMixIn.java:189)
    at jenkins.model.Jenkins.doCreateItem(Jenkins.java:3816)
    at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627)
    at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:343)
    at org.kohsuke.stapler.interceptor.RequirePOST$Processor.invoke(RequirePOST.java:77)
    at org.kohsuke.stapler.PreInvokeInterceptedFunction.invoke(PreInvokeInterceptedFunction.java:26)
    at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:184)
    at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:117)
    at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:129)
    at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:715)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:845)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:649)
    at org.kohsuke.stapler.Stapler.service(Stapler.java:238)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:841)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650)
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:154)
    at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:157)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
    at jenkins.security.ApiCrumbExclusion.process(ApiCrumbExclusion.java:48)
    at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:73)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)
    at hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:51)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at jenkins.security.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:117)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    ...
Run Code Online (Sandbox Code Playgroud)

脚本文件是:

CRUMB=$(curl -s 'http://<redacted>@localhost:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')

echo ${CRUMB}

curl -X POST -H "$CRUMB" -H "content-type:application/xml" "http://<redacted>@localhost:8080/createItem?name=NewJob2"
Run Code Online (Sandbox Code Playgroud)

[编辑]

也试过这个变种,试图传递一个基本的config.xml文件:

curl -X POST -H "$CRUMB" -H "content-type:application/xml" --data "@config.xml" "http://helo478:5ccf2750debe105962b1bf3a8483cfd8@localhost:8080/createItem?name=Test" --trace-ascii /dev/stdout
Run Code Online (Sandbox Code Playgroud)

Jon*_*n S 3

只是用我作为评论指出的内容发布答案。看起来整个堆栈跟踪丢失了,读取的第一行caused...表明异常还有更多内容。

此外,我查看了第一个堆栈跟踪帧的源代码, hudson.model.ItemGroupMixIn.createProjectFromXML第 292 行,从那里很明显,上传的 XML 文件有问题,显然根本没有上传。

来自 Jenkins API 文档,可在以下位置获取<jenkins instance root>/api/

要创建新作业,请将 config.xml 发布到此 URL,并使用查询参数 name=JOBNAME。您需要发送 Content-Type: application/xml 标头。如果创建成功,您将获得 200 状态代码,如果失败,您将获得 4xx/5xx 代码。config.xml 是 Jenkins 用于在文件系统中存储项目的格式,因此您可以在 Jenkins 主目录中查看它们的示例,或者通过从 /job/JOBNAME/config.xml 检索现有作业的 XML 配置来查看它们的示例。