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

Lockable resources plugin doesn't assign resource if an env variable is used as label

    Details

    • Similar Issues:

      Description

      Lockable Resource Plugin Version: 2.3

      I am trying to use env variable in label field and the resource doesn't get locked. The job gets struck infinitely waiting for the resource even though env variable is set.

       

      pipeline {

      agent

      {   node

      { label 'centos_node' }

      }
      stages {
        stage("Setup") {
          steps {
            script

      {         env.NODE_LABEL = "pre_commit"       }

        }
      }
      stage ("Build") {

        options {
          lock(label: "${env.NODE_LABEL}", variable: "NODELABEL", quantity: 1)
        }
        steps {
          script {
            sh "echo \"${env.NODELABEL}\""
          }

         }

      }

      }
      }

       

      Console Output :
       
      +refs/heads/master:refs/remotes/origin/master # timeout=10
      Checking out Revision 9db4337fd2811d9ebce79f1761ef40a88ec16fb2 (master)
      > git config core.sparsecheckout # timeout=10
      > git checkout -f 9db4337fd2811d9ebce79f1761ef40a88ec16fb2 # timeout=10
      Commit message: "send slack for only master builds"
      > git rev-list --no-walk 9db4337fd2811d9ebce79f1761ef40a88ec16fb2 # timeout=10[Pipeline] nodeRunning on codereview1.eng.nutanix.com in /root/workspace/QA/test_lock[Pipeline] {[Pipeline] stage[Pipeline] { (Setup)[Pipeline] script[Pipeline]

      {[Pipeline] }

      [Pipeline] // script[Pipeline] }[Pipeline] // stage[Pipeline] stage[Pipeline] { (Build)[Pipeline] lockTrying to acquire lock on [Label: null, Quantity: 1]
      Found 0 available resource(s). Waiting for correct amount: 1.
      [Label: null, Quantity: 1] is locked, waiting...
       

       

      A lock should get acquired by resource with label 'pre_commit' but it is infinitely waiting for the resource as label value is coming as null.

        Attachments

          Activity

          Hide
          jbeier Jens Beier added a comment -

          Any news on this issue? I am having the same problem. (declarative mulitbranch pipeline, Jenkins Version 2.176, Lockable Resources Plugin 2.5)

          I am trying to dynamically determine the name of the resource which should be locked in an pipeline step before locking the resource. 

          As far as I understand the problem, this is not an issue of using an environment variable but a timing issue. The lockable resources plugin seems to determine the value/name of the resource/label to be locked at the beginning of the pipeline. If the value/name of the resource/label to be locked is created after the start of the pipeline and before executing the lock the value passed to the lockable resources plugin has no effect.

          Here an example that shows the issue:

          Pipeline:

          def resourceName = 'resource1'
          pipeline {
              agent any
              stages {
                  stage('change resource') {
                      steps {
                          echo "resourceName before update: ${resourceName}"
                          script{
                              resourceName = 'resource2'
                          }
                          echo "resourceName before update: ${resourceName}"
                      }
                  }
                  stage('lock resource') {
                      options {
                          lock resource: "${resourceName}", variable: 'RESOURCE_NAME'
                      }
                      steps {
                          echo "resourceName after lock: ${resourceName}"
                          echo "env.RESOURCE_NAME after lock: ${env.RESOURCE_NAME}"
                      }
                  }
              }
          }
          

          Console Output:

          [Pipeline] Start of Pipeline
          [Pipeline] node
          Running on BuildSlave
          [Pipeline] {
          [Pipeline] stage
          [Pipeline] { (change resource)
          [Pipeline] echo
          resourceName before update: resource1
          [Pipeline] script
          [Pipeline] {
          [Pipeline] }
          [Pipeline] // script
          [Pipeline] echo
          resourceName before update: resource2
          [Pipeline] }
          [Pipeline] // stage
          [Pipeline] stage
          [Pipeline] { (lock resource)
          [Pipeline] lock
          Trying to acquire lock on [resource1]
          Lock acquired on [resource1]
          [Pipeline] {
          [Pipeline] echo
          resourceName after lock: resource2
          [Pipeline] echo
          env.RESOURCE_NAME after lock: resource1
          [Pipeline] }
          Lock released on resource [resource1]
          [Pipeline] // lock
          [Pipeline] }
          [Pipeline] // stage
          [Pipeline] }
          [Pipeline] // node
          [Pipeline] End of Pipeline
          Finished: SUCCESS
          

           

          Can you change the lockable resource plugin so that the name of the resource is determined when the plugin is executed and not at the beginning of the pipeline?

           

          Show
          jbeier Jens Beier added a comment - Any news on this issue? I am having the same problem. (declarative mulitbranch pipeline, Jenkins Version 2.176, Lockable Resources Plugin 2.5) I am trying to dynamically determine the name of the resource which should be locked in an pipeline step before locking the resource.  As far as I understand the problem, this is not an issue of using an environment variable but a timing issue. The lockable resources plugin seems to determine the value/name of the resource/label to be locked at the beginning of the pipeline. If the value/name of the resource/label to be locked is created after the start of the pipeline and before executing the lock the value passed to the lockable resources plugin has no effect. Here an example that shows the issue: Pipeline: def resourceName = 'resource1' pipeline { agent any stages { stage( 'change resource' ) { steps { echo "resourceName before update: ${resourceName}" script{ resourceName = 'resource2' } echo "resourceName before update: ${resourceName}" } } stage( 'lock resource' ) { options { lock resource: "${resourceName}" , variable: 'RESOURCE_NAME' } steps { echo "resourceName after lock: ${resourceName}" echo "env.RESOURCE_NAME after lock: ${env.RESOURCE_NAME}" } } } } Console Output: [Pipeline] Start of Pipeline [Pipeline] node Running on BuildSlave [Pipeline] { [Pipeline] stage [Pipeline] { (change resource) [Pipeline] echo resourceName before update: resource1 [Pipeline] script [Pipeline] { [Pipeline] } [Pipeline] // script [Pipeline] echo resourceName before update: resource2 [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (lock resource) [Pipeline] lock Trying to acquire lock on [resource1] Lock acquired on [resource1] [Pipeline] { [Pipeline] echo resourceName after lock: resource2 [Pipeline] echo env.RESOURCE_NAME after lock: resource1 [Pipeline] } Lock released on resource [resource1] [Pipeline] // lock [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline Finished: SUCCESS   Can you change the lockable resource plugin so that the name of the resource is determined when the plugin is executed and not at the beginning of the pipeline?  

            People

            • Assignee:
              Unassigned
              Reporter:
              akansht Akansh Tayal
            • Votes:
              3 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated: