Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-47881

Declarative Pipeline: add option to set environment variables based on user passed boolean parameter in the environment directive

    XMLWordPrintable

Details

    Description

      Hi,

      Currently there is no option to set an environment variable based on boolean value within the environment directive. I think it is crucial to implement support for something like this:

       

      pipeline{
      agent any
      environment {
      
      /*Option1*/
      condition $params.some_bool_parameter{CC = "1"}
      
      /* Option2 variable will be set to "1" only if the boolean value is true */
      CC = $params.some_bool_parameter : "1"
      
      /* This is currently supported */
      CC = $params.some_non_bool_parameter
      }
      }
      

       

      Attachments

        Activity

          codizz Georg Koch added a comment -

          have the same issue as delphym.

          It's possible to set conditional trigger on environmental variable?

          codizz Georg Koch added a comment - have the same issue as delphym . It's possible to set conditional trigger on environmental variable?
          delphym Daniel Mladek added a comment - - edited

          Just can't figure out where better to ask this question:

          How can I conditionally set the triggers or options parameters? 

          The same logic as suggested for environment variables section can be applied inside options section, e,g. to some values of logRotator() function like this:
          numToKeepStr: "${params.IS_IT_NIGHTLY ? '4' : '2'}"

          But how to make it conditional on entire call of the logRotator() function or in triggers section when I would like to call poolSCM() method with different intervals for CI and NIGHTLY builds (or not to call it at all and use just cron() or whatever ?

          I'm looking for something like this:

          triggers {
            if (params.IS_IT_NIGHTLY==true) {
                pollSCM('''# Once a day, between 12:00AM and 1:59AM
          H H(0-1) * * *  ''')
            } else {
                pollSCM('''# every five minutes
          H/5 * * * *  ''')
            }
          }
          

          If I do that, then I'll get this error:

          WorkflowScript: 25: Expected a trigger @ line 25, column 5.
                 if (params.IS_IT_NIGHTLY==true) {
                 ^
          1 error
          

          The whole point of having parameterized Jenkins pipeline jobs

          is that most of our the Jenkinsfiles for NIGHTLY and CI builds looks almost identical, except the:

          • scheduler triggers
          • SVN checkout (which differs in checkout strategy, depth of checkout, and other minor details)
          • and of course then a true parametrized split weather to perform a limited or fuld build process with relevant tests and deployment locations.

          I can't see as it is now implemented how can I achieve this.

          Thanks,
          -d

          delphym Daniel Mladek added a comment - - edited Just can't figure out where better to ask this question: How can I conditionally set the triggers or options parameters?  The same logic as suggested for environment variables section can be applied inside options section, e,g. to some values of logRotator() function like this: numToKeepStr: "${params.IS_IT_NIGHTLY ? '4' : '2'}" But how to make it conditional on entire call of the logRotator() function or in triggers section when I would like to call poolSCM() method with different intervals for CI and NIGHTLY builds (or not to call it at all and use just cron() or whatever ? I'm looking for something like this: triggers { if (params.IS_IT_NIGHTLY== true ) { pollSCM('''# Once a day, between 12:00AM and 1:59AM H H(0-1) * * * ''') } else { pollSCM('''# every five minutes H/5 * * * * ''') } } If I do that, then I'll get this error : WorkflowScript: 25: Expected a trigger @ line 25, column 5. if (params.IS_IT_NIGHTLY== true ) { ^ 1 error The whole point of having parameterized Jenkins pipeline jobs is that most of our the Jenkinsfiles for NIGHTLY and CI builds looks almost identical, except the: scheduler triggers SVN checkout (which differs in checkout strategy, depth of checkout, and other minor details) and of course then a true parametrized split weather to perform a limited or fuld build process with relevant tests and deployment locations. I can't see as it is now implemented how can I achieve this. Thanks, -d
          delphym Daniel Mladek added a comment -

          Any update on its status? I mean as suggested  by abayer it is working as of Jenkins v. 2.150.3, so it looks like it has been released.

          delphym Daniel Mladek added a comment - Any update on its status? I mean as suggested  by abayer it is working as of Jenkins v. 2.150.3, so it looks like it has been released.

          Hi Andrew, sorry I missed your previous post, I did it indeed similar to your proposal, and it works thx!

          koen_bruyninckx Koen Bruyninckx added a comment - Hi Andrew, sorry I missed your previous post, I did it indeed similar to your proposal, and it works thx!
          abayer Andrew Bayer added a comment -

          koen_bruyninckx - are you still having problems?

          abayer Andrew Bayer added a comment - koen_bruyninckx - are you still having problems?
          abayer Andrew Bayer added a comment -

          koen_bruyninckx - looks to me like you're trying to call the changeRequest when condition inside of environment - that won't work. Try something like "${env.CHANGE_ID != null ? env.CHANGE_TARGET : env.BRANCH_NAME}"

          abayer Andrew Bayer added a comment - koen_bruyninckx - looks to me like you're trying to call the changeRequest when condition inside of environment - that won't work. Try something like "${env.CHANGE_ID != null ? env.CHANGE_TARGET : env.BRANCH_NAME}"
          koen_bruyninckx Koen Bruyninckx added a comment - - edited

          abayer I've picked up your suggestion but to my surprise the following does not seem to be working, i.e. the BRANCH_NAME which is an environment var that I would like to assign to TARGET in case of a CI build, always results to null:

          environment {
            TARGET = "${changeRequest() ? CHANGE_TARGET : BRANCH_NAME}"
          }

          I noticed that the call to changeRequest() does not seem to be working in this condition, but still always resolves to true.

          Would be awesome if resolved.

          K.

          koen_bruyninckx Koen Bruyninckx added a comment - - edited abayer I've picked up your suggestion but to my surprise the following does not seem to be working, i.e. the BRANCH_NAME which is an environment var that I would like to assign to TARGET in case of a CI build, always results to null: environment {   TARGET = "${changeRequest() ? CHANGE_TARGET : BRANCH_NAME}" } I noticed that the call to changeRequest() does not seem to be working in this condition, but still always resolves to true. Would be awesome if resolved. K.
          abayer Andrew Bayer added a comment -

          You can do something like:

          CC = "${params.some_bool_parameter ? '1' : ''}"
          

          Which will set CC to 1 if some_bool_parameter is true, and will set it to '' otherwise. If that's not sufficient and you need to be able to have the variable be unset completely, you may need to use Scripted Pipeline instead.

          abayer Andrew Bayer added a comment - You can do something like: CC = "${params.some_bool_parameter ? '1' : ''}" Which will set CC to 1 if some_bool_parameter is true, and will set it to '' otherwise. If that's not sufficient and you need to be able to have the variable be unset completely, you may need to use Scripted Pipeline instead.

          People

            abayer Andrew Bayer
            progovoy Pavel Rogovoy
            Votes:
            0 Vote for this issue
            Watchers:
            7 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: