Hi there,

   I've been struggling a bit in order to accomplish the below use case, 
first of all this is a long message, It works so far although I've found it 
a bit 'too much' hacky. That's the reason I want to explain how I did it 
just in case someone got a similar use case or even, most likely, a better 
approach.

*Use Case*

   Using Declarative Pipeline I'd like to inject global env variables using 
the Gerrit Trigger plugin, then those details will be added as a Gerrit 
comment. Those env variables will be changed/created on the fly.

   Gerrit Trigger plugin allows to customise the Gerrit comment using the 
existing env variables plus some default ones, as you can see in the below 
links

   - 
   
https://github.com/jenkinsci/gerrit-trigger-plugin/blob/gerrit-trigger-2.24.0/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpander.java#L223
   - 
   
https://github.com/jenkinsci/gerrit-trigger-plugin/blob/gerrit-trigger-2.24.0/src/main/java/com/sonyericsson/hudson/plugins/gerrit/trigger/gerritnotifier/ParameterExpander.java#L261-L283

   I've tried to override the value of those env variables or even create a 
new env variable but those variables weren't expanded correctly or even 
didn't exist.


*From the implementation point of view I used two different DSLs: Pipeline 
and JobDSL. *

   The JobDSL part is just the Pipeline Job and how it's integrated with 
Gerrit, while the Pipeline is the declarative pipeline itself.

pipelineJob("gatekeeper") {
  triggers {
    gerritTrigger {
      gerritProjects {
        gerritProject {
          compareType('PLAIN')
          pattern('driver')
          branches {
            branch {
              compareType('PLAIN')
              pattern('trunk')
            }
          }
          disableStrictForbiddenFileVerification(false)
        }
      }
      serverName("gerrit-gpu")
      triggerOnEvents {
        commentAddedContains {
          commentAddedCommentContains('AutomateMe')
        }
      }
      silentMode(false)
    }
  }
  definition {
    cps {
      sandbox()
      script(readFileFromWorkspace('pipeline.groovy'))
    }
  }
}




pipeline {
  agent any
  stage('TestLab') {
      steps {
        script {
          // This is a Long Execution Build in the Test Lab
          def bRun = build job: 'testlab', parameters: [string(name: 
'GERRIT_PATCHSET_REVISION', GERRIT_PATCHSET_REVISION)], propagate: false
*          sh """*
*            curl 
"${bRun.getRawBuild().getAbsoluteUrl()}/artifact/testlab_run.properties/*view*/"
 
--write-out %{http_code} --silent --output /dev/null | grep '200' 
>/dev/null \*
*            && curl -s -o ti2_run.properties 
"${bRun.getRawBuild().getAbsoluteUrl()}/artifact/testlab_run.properties/*view*/"
 
|| echo "TESTLAB_URL=null" > testlab_run.properties*
*          """*
        }
      }      
    }
  }
}


*How did I inject env variables on the fly using the Declarative Pipeline?*

    I was lucky to find: https://issues.jenkins-ci.org/browse/JENKINS-35377 
and i coded a declarative pipeline like the below snippet:

*import hudson.tasks.test.AbstractTestResultAction*
*// List of Functions*
*@NonCPS*
*def addParameter(build, name, value) {*
*  // Given a Build it will Inject a Parameter and Value pair*
*  StringParameterValue p = new StringParameterValue(name, value)*
*  ParametersAction a = build.getAction(ParametersAction.class)*
*  if (a) {*
*    build.replaceAction(a.createUpdated(Collections.singleton(p)));*
*  } else {*
*    build.addAction(new ParametersAction(p));*
*  }*
*}*


pipeline {
  agent any
  parameters {

*    string(name: 'TESTLAB_URL', description: 'To expose as a comment in 
Gerrit')*  }
  stage('TestLab') {
     ...

   post {
    always {
      script {
        *def props = readProperties file: 'testlab_run.properties'*
*        addParameter(currentBuild.rawBuild, "TESTLAB_URL", "${props.*
*TESTLAB_URL}")*
      }
    }
  }   
}


It --worked like a charm--, although I didn't like much the idea of playing 
with the internal api though. But ... I started to see the below errors:

groovy.lang.MissingPropertyException: No such property: 
GERRIT_PATCHSET_REVISION for class: WorkflowScript

Null value not allowed as an environment variable: TESTLAB_URL


Those errors where only happing when the pipeline was launched without 
editing it previously. What do I mean? If i do change the pipeline job, 
using the Jenkins UI, and save it, then those errors go away only for the 
next build, while if I don't change anything the next build will fail with 
the above errors.

*How did I solve them?*

1st stacktrace error was solved by injecting those env variables which are 
provided by the Gerrit Trigger as Pipeline parameters:
pipeline {
  agent any
  parameters {
    string(name: 'TESTLAB_URL', description: 'To expose as a comment in 
Gerrit')
    *string(name: 'GERRIT_PATCHSET_REVISION', description: 'To 
solve MissingPropertyException')*
  }
  stage('TestLab') {
      steps {
        script {
          // This is a Long Execution Build in the Test Lab
          def bRun = build job: 'testlab', parameters: [string(name: 
'GERRIT_PATCHSET_REVISION', *params.GERRIT_PATCHSET_REVISION*)], propagate: 
false


2nd one was by enabling a default value to those parameters

pipeline {
  agent any
  parameters {
    string(name: 'TESTLAB_URL', *defaultValue: "empty", *description: 'To 
expose as a comment in Gerrit')
    string(name: 'GERRIT_PATCHSET_REVISION', *defaultValue: "empty"*, 
description: 
'To solve MissingPropertyException')
  }


*Final thoughts*

This is not an ideal implementation:

   - too complicated
   - too many dependencies
   - non KISS 
   

Since I couldn't find another way to inject env variables on the fly, I'd 
like to ask whether you got some ideas, workarounds or even think this is 
too unstable to keep it running for a while. 

Thanks and sorry for this long message





-- 
You received this message because you are subscribed to the Google Groups 
"Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jenkinsci-users/06b67a2c-a2ef-4fe2-9e9a-737a8684a4fd%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to