首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何附加到Jenkins job dsl在同一配置块中创建的节点?

如何附加到Jenkins job dsl在同一配置块中创建的节点?
EN

Stack Overflow用户
提问于 2018-12-18 10:47:55
回答 2查看 464关注 0票数 2

我有一些看起来像这样的jobDsl:

代码语言:javascript
复制
multibranchPipelineJob('foo/bar') {
        branchSources {
        git {
            remote('https://github.com/jenkinsci/job-dsl-plugin.git')
            credentialsId('github-ci')
            includes('JENKINS-*')
        }
    }
}

它将生成以下xml (代码片段):

代码语言:javascript
复制
<!-- 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>

我想要做的是通过配置块将一个节点(称为traits)附加到由jobDsl multibranchJob api创建的jenkins.branch.BranchSource节点:

代码语言:javascript
复制
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')
                }
            }
    }
}

然而,根据https://job-dsl.herokuapp.com/的说法,上面的dsl会这样创建xml:

代码语言:javascript
复制
<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>

基本上,有什么方法可以附加到通过branchSources调用创建的BranchSource节点吗?

EN

回答 2

Stack Overflow用户

发布于 2021-03-17 20:11:43

参加聚会有点晚了,但也有同样的问题,这让我抓狂……看起来将配置块移到管道定义的末尾会有所帮助--也可以使用正确的XPath工具。

Fred的博客文章让我找到了正确的方向。去看看吧:https://ftclausen.github.io/infra/jenkins/jenkins-jobdsl-git-traits/

管道定义

代码语言:javascript
复制
multibranchPipelineJob('foo/bar') {
        branchSources {
        git {
            id("foobar")
            remote('https://github.com/jenkinsci/job-dsl-plugin.git')
            credentialsId('github-ci')
            includes('JENKINS-*')
        } 
    }
    configure {
        def traits = it / sources / data / 'jenkins.branch.BranchSource' / source / traits {
            traits << 'jenkins.plugins.git.traits.LocalBranchTrait'{}
        }
   }
}

产生的config.xml

代码语言:javascript
复制
<sources class='jenkins.branch.MultiBranchProject$BranchSourceList'>
        <data>
            <jenkins.branch.BranchSource>
                <source class='jenkins.plugins.git.GitSCMSource'>
                    <id>foobar</id>
                    <remote>https://github.com/jenkinsci/job-dsl-plugin.git</remote>
                    <credentialsId>github-ci</credentialsId>
                    <includes>JENKINS-*</includes>
                    <excludes></excludes>
                    <ignoreOnPushNotifications>false</ignoreOnPushNotifications>
                    <traits>
                        <jenkins.plugins.git.traits.LocalBranchTrait></jenkins.plugins.git.traits.LocalBranchTrait>
                    </traits>
                </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>
票数 1
EN

Stack Overflow用户

发布于 2019-01-05 14:30:12

问题是在branchSources上下文中没有configure方法。因此,将调用外部上下文中的configure方法。在本例中,来自multibranchPipelineJob上下文。由于在调用configure方法时branchSources方法尚未完成,因此还没有生成分支源节点,因此配置块将创建一个新节点。

试着这样做:

代码语言:javascript
复制
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')
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53825744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档