代码之家  ›  专栏  ›  技术社区  ›  jxramos

Jenkins API调用中使用filter的安全问题,如何使用白名单过滤函数

  •  0
  • jxramos  · 技术社区  · 6 年前

    如果我用下面的詹金斯管道 Definition : Pipeline script from SCM ,或 Definition: Script, [*]Use Groovy Sandbox 我得到一个异常生成。

    管道

    import java.util.GregorianCalendar;
    import java.util.Calendar;
    
    pipeline {
      agent { label 'STUBS_ONLY'}//agent any
    
      stages {
        stage('Query Jenkins Jobs') {
          steps {
            script {
              // Get date seven days ago from today
              def gcalNeg7Days = new GregorianCalendar();
              gcalNeg7Days.add( Calendar.DAY_OF_MONTH , -7 );
              def time7DaysAgo = gcalNeg7Days.getTime()
    
              def getJobStats = { job ->
                def lb = job.getLastBuild()
                if (lb) {
                  // Calculate how many jobs ran in the last 7 days
                  def numRuns = job._getRuns().values().stream().filter( { run -> ( run.timestamp.getTime() > time7DaysAgo ) } ).count()
                } else {
                  numRuns   = 0
                }
                println '   ' + job.name + ' has ' + numRuns.toString() + ' ran last week'
              }
    
              // Get all builds from all views we explicitly track
              def trackedViews = Jenkins.instance.views.findAll( { it.name != 'all' } );
    
              // Print detail for each job
              trackedViews.each {
                view ->
                println "--------------------------------------------------------------------------------------------------------------------------------------------"
                println "${view.name}"
                view.items.each {
                item -> getJobStats( item )
                }
              }
            }
          } // steps
        } // stage
      } // stages
    } // pipeline
    

    例外情况

    hudson.remoting.ProxyException: groovy.lang.MissingMethodException:
        No signature of method: java.util.stream.ReferencePipeline$Head.filter()
        is applicable for argument types:
    
        (org.jenkinsci.plugins.workflow.cps.CpsClosure2) values: [org.jenkinsci.plugins.workflow.cps.CpsClosure2@4f819ba0]
    
    Possible solutions: filter(java.util.function.Predicate), sorted(), find(), sorted(java.util.Comparator), sleep(long), with(groovy.lang.Closure)
    

    如果我取消选中 Use Groovy Sandbox 异常消失,作业运行时没有问题。遗憾的是,该选项不适用于来自SCM工作流的管道。

    好像是 In Script Approval 解析无法识别筛选器谓词中的lambda,并且在默认情况下从作用域中忽略它。

    .filter( { run -> ( run.timestamp.getTime() > time7DaysAgo ) } )
    

    我在跑步 Jenkins ver. 2.138.3 . 如何手动将此添加到已批准签名的白名单中?

    0 回复  |  直到 6 年前