Ceesiebird
Ceesiebird

Reputation: 706

How to parse YAML files in Jenkins pipeline using readYAML method from the Jenkins plugin Pipeline Utility Steps

I am trying to parse YAML files in Jenkins pipeline using the readYaml method from the Jenkins plugin "Pipeline Utility Steps".

I read on the forums that the readYml method should be called in the node block of the pipeline.

Before tinkering with this readYml method my pipeline worked flawlessly.

But after adding readYml to my pipeline's node block I get the following error.


org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 5: Expected to find someKey "someValue" @ line 5, column 14.
           node {
                ^

1 error

    at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
    at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085)
    at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)
    at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
    at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
    at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
    at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
    at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
    at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:131)
    at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:125)
    at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:560)
    at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:521)
    at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:290)
    at hudson.model.ResourceController.execute(ResourceController.java:97)
    at hudson.model.Executor.run(Executor.java:421)

I won't bore you with the complete pipeline code since the issue is really after editing my node block.

The way I call the plugins readYml method is as follows.

pipeline {
    agent {
        node {
            label 'lsrv9557.linux.rabobank.nl'
            customWorkspace '/appl/jenkins/workdir'
            datas = readYaml file: "manifest.yml"
        }
   }

How do I get this to work properly and get rid of the error?

Thanks in advance.

Upvotes: 7

Views: 43707

Answers (2)

cherusk
cherusk

Reputation: 31

Most convenient was for mine to work with base shell scripts after trying to template based on the javaISH strings.

$ cat logic/pipelines/obfuscate.sh 
#!/bin/bash

echo "${REQUEST}" | json2yaml > "${PARAM_FILE}"

Then reading from this PARAM_FILE in scripts further on:

---
#!/bin/bash

# improvised dynamic extraction

SOME=`yq -r .scope.some $PARAM_FILE`
echo -n "${SOME}"

Upvotes: 0

Ceesiebird
Ceesiebird

Reputation: 706

I have figured out what the issue was.

As the kind fellows above mentioned as well,calling the plugin won't work in a node block in a declaritive pipeline.

However, simply putting it in a step block also wasn't working.

The fix in the end was putting it in a script block within the step block.

        stage('Read YAML file') {
        steps {
            script{ datas = readYaml (file: 'manifest.yml') }
            echo datas.ear_file.deploy.toString()

        }
    }
}

note that the echo is just to verify for myself if the *.yml file was properly parsed.

Upvotes: 17

Related Questions