12

How do I import a Groovy class within a Jenkinsfile? I've tried several approaches but none have worked.

This is the class I want to import:

Thing.groovy

class Thing {
    void doStuff() { ... }
}

These are things that don't work:

Jenkinsfile-1

node {
    load "./Thing.groovy"

    def thing = new Thing()
}

Jenkinsfile-2

import Thing

node {
    def thing = new Thing()
}

Jenkinsfile-3

node {
    evaluate(new File("./Thing.groovy"))

    def thing = new Thing()
}
Leonhardt Koepsell
  • 371
  • 1
  • 3
  • 10

1 Answers1

9

You can return a new instance of the class via the load command and use the object to call "doStuff"

So, you would have this in "Thing.groovy"

class Thing {
   def doStuff() { return "HI" }
}

return new Thing();

And you would have this in your dsl script:

node {
   def thing = load 'Thing.groovy'
   echo thing.doStuff()
}

Which should print "HI" to the console output.

Would this satisfy your requirements?

Daniel Omoto
  • 2,431
  • 17
  • 15
  • 2
    This works? I get a FileNotFoundException, because in the directory on the Jenkins server there is just Jenkinsfile, but not the classfile which needs to be included. – Rainer Blessing May 18 '17 at 13:45
  • I agree. Correct answer here: https://stackoverflow.com/questions/43881014/can-i-import-a-groovy-script-from-a-relative-directory-from-a-jenkinsfile – Nauraushaun Jun 29 '17 at 01:01
  • This does not work if the groovy file lives with your Jenkinsfile. In the Jenkinsfile you may checkout a repo manually and load .groovy files from there. In this case the file _is_ found, but the following is thrown: java.io.NotSerializableException: Thing – Nauraushaun Jun 29 '17 at 01:13