Cannot use custom agent directive in Jenkinsfile

This issue is archived. You can view it, but you can't modify it. Learn more

XMLWordPrintable

      We are not able to use custom directive for "agent".
      We'd like to create a set of reusable directives, including few of those replacing the default agent directive. The error thrown is:

      org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
      WorkflowScript: 4: Undefined section "nodeAgent" @ line 4, column 5.
             nodeAgent(
             ^
      
      WorkflowScript: 3: Missing required section "agent" @ line 3, column 1.
         pipeline {
         ^
      
      2 errors
      
      	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.lambda$doParse$0(CpsGroovyShell.java:135)
      	at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:136)
      	at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:132)
      	at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:127)
      	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:320)
      	at hudson.model.ResourceController.execute(ResourceController.java:97)
      	at hudson.model.Executor.run(Executor.java:429)
      Finished: FAILURE
      

      And the Jenkinsfile

      @Library('jenkins-pipelines') _
      
      pipeline {
          nodeAgent(
              version: '10'
          )
          stages {
              stage('Build') {
                  ...
              }     
              stage('Test') {
                  ...
              }
              stage('Publish') {
                  ...
              }
          }
      }
      

      We'd like to run this within a docker container with NodeJS {version}, so for that reason we've decided to create a reusable nodeAgent directive.

      def call(Map<String, String> opts) {
          def spec = new NodeAgentSpec(opts)    
      
          if (!spec.version) {
              throw new RuntimeException('version must be provided')
          }
      
          new node().agent(spec)
      }
      

      and for the node.groovy

      def agent(NodeAgentSpec spec) {
          def cacheFolderPath = '$HOME' + "/.docker-cache/node/${spec.version}"    
          
          sh "mkdir -p ${cacheFolderPath}"
          sh "chmod 777 -R ${cacheFolderPath}"    
          
          agent {
              docker {
                  image "local/nodejs-node-${spec.version}"
                  args "-v ${cacheFolderPath}:/home/node/.cache"
              }
          }
      }
      

      We also need to set custom permissions (chmod 777) for our cache folder, that is being mounted to docker container, so we can avoid running docker container with root privileges.

       

       

            Assignee:
            Unassigned
            Reporter:
            David Rajnic
            Archiver:
            Jenkins Service Account

              Created:
              Updated:
              Archived: