Miguelme
Miguelme

Reputation: 629

jenkins job dsl plugin issue where none of the internal jobs have access to the external jobs

I am using jenkins jobDsl as follows:

#!groovy


node('master') {
  stage('Prepare') {
    deleteDir()
    checkout scm
  }


  stage('Provision Jobs') {
    jobDsl(targets: ['jenkins/commons.groovy', 'folderA/jenkins/jobA.groovy'].join('\n'),
    removedJobAction: 'DELETE',
    removedViewAction: 'DELETE',
    sandbox: false)
  }
}

Where I want to use from the jobA.groovy a function that is defined on commons.groovy.

Currently, the jobA.groovy doesn't have access to the function defined on commons.groovy, how can I allow this behavior?

Attached:

test_job("param1", "param2")
def test_job(String team, String submodule) {
  pipelineJob("${team}/${submodule}/test_job") {
    displayName("Test Job")
    description("This is a Continuous Integration job for testing")

    properties {
      githubProjectUrl("githubUrl")
    }

    definition {
      cpsScm {
        scm {
          git {
            remote {
              url('githubUrl')
              credentials('credentials')
              refspec('+refs/pull/*:refs/remotes/origin/pr/*')
            }
            branch('${sha1}')
            scriptPath("scriptPath")
          }
        }
      }
    }
  }
}

The idea would be to be able to call this method test_job("param1", "param2") from jobA.groovy with no issues and I am currently getting:

ERROR: (jobA.groovy, line 9) No signature of method: test_job() is applicable for argument types: (java.lang.String, java.lang.String)

Upvotes: 2

Views: 591

Answers (1)

fredericrous
fredericrous

Reputation: 3038

JobDSL creates the jobs. Then at runtime you want your job to call your function. The function must be imported through a shared library.

Create a shared lib

here is a sample: https://github.com/sap-archive/jenkins-pipelayer the most important piece there is that you need to create a vars/ folder that will define the functions you can call from your pipelines. host the lib on its own repo or orphan branch

Import a shared lib

To import a lib library in Jenkins. From Manage page, go to Configure System Under section Global Pipeline Libraries, add a new library with name of your choice, ie name-of-your-lib, default version master, modern scm git https://urlofyoursharedlib.git Run a first time the jobDSL job, then go to the In Process Script Approval page and approve everything.

Use a shared lib

To import a library inside your job you must include at the top of the file, after the shebang the statement @Library('name-of-your-lib')_

There is also a similar statement that exists, "library 'name-of-your-lib'". this one is useful to "debug & fix" a shared library because when you hit that replay button you'll see the shared library files used in the pipeline

Finally if all you are trying is to create job templates, I would recommend to try to get what this shared library I shared is doing, it helps with creating declarative templates and solves issues and limitations you will encounter with jobdsl & shared pipeline

Upvotes: 2

Related Questions