Jenkins API throws IOException: Failed to persist config.xml Jenkins API throws IOException: Failed to persist config.xml jenkins jenkins

Jenkins API throws IOException: Failed to persist config.xml


Just posting an answer with what I noted as a comment. Looked like the entire stack trace was missing, the first line read caused... which indicates that there is more to the exception.

Additionally, I had a look at the source for the first stack trace frame, hudson.model.ItemGroupMixIn.createProjectFromXML line 292, from there it pretty obvious that there is something wrong with the uploaded XML file, which apparently weren't uploaded at all.

From the Jenkins API documentation, available at <jenkins instance root>/api/:

To create a new job, post config.xml to this URL with query parameter name=JOBNAME. You need to send a Content-Type: application/xml header. You will get a 200 status code if the creation is successful, or 4xx/5xx code if it fails. config.xml is the format Jenkins uses to store the project in the file system, so you can see examples of them in the Jenkins home directory, or by retrieving the XML configuration of existing jobs from /job/JOBNAME/config.xml.


The API requires that a config.xml file be passed in the post data. I had assumed that, like the GUI, it would create a basic one, automatically. This is not the case

curl -X POST -H "$CRUMB" -H "content-type:application/xml" --data "@/home/helo478/Documents/config.xml" "http://helo478:5ccf2750debe105962b1bf3a8483cfd8@localhost:8080/createItem?name=Test5" --trace-ascii /dev/stdout

config.xml:

<?xml version='1.1' encoding='UTF-8'?><org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject plugin="workflow-multibranch@2.17">  <actions/>  <description></description>  <displayName>Test5</displayName>  <properties>    <org.jenkinsci.plugins.pipeline.modeldefinition.config.FolderConfig plugin="pipeline-model-definition@1.2.7">      <dockerLabel></dockerLabel>      <registry plugin="docker-commons@1.11"/>    </org.jenkinsci.plugins.pipeline.modeldefinition.config.FolderConfig>  </properties>  <folderViews class="jenkins.branch.MultiBranchProjectViewHolder" plugin="branch-api@2.0.18">    <owner class="org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject" reference="../.."/>  </folderViews>  <healthMetrics>    <com.cloudbees.hudson.plugins.folder.health.WorstChildHealthMetric plugin="cloudbees-folder@6.4">      <nonRecursive>false</nonRecursive>    </com.cloudbees.hudson.plugins.folder.health.WorstChildHealthMetric>  </healthMetrics>  <icon class="jenkins.branch.MetadataActionFolderIcon" plugin="branch-api@2.0.18">    <owner class="org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject" reference="../.."/>  </icon>  <orphanedItemStrategy class="com.cloudbees.hudson.plugins.folder.computed.DefaultOrphanedItemStrategy" plugin="cloudbees-folder@6.4">    <pruneDeadBranches>true</pruneDeadBranches>    <daysToKeep>-1</daysToKeep>    <numToKeep>-1</numToKeep>  </orphanedItemStrategy>  <triggers/>  <disabled>false</disabled>  <sources class="jenkins.branch.MultiBranchProject$BranchSourceList" plugin="branch-api@2.0.18">    <data>      <jenkins.branch.BranchSource>        <source class="org.jenkinsci.plugins.github_branch_source.GitHubSCMSource" plugin="github-branch-source@2.3.3">          <id>e514c038-dfd3-4748-99f1-8eb807276814</id>          <credentialsId>54956458-e73d-45db-8ed1-04cb42a3612e</credentialsId>          <repoOwner>helo478</repoOwner>          <repository>agartha-web</repository>          <traits>            <org.jenkinsci.plugins.github__branch__source.BranchDiscoveryTrait>              <strategyId>1</strategyId>            </org.jenkinsci.plugins.github__branch__source.BranchDiscoveryTrait>            <org.jenkinsci.plugins.github__branch__source.OriginPullRequestDiscoveryTrait>              <strategyId>1</strategyId>            </org.jenkinsci.plugins.github__branch__source.OriginPullRequestDiscoveryTrait>            <org.jenkinsci.plugins.github__branch__source.ForkPullRequestDiscoveryTrait>              <strategyId>1</strategyId>              <trust class="org.jenkinsci.plugins.github_branch_source.ForkPullRequestDiscoveryTrait$TrustPermission"/>            </org.jenkinsci.plugins.github__branch__source.ForkPullRequestDiscoveryTrait>          </traits>        </source>        <strategy class="jenkins.branch.DefaultBranchPropertyStrategy">          <properties class="empty-list"/>        </strategy>      </jenkins.branch.BranchSource>    </data>    <owner class="org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject" reference="../.."/>  </sources>  <factory class="org.jenkinsci.plugins.workflow.multibranch.WorkflowBranchProjectFactory">    <owner class="org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject" reference="../.."/>    <scriptPath>Jenkinsfile</scriptPath>  </factory></org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject>