Jenkins JobDSL多分支管道作业更改脚本路径

28

我正在尝试在jobDSL中创建一个多分支PipelineJob,但是Jenkinsfile位于另一个位置而不是默认位置。 我已经查看了文档https://jenkinsci.github.io/job-dsl-plugin/#path/multibranchPipelineJob,但是我没有找到一种方法来实现这个目标。 通过查看手动创建的多分支PipelineJob的config.xml,可以看到scriptPath在<scm>部分中,但我无法找到设置此内容的DSL方法。

有人能提供如何解决这个问题的帮助吗? 谢谢


2
嗯,看起来这个功能在主分支上可以实现。 https://github.com/jenkinsci/job-dsl-plugin/blob/master/job-dsl-core/src/main/groovy/javaposse/jobdsl/dsl/jobs/MultibranchWorkflowJob.groovy 所以我可能得等待 DSL 的 1.67 版本发布了 :( - apr_1985
5个回答

35

现在,Job DSL 提供了一种方法来实现这一点:

multibranchPipelineJob('my-build') {
    factory {
        workflowBranchProjectFactory {
            scriptPath('path-to-Jenkinsfile')
        }
    }
}

根据发布说明,确认可与Job DSL 1.69一起使用,并自1.67开始提供。

编辑:使用Job DSL 1.77再次测试,仍按预期工作。如果您想查看此语法的文档,您需要查看安装了Multibranch Pipeline插件的Jenkins,路径如下:

https://your-jenkins-url/plugin/job-dsl/api-viewer/index.html#path/multibranchPipelineJob-factory-workflowBranchProjectFactory-scriptPath


1
这绝对应该被添加到Jenkins Job Dsl文档中。 - Matthias B
可以添加多个scriptPath吗? - NickBroon
无论是在1.77上还是DSL playground上,Strange都无法运行。我收到了以下错误信息:javaposse.jobdsl.dsl.DslScriptException: (script, line 3) No signature of method: javaposse.jobdsl.dsl.helpers.workflow.BranchProjectFactoryContext.workflowBranchProjectFactory() is applicable for argument types: (script$_run_closure1$_closure2$_closure3) values: [script$_run_closure1$_closure2$_closure3@33e4c96c] - Joerg S
似乎在https://job-dsl.herokuapp.com/上无法工作,会抛出javaposse.jobdsl.dsl.DslScriptException异常:(脚本,第3行) javaposse.jobdsl.dsl.helpers.workflow.BranchProjectFactoryContext.workflowBranchProjectFactory()方法的签名不正确,可用参数类型为:(script$_run_closure1$_closure2$_closure3),值为:[script$_run_closure1$_closure2$_closure3@ef99655]。 - Petra Kahn

8

由于这个问题仍然很受欢迎,在JCasC中可以这样做

jobs:
  - script: >
      folder('common');
      multibranchPipelineJob('common/jcasc-deploy') {
        factory {
          workflowBranchProjectFactory {
            scriptPath('Jenkinsfile')
          }
        }
        branchSources {
          branchSource {
            source {
              gitSCMSource {
                remote('git@gitlab.com:PROJECT/REPO.git')
                credentialsId('gitlab-key')
                id('jcasc-deploy')
              }
            }
          buildStrategies {
            buildAllBranches {
              strategies {
                skipInitialBuildOnFirstBranchIndexing()
              }
            }
          }
        }
      }
      triggers {
        periodicFolderTrigger {
          interval('1440')
        }
      }
      configure { node ->
        node / sources / data / 'jenkins.branch.BranchSource' / source / traits {
          'jenkins.plugins.git.traits.BranchDiscoveryTrait'()
        }
      }
    }

3
这很有用,但一开始对我没有起作用,直到我意识到这需要“basic-branch-build-strategies”插件才能使“buildStrategies”部分工作。 - Yeroc
@Yeroc谢谢,你的评论节省了很多工作时间。 - c4f4t0r

7

经过一番搜索,我找到了一个可行的方法:

configure {
    it / factory(class: 'org.jenkinsci.plugins.workflow.multibranch.WorkflowBranchProjectFactory') {
        owner(class: 'org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject', reference: '../..')
        scriptPath("jenkins/[where ever you want]/Jenkinsfile")
    }
}

这对我来说似乎有效。


1
这是适用于所有人的解决方案,其中被接受的答案不起作用,目前似乎适用于jobDSL 1.77。 - Joerg S
@JoergS 这个答案适用于任何版本的 Job DSL,但它使用了 Job DSL 支持更好的语法之前的一种较“原始”的语法。Job DSL 1.67 引入了一个更好的语法,它仍然适用于 1.77(我在一个新的 Jenkins 安装中测试了 Job DSL 1.77 确认)。 - nerdherd

3
设置有点隐蔽,但自动生成的DSL支持设置多分支任务的脚本路径:
multibranchPipelineJob('example') {
  factory {
    workflowMultiBranchProjectFactory {
      scriptPath('my-location/Jenkinsfile')
    }
  }
} 

虽然我能理解为什么它“应该”工作,但对我来说并没有 :-(。@daspilker 你测试过吗? - Steve-B

0

我们发现这种方法在 dsl playground 上运行良好,并且在使用 gradle JavaExec 任务以及插件时也同样有效。可以在 这里 找到相关信息。


    configure {

        it / factory(class: 'org.jenkinsci.plugins.workflow.multibranch.WorkflowBranchProjectFactory') {
            owner(class: 'org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject', reference: '../..')
            scriptPath("jenkinsfile")
        }
    }

我们的Gradle方法如下,让工程师可以在本地生成,然后我们使用Jenkins生成/存储构建。这使得与当前版本进行比较更加容易。
sourceSets {
    main {
        groovy {
            srcDirs = ['src']
        }
        resources {
            srcDirs = ['resources']
        }
    }
    test {
        groovy {
            srcDirs = ['test']
        }
        resources {
            srcDirs = ['resources']
        }
    }
    jobs {
        groovy {
            srcDirs 'jenkins-job-dsl'
            compileClasspath += main.compileClasspath
        }
    }
}

dependencies {
...
compile 'org.jenkins-ci.plugins:job-dsl-core:1.77'
}
...
/**
 * get current branch
 * @return uses vairable on jenkins and runs git command locally
 */
String getBranchName() {
    if (System.env.BRANCH_NAME) {
        // Jenkins
        if (System.env.BRANCH_NAME == 'master') {
            return ''
        } else {
            return '_' + System.env.BRANCH_NAME.toLowerCase().replaceAll("/", "_")
        }
    } else {
        return '_localDev'
    }
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接