Jenkinsfile takeWhile, возвращая Boolean для Jenkins, но ArrayList в реальном отличном состоянии.ЗАЧЕМ? - PullRequest
0 голосов
/ 01 июня 2018

Итак, у меня есть некоторый код в Jenkinsfile, и функция takeWhile возвращает логическое значение при запуске в jenkins, но возвращает список (как и ожидалось!) В реальном исполнении groovy.Весь сценарий выполняется до локального завершения, но в jenkins терпит неудачу, потому что я использую результат takeWhile как List, хотя версия jenkins Boolean

Мой коллега предполагает, что менеджер безопасности плагинамешает.Это единственное, что я могу себе представить.

Локальная версия:

$ groovy -version
Groovy Version: 2.4.14 JVM: 1.8.0_131 Vendor: Oracle Corporation OS: Mac OS X

Версия Jenkins:

Jenkins ver. 2.107.3

Код:

#!/usr/bin/env groovy

try {
    def deployTo = [
            'pre' : ['us-east-1'],
            'int' : ['us-east-1'],
            's1'  : ['ca-central-1', 'us-east-1'],
            'demo': ['us-east-1'],
    ].collectMany { k, v -> v.collect { r -> [k, r] } }

    def failure = deployTo.findResult { entry ->
        def result = 0
        stage("Deploying to:\n${entry[0]}\n(${entry[1]})") {
            println("stage deploy")

        }
        return new Random().nextBoolean() ? entry : null
    }
    println("deployto is a : ${deployTo.class}")
    println("deploy to: ${deployTo}")
    def takeWhile = deployTo.takeWhile { it != failure }
    println("takeWhile is a : ${takeWhile.class}")
    println("takeWhile to: ${takeWhile}")
    takeWhile.each { toRollback ->
        println("torollback is a ${toRollback.class}")
        stage("Rolling back to:\n${toRollback[0]}\n(${toRollback[1]})") {
            println("stage rollback")
        }
    }
} catch (e) {
    println(e.getStackTrace().join('\n'))
    println(e.class)
    println(e.message)
    throw e
}

Локальный заводной вывод:

Deploying to:
pre
(us-east-1)
stage deploy
Deploying to:
int
(us-east-1)
stage deploy
deployto is a : class java.util.ArrayList
deploy to: [[pre, us-east-1], [int, us-east-1], [s1, ca-central-1], [s1, us-east-1], [demo, us-east-1]]
takeWhile is a : class java.util.ArrayList
takeWhile to: [[pre, us-east-1]]
torollback is a class java.util.ArrayList
Rolling back to:
pre
(us-east-1)
stage rollback

Выход Дженкинса:

Running in Durability level: MAX_SURVIVABILITY
[Pipeline] stage
[Pipeline] { (Deploying to:
pre
(us-east-1))
[Pipeline] echo
stage deploy
[Pipeline] }
[Pipeline] // stage
[Pipeline] echo
deployto is a : class java.util.ArrayList
[Pipeline] echo
deploy to: [[pre, us-east-1], [int, us-east-1], [s1, ca-central-1], [s1, us-east-1], [demo, us-east-1]]
[Pipeline] echo
takeWhile is a : class java.lang.Boolean
[Pipeline] echo
takeWhile to: false
No such getAt method found: method java.lang.Boolean[java.lang.Integer]. Administrators can decide whether to approve or reject this signature.
[Pipeline] echo
torollback is a class java.lang.Boolean
[Pipeline] echo
org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetArray(SandboxInterceptor.java:451)
org.kohsuke.groovy.sandbox.impl.Checker$10.call(Checker.java:419)
org.kohsuke.groovy.sandbox.impl.Checker.checkedGetArray(Checker.java:424)
com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getArray(SandboxInvoker.java:45)
com.cloudbees.groovy.cps.impl.ArrayAccessBlock.rawGet(ArrayAccessBlock.java:21)
WorkflowScript.run(WorkflowScript:29)
com.cloudbees.groovy.cps.CpsDefaultGroovyMethods.each(CpsDefaultGroovyMethods:2030)
com.cloudbees.groovy.cps.CpsDefaultGroovyMethods.each(CpsDefaultGroovyMethods:1890)
WorkflowScript.run(WorkflowScript:27)
___cps.transform___(Native Method)
com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.get(PropertyishBlock.java:74)
com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.java:30)
com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.fixName(PropertyishBlock.java:66)
sun.reflect.GeneratedMethodAccessor703.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21)
com.cloudbees.groovy.cps.Next.step(Next.java:83)
com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174)
com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163)
org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:122)
org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:261)
com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$101(SandboxContinuable.java:34)
org.jenkinsci.plugins.workflow.cps.SandboxContinuable.lambda$run0$0(SandboxContinuable.java:59)
org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108)
org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:58)
org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:174)
org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:332)
org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$200(CpsThreadGroup.java:83)
org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:244)
org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:232)
org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64)
java.util.concurrent.FutureTask.run(FutureTask.java:266)
hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:131)
jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
java.util.concurrent.FutureTask.run(FutureTask.java:266)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
java.lang.Thread.run(Thread.java:748)
[Pipeline] echo
class org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException
[Pipeline] echo
No such getAt method found: method java.lang.Boolean[java.lang.Integer]
[Pipeline] End of Pipeline
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: No such getAt method found: method java.lang.Boolean[java.lang.Integer]
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetArray(SandboxInterceptor.java:451)
    at org.kohsuke.groovy.sandbox.impl.Checker$10.call(Checker.java:419)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetArray(Checker.java:424)
    at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getArray(SandboxInvoker.java:45)
    at com.cloudbees.groovy.cps.impl.ArrayAccessBlock.rawGet(ArrayAccessBlock.java:21)
    at WorkflowScript.run(WorkflowScript:29)
    at com.cloudbees.groovy.cps.CpsDefaultGroovyMethods.each(CpsDefaultGroovyMethods:2030)
    at com.cloudbees.groovy.cps.CpsDefaultGroovyMethods.each(CpsDefaultGroovyMethods:1890)
    at WorkflowScript.run(WorkflowScript:27)
    at ___cps.transform___(Native Method)
    at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.get(PropertyishBlock.java:74)
    at com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.java:30)
    at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.fixName(PropertyishBlock.java:66)
    at sun.reflect.GeneratedMethodAccessor703.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
    at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21)
    at com.cloudbees.groovy.cps.Next.step(Next.java:83)
    at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174)
    at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163)
    at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:122)
    at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:261)
    at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$101(SandboxContinuable.java:34)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.lambda$run0$0(SandboxContinuable.java:59)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:58)
    at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:174)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:332)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$200(CpsThreadGroup.java:83)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:244)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:232)
    at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:131)
    at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Finished: FAILURE

1 Ответ

0 голосов
/ 01 июня 2018

Это похоже на проблему, которую я подал ( JENKINS-49826 ).Это проблема компиляции CPS в Jenkins Pipeline.Я бы подал ошибку против workflow-cps-plugin, поскольку это определенно не предполагаемое поведение.

Тем временем я бы переместил ваш вызов takeWhile на аннотированный метод @NonCPS ипередать все вещи в качестве параметров.См. этот вопрос и ответ для получения дополнительной информации по @NonCPS.

Вот ваш пример, приведенный к небольшому репродуктору, и способ, которым вы можете переместить логику в @NonCPS:

final deployTo = [
  'pre' : ['us-east-1'],
  'int' : ['us-east-1'],
  's1'  : ['ca-central-1', 'us-east-1'],
  'demo': ['us-east-1'],
].collectMany { k, v -> v.collect { r -> [k, r] } }
final failure = [pre: 'us-east-1']

echo "${deployTo}"
echo "${deployTo.getClass()}"

def takeWhile = deployTo.takeWhile { it != failure }
println("takeWhile is a : ${takeWhile.class}")
println("takeWhile to: ${takeWhile}")

def nonCpsUsage = nonCpsTakeWhile(deployTo, failure)
println("nonCpsTakeWhile is a : ${nonCpsUsage.class}")
println("nonCpsTakeWhile to: ${nonCpsUsage}")

@NonCPS
def nonCpsTakeWhile(final d, final f) {
  return d.takeWhile { it != f }
}

И вывод:

Started
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] echo
[[pre, us-east-1], [int, us-east-1], [s1, ca-central-1], [s1, us-east-1], [demo, us-east-1]]
[Pipeline] echo
class java.util.ArrayList
[Pipeline] echo
takeWhile is a : class java.lang.Boolean
[Pipeline] echo
takeWhile to: true
[Pipeline] echo
nonCpsTakeWhile is a : class java.util.ArrayList
[Pipeline] echo
nonCpsTakeWhile to: [[pre, us-east-1], [int, us-east-1], [s1, ca-central-1], [s1, us-east-1], [demo, us-east-1]]
[Pipeline] End of Pipeline
Finished: SUCCESS

Обратите внимание на другой тип, что возвращаемый тип из @NonCPS равен java.util.ArrayList по сравнению с java.lang.Boolean.

...