问题
I have some jobDsl that looks like this:
multibranchPipelineJob('foo/bar') {
branchSources {
git {
remote('https://github.com/jenkinsci/job-dsl-plugin.git')
credentialsId('github-ci')
includes('JENKINS-*')
}
}
}
which generates the following xml (snippet):
<!-- 1. foo/bar -->
<org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject>
<sources class='jenkins.branch.MultiBranchProject$BranchSourceList'>
<data>
<jenkins.branch.BranchSource>
<source class='jenkins.plugins.git.GitSCMSource'>
<id>d45cd641-7223-4b58-9de5-837c3fe584a7</id>
<remote>https://github.com/jenkinsci/job-dsl-plugin.git</remote>
<credentialsId>github-ci</credentialsId>
<includes>JENKINS-*</includes>
<excludes></excludes>
<ignoreOnPushNotifications>false</ignoreOnPushNotifications>
</source>
<strategy class='jenkins.branch.DefaultBranchPropertyStrategy'>
<properties class='empty-list'></properties>
</strategy>
</jenkins.branch.BranchSource>
</data>
<owner class='org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject' reference='../..'></owner>
</sources>
What I would like to do is append a node (call it traits) to the jenkins.branch.BranchSource node created by the jobDsl multibranchJob api via the configure block:
multibranchPipelineJob('foo/bar') {
branchSources {
git {
remote('https://github.com/jenkinsci/job-dsl-plugin.git')
credentialsId('github-ci')
includes('JENKINS-*')
}
configure {
def first = it / 'sources'(class: 'jenkins.branch.MultiBranchProject$BranchSourceList') / 'data' / 'jenkins.branch.BranchSource'
first << traits {
foo('bar')
}
}
}
}
However, according to https://job-dsl.herokuapp.com/, the above dsl would create the xml as such:
<sources class='jenkins.branch.MultiBranchProject$BranchSourceList'>
<data>
<jenkins.branch.BranchSource>
<traits>
<foo>bar</foo>
</traits>
</jenkins.branch.BranchSource>
<jenkins.branch.BranchSource>
<source class='jenkins.plugins.git.GitSCMSource'>
<id>7fd47865-fffa-4f8f-98f1-ac6de65249f7</id>
<remote>https://github.com/jenkinsci/job-dsl-plugin.git</remote>
<credentialsId>github-ci</credentialsId>
<includes>JENKINS-*</includes>
<excludes></excludes>
<ignoreOnPushNotifications>false</ignoreOnPushNotifications>
</source>
<strategy class='jenkins.branch.DefaultBranchPropertyStrategy'>
<properties class='empty-list'></properties>
</strategy>
</jenkins.branch.BranchSource>
</data>
</sources>
Basically, is there any way to append to the BranchSource node that is created from the branchSources call?
回答1:
The problem is that there is no configure method within the branchSources context. So the configure method from an outer context will be called. In this case from the multibranchPipelineJob context. Since the branchSources method has not completed by the time the configure method is called, no branch source node have been generated and thus the configure block will create a new node.
Try this instead:
multibranchPipelineJob('foo/bar') {
branchSources {
git {
remote('https://github.com/jenkinsci/job-dsl-plugin.git')
credentialsId('github-ci')
includes('JENKINS-*')
}
}
configure {
def source = it / 'sources'(class: 'jenkins.branch.MultiBranchProject$BranchSourceList') / 'data' / 'jenkins.branch.BranchSource'
source << traits {
foo('bar')
}
}
}
来源:https://stackoverflow.com/questions/53825744/how-to-append-to-node-created-by-jenkins-job-dsl-in-same-configure-block