jenkinsgroovyfilepathjenkins-shared-libraries

How to access to a static file in resources folder of the shared library from within a class in src directory


I have the Jenkins shared library with the following structure:

resources
  |-> config.yaml
  |-> projects.yaml
src
  |_ com
      |_ rathath
           |_ jenkins
                 |-> Configuration.groovy

In src/com/rathath/jenkins/Configuration.groovy , I want to read YAML files in resources directory.

I tried :

@Grab('org.yaml:snakeyaml:1.17')
import org.yaml.snakeyaml.Yaml
import hudson.FilePath
// ...
def readConfig() {
   def config = [:]
   def cwd = hudson.model.Executor.currentExecutor().getCurrentWorkspace().absolutize()
   new FilePath(cwd, 'resources').list('*.yaml').each {
     config << it.read()
   }
}       

Unfortunately, i got hudson.model.Executor.currentExecutor() is null.

I tried another way:

@Grab('org.yaml:snakeyaml:1.17')
import org.yaml.snakeyaml.Yaml
import hudson.FilePath
import groovy.transform.SourceURI
import java.nio.file.Paths

// ...
@SourceURI
URI source Uri

def readConfig() {
   def config = [:]
   def cwd = new FilePath(Paths.get(sourceUri).getParent().getParent().getParent().getParent().getParent().getParent().toFile());
   new FilePath(cwd, 'resources').list('*.yaml').each {
     config << it.read()
   }
}  

I got bigger issue,.. Jenkins was not able to load the file :

java.lang.NoClassDefFoundError: Could not initialize class com.rathath.jenkins.Configuration
   at java.io.ObjectStreamClass.hasStaticInitializer(Native Method).
.....
....

Solution

  • It was not easy to get it working. But i did it:

    In src/com/rathath/jenkins/Configuration.groovy :

    @Grab(group='org.yaml', module='snakeyaml', version='1.17')
    import org.yaml.snakeyaml.Yaml
    import java.io.File
    import groovy.transform.SourceURI
    import java.nio.file.Path
    import java.nio.file.Paths
    import static groovy.io.FileType.*
    
    class Configuration {
    
      Map config = [:]
      
      @SourceURI
      URI sourceUri
    
      Configuration() {
        new File(getRootLocation(), 'resources')
          .eachFileMatch(FILES, ~/.*\.yaml/) {
           this.config << yaml.load(it.text)
          }
      }
      @NonCPS
      File getRootLocation() {
        return Paths.get(sourceUri)
                .getParent() // jenkins
                .getParent() // rathath
                .getParent() // com
                .getParent() // src
                .getParent() // .
                .toFile()
    
      }
    
    }