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

Polling build filters in jenkinsfile broken or need guidance on what code should be

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Blocker Blocker
    • p4-plugin
    • 1.8.5
      1.8.6

      If you use the syntax generator to create a checkout step that includes a polling build filter the following text is created:

      filter: [userFilter('BUILDER'), viewFilter('''//corvus/main/workers''')],
      

      If you try to execute this code in Pipeline (jenkinsfile or defined in job window) it will fail with error:

      [Pipeline] End of Pipeline
      java.lang.IllegalArgumentException: Arguments to class org.jenkinsci.plugins.p4.filters.FilterPatternListImpl have to be explicitly named
          at org.jenkinsci.plugins.structs.describable.DescribableModel.instantiate(DescribableModel.java:254)
          at org.jenkinsci.plugins.structs.describable.UninstantiatedDescribable.instantiate(UninstantiatedDescribable.java:167)
          at org.jenkinsci.plugins.structs.describable.DescribableModel.coerce(DescribableModel.java:372)
          at org.jenkinsci.plugins.structs.describable.DescribableModel.coerceList(DescribableModel.java:463)
          at org.jenkinsci.plugins.structs.describable.DescribableModel.coerce(DescribableModel.java:365)
          at org.jenkinsci.plugins.structs.describable.DescribableModel.buildArguments(DescribableModel.java:318)
          at org.jenkinsci.plugins.structs.describable.DescribableModel.instantiate(DescribableModel.java:259)
      Caused: java.lang.IllegalArgumentException: Could not instantiate {credential=MasterServer, filter=[@userFilter(<anonymous>=BUILDER), @viewFilter(<anonymous>=//corvus/main/workers
      ...cut...
      filter: Filter{FilterPathImpl(path: String) | FilterPatternListImpl(patternText: String, caseSensitive: boolean) | FilterPerChangeImpl(perChange: boolean) | FilterUserImpl(user: String) | FilterViewMaskImpl(viewMask: String)}[]
      ...cut...
      

      To fix the problem you need to name the variables. For example:

      filter: [ userFilter(user: 'BUILDER'),viewFilter(viewMask: '''//corvus/main/workers''')],
      

      Note: Checked this by looking at the code https://github.com/jenkinsci/p4-plugin/blob/d673f91a923c3d80e5570dd4a41930b57f62befc/src/main/java/org/jenkinsci/plugins/p4/filters/FilterViewMaskImpl.java

      If you run the build manually it works OK and if you just have the 'userFilter' on its own works OK. But if you try to use 'viewFilter' on its own or with 'userFilter' you get an exception when polling. For example:

      Started on Mar 8, 2018 4:27:00 PM
      P4: Polling on: master with:jenkins-master-FilteredPipeline-0
      Found last change 347 on syncID jenkins-NODE_NAME-FilteredPipeline-EXECUTOR_NUMBER
      ... p4 client -o jenkins-master-FilteredPipelineSamuel-0 +
      ... p4 info +
      
      P4 Task: establishing connection.
      ... server: 10.1.3.217:1666
      ... node: vm-karl-swarm174-xenial
      P4: Polling with range: 347,now
      ... p4 changes -m20 //jenkins-master-FilteredPipeline-0/...@347,now +
      ... p4 change -o 348 +
      ... p4 describe -s 348 +
      P4 Task: attempt: 1
      P4 Task: failed: java.lang.NullPointerException
      ERROR: polling failed in /var/lib/jenkins/workspace/FilteredPipeline on : P4 Task: failed: java.lang.NullPointerException
      Done. Took 4 sec
      No changes
      
      

      Example full code below:

      pipeline {
          agent any
        stages {
            stage('Sync code') {
                steps {
                    echo "Starting"
                    //checkout perforce(credential: 'MasterServer', filter: [ userFilter(user: 'BUILDER') ], populate: autoClean(delete: true, modtime: false, parallel: [enable: false, minbytes: '1024', minfiles: '1', threads: '4'], pin: '', quiet: false, replace: true, tidy: false), workspace: manualSpec(charset: 'none', name: 'jenkins-${NODE_NAME}-${JOB_NAME}-${EXECUTOR_NUMBER}', pinHost: false, spec: clientSpec(allwrite: false, backup: false, clobber: true, compress: false, line: 'LOCAL', locked: false, modtime: false, rmdir: false, serverID: '', streamName: '//corvus/main', type: 'WRITABLE', view: '')))
                    //checkout perforce(credential: 'MasterServer', filter: [userFilter(user:'BUILDER'), viewFilter(viewMask:'//corvus/main/workers')], populate: autoClean(delete: true, modtime: false, parallel: [enable: false, minbytes: '1024', minfiles: '1', threads: '4'], pin: '', quiet: false, replace: true, tidy: false), workspace: streamSpec(charset: 'none', format: 'jenkins-${NODE_NAME}-${JOB_NAME}-${EXECUTOR_NUMBER}', pinHost: false, streamName: '//corvus/main'))
                    checkout perforce(credential: 'MasterServer', filter: [viewFilter(viewMask:'//corvus/main/workers')], populate: autoClean(delete: true, modtime: false, parallel: [enable: false, minbytes: '1024', minfiles: '1', threads: '4'], pin: '', quiet: false, replace: true, tidy: false), workspace: streamSpec(charset: 'none', format: 'jenkins-${NODE_NAME}-${JOB_NAME}-${EXECUTOR_NUMBER}', pinHost: false, streamName: '//corvus/main'))
                    }
      }
      }
      }
      

          [JENKINS-50027] Polling build filters in jenkinsfile broken or need guidance on what code should be

          Karl Wirth added a comment -

          Ping to keep this one visible.

          Karl Wirth added a comment - Ping to keep this one visible.

          Karl Wirth added a comment -

          A slight twist. Only happens if there are files that match the build filter. Repro case:

          (1) Create stream depot.

          (2) Add files in '//streams/main/workers'.

          (3) Create Jenkins job with following content:

          pipeline {
              agent {label 'master'}
               stages {
                stage('Sync code') {
                    steps {
                        echo "Starting"
                        checkout perforce(credential: 'MasterServer',
                        filter: [viewFilter(viewMask: '''//streams/main/workers''')],
                        populate: autoClean(delete: true, modtime: false,
                          parallel: [enable: false, minbytes: '1024', minfiles: '1', threads: '4'],
                        pin: '', quiet: false, replace: true, tidy: false),
                        workspace: streamSpec(charset: 'none',
                        format: 'jenkins-${NODE_NAME}-${JOB_NAME}-${EXECUTOR_NUMBER}',
                        pinHost: false, streamName: '//streams/main'))
                          }
                      }
          }
          

          (4) Run 'Build Now'.

          (5) Run 'Poll Now'. No errors in polling log.

          Perforce Software Polling Log
          
          Started on Apr 6, 2018 11:17:00 AM
          P4: Polling on: master with:jenkins-master-FilteredPipeline-0
          Found last change 417 on syncID jenkins-NODE_NAME-FilteredPipeline-EXECUTOR_NUMBER
          ... p4 client -o jenkins-master-FilteredPipeline-0 +
          ... p4 info +
          
          P4 Task: establishing connection.
          ... server: 10.1.3.217:1666
          ... node: vm-kwirth-swarm174-xenial
          P4: Polling with range: 417,now
          ... p4 changes -m20 //jenkins-master-FilteredPipeline-0/...@417,now +
          ... p4 repos -C +
          Done. Took 0.11 sec
          No changes
          
          

          (6) Edit and submit //streams/main/workers/f1.

          (7) Run 'Poll Now'. Following errors seen:

          Perforce Software Polling Log
          
          Started on Apr 6, 2018 11:15:00 AM
          P4: Polling on: master with:jenkins-master-FilteredPipeline-0
          Found last change 415 on syncID jenkins-NODE_NAME-FilteredPipeline-EXECUTOR_NUMBER
          ... p4 client -o jenkins-master-FilteredPipeline-0 +
          ... p4 info +
          
          P4 Task: establishing connection.
          ... server: 10.1.3.217:1666
          ... node: vm-kwirth-swarm174-xenial
          P4: Polling with range: 415,now
          ... p4 changes -m20 //jenkins-master-FilteredPipeline-0/...@415,now +
          ... p4 change -o 417 +
          ... p4 describe -s 417 +
          P4 Task: attempt: 1
          P4 Task: failed: java.lang.NullPointerException
          ERROR: polling failed in /var/lib/jenkins/workspace/FilteredPipeline on : P4 Task: failed: java.lang.NullPointerException
          Done. Took 3.1 sec
          No changes
          

          (8) Error in Jenkins log:

          P4 Task: attempt: 1
          
          Apr 06, 2018 11:14:03 AM WARNING org.jenkinsci.plugins.p4.tasks.AbstractTask tryTask
          P4 Task: failed: java.lang.NullPointerException
          

          Karl Wirth added a comment - A slight twist. Only happens if there are files that match the build filter. Repro case: (1) Create stream depot. (2) Add files in '//streams/main/workers'. (3) Create Jenkins job with following content: pipeline {     agent {label 'master' }      stages {       stage( 'Sync code' ) {           steps {               echo "Starting"               checkout perforce(credential: 'MasterServer' ,               filter: [viewFilter(viewMask: ''' //streams/main/workers' '')],               populate: autoClean(delete: true , modtime: false ,                 parallel: [enable: false , minbytes: '1024' , minfiles: '1' , threads: '4' ],               pin: '', quiet: false , replace: true , tidy: false ),               workspace: streamSpec(charset: 'none' ,               format: 'jenkins-${NODE_NAME}-${JOB_NAME}-${EXECUTOR_NUMBER}' ,               pinHost: false , streamName: ' //streams/main' ))                 }             } } (4) Run 'Build Now'. (5) Run 'Poll Now'. No errors in polling log. Perforce Software Polling Log Started on Apr 6, 2018 11:17:00 AM P4: Polling on: master with:jenkins-master-FilteredPipeline-0 Found last change 417 on syncID jenkins-NODE_NAME-FilteredPipeline-EXECUTOR_NUMBER ... p4 client -o jenkins-master-FilteredPipeline-0 + ... p4 info + P4 Task: establishing connection. ... server: 10.1.3.217:1666 ... node: vm-kwirth-swarm174-xenial P4: Polling with range: 417,now ... p4 changes -m20 //jenkins-master-FilteredPipeline-0/...@417,now + ... p4 repos -C + Done. Took 0.11 sec No changes (6) Edit and submit //streams/main/workers/f1. (7) Run 'Poll Now'. Following errors seen: Perforce Software Polling Log Started on Apr 6, 2018 11:15:00 AM P4: Polling on: master with:jenkins-master-FilteredPipeline-0 Found last change 415 on syncID jenkins-NODE_NAME-FilteredPipeline-EXECUTOR_NUMBER ... p4 client -o jenkins-master-FilteredPipeline-0 + ... p4 info + P4 Task: establishing connection. ... server: 10.1.3.217:1666 ... node: vm-kwirth-swarm174-xenial P4: Polling with range: 415,now ... p4 changes -m20 //jenkins-master-FilteredPipeline-0/...@415,now + ... p4 change -o 417 + ... p4 describe -s 417 + P4 Task: attempt: 1 P4 Task: failed: java.lang.NullPointerException ERROR: polling failed in / var /lib/jenkins/workspace/FilteredPipeline on : P4 Task: failed: java.lang.NullPointerException Done. Took 3.1 sec No changes (8) Error in Jenkins log: P4 Task: attempt: 1 Apr 06, 2018 11:14:03 AM WARNING org.jenkinsci.plugins.p4.tasks.AbstractTask tryTask P4 Task: failed: java.lang.NullPointerException

          Code changed in jenkins
          User: Paul Allen
          Path:
          src/main/java/org/jenkinsci/plugins/p4/filters/FilterPatternListImpl.java
          src/main/resources/org/jenkinsci/plugins/p4/filters/FilterPatternListImpl/help-patternList.html
          src/main/resources/org/jenkinsci/plugins/p4/filters/FilterPatternListImpl/help-patternText.html
          http://jenkins-ci.org/commit/p4-plugin/0e986e8b9265b21d568287d1193ce13b03360d10
          Log:
          Change Java Pattern polling filter name.

          The @Symbol name for the Java Pattern filter clashed with the View Mask
          filter. (minor) Renamed help file to match argument name.
          JENKINS-50027

          SCM/JIRA link daemon added a comment - Code changed in jenkins User: Paul Allen Path: src/main/java/org/jenkinsci/plugins/p4/filters/FilterPatternListImpl.java src/main/resources/org/jenkinsci/plugins/p4/filters/FilterPatternListImpl/help-patternList.html src/main/resources/org/jenkinsci/plugins/p4/filters/FilterPatternListImpl/help-patternText.html http://jenkins-ci.org/commit/p4-plugin/0e986e8b9265b21d568287d1193ce13b03360d10 Log: Change Java Pattern polling filter name. The @Symbol name for the Java Pattern filter clashed with the View Mask filter. (minor) Renamed help file to match argument name. JENKINS-50027

          Karl Wirth added a comment - - edited

          Following Test code now works for polling and build:

          filter: [viewFilter('''//test/main/workers''')
          

           

          Note: that if you use multiple 'viewFilter' entries the second will overwrite the first. In the example below only changes to 'workers2' will trigger a build.

          filter: [viewFilter('''//test/main/workers'''),viewFilter('''//test/main/workers2''')]
          

          The correct way to have multiple inclusions is to include a carriage return in the mapping and use 3  quotes.

          filter: [viewFilter('''//test/main/workers
          //test/main/workers2''')]
          

          IMPORTANT NOTE: This is not Perforce syntax do do not use '...'. For example use '//test/main/workers' instead of '//test/main/workers/...'.

          Karl Wirth added a comment - - edited Following Test code now works for polling and build: filter: [viewFilter( ''' //test/main/workers' '')   Note: that if you use multiple 'viewFilter' entries the second will overwrite the first. In the example below only changes to 'workers2' will trigger a build. filter: [viewFilter( ''' //test/main/workers' ''),viewFilter(' ''//test/main/workers2' '')] The correct way to have multiple inclusions is to include a carriage return in the mapping and use 3  quotes. filter: [viewFilter(''' //test/main/workers //test/main/workers2''')] IMPORTANT NOTE : This is not Perforce syntax do do not use '...'. For example use '//test/main/workers' instead of '//test/main/workers/...'.

          Paul Allen added a comment -

          Ready for release.

          Paul Allen added a comment - Ready for release.

          Paul Allen added a comment -

          Released in 1.8.9

          Paul Allen added a comment - Released in 1.8.9

            p4paul Paul Allen
            p4karl Karl Wirth
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: