- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以,我在 Jenkinsfile
中有一些代码,takeWhile
函数在 jenkins 中运行时返回一个 bool 值,但在实际的 groovy 中返回一个列表(正如预期的那样!)执行。整个脚本在本地运行结束,但在 jenkins 中失败,因为我将 takeWhile
的结果用作 List
,即使 jenkins 版本是 Boolean
我的同事推测插件安全管理器正在干扰。这是我唯一能想到的。
本地 groovy 版本:
$ 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
Jenkins 输出:
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
最佳答案
这类似于我提交的问题 (JENKINS-49826)。这是 Jenkins Pipeline 中的 CPS 编译问题。我会针对 workflow-cps-plugin
提交错误因为这绝对不是预期的行为。
与此同时,我会将您的takeWhile
调用移动到一个@NonCPS
注释方法并将所有内容作为参数传递。参见 this question and answer for some information on @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
的不同类型。
关于Jenkinsfile takeWhile 在 Jenkins 上返回 Boolean,但在实际的 groovy 中返回 ArrayList。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50634043/
我有一个如下所示的 Jenkinsfile-A,在这个文件中,我需要在执行所有阶段后调用另一个 Jenkinsfile-B。 Jenkinsfile-A #!groovy pipeline {
我需要在构建时从基础项目加载外部项目。 (我拥有这两个代码库。)外部项目包含一个我需要从基础项目的 Jenkinsfile 执行的 Jenkinsfile,以及其他需要运行的脚本。 但是,在项目中克隆
在 Jenkinsfile 的以下代码片段中使用了什么 Groovy 语言构造、语法或控制结构? stage('Stage 1') { steps { // One or mo
java.lang.NoSuchMethodError:在步骤 [archive、bat、build、catchError、checkout、deleteDir、dir、dockerFingerpri
我如何在多分支管道 jenkinsfile(declerative)中使用此 dsl 脚本? parameters { activeChoiceParam('States') {
我公司的 Jenkins 使用隐式加载的全局库。 它们是 c***,我不希望每个管道都使用它们。加载它们需要 10 多秒。 有人知道如何抑制它们吗?谢谢! 最佳答案 不幸的是,无法抑制全局共享管道。我
我想通过 jenkinsfiles 使用稍微复杂一点的管道构建,并且有一些可重用的步骤,因为我有很多或类似的项目。我将 jenkins 2.0 与管道插件一起使用。我知道你可以加载包含一些通用代码片段
为了解释这个问题,假设我有 2 个 jenkins 工作。 作业 1:PARAM_TEST1 它接受一个名为“MYPARAM”的参数化值 作业 2:PARAM_TEST2 它还接受一个名为“MYPAR
我有一个管道作业,它使用两个单独的节点(一个用于构建,一个用于测试),我想在我的 Jenkinsfile 中的两个代码块之间共享一个变量.我认为这是可能的,但我对 groovy 和 Jenkinsfi
是否有任何内置变量可以访问当前正在执行的构建的文本? 我尝试使用类似 currentBuild.log 的东西, currentBuild.buildLog但没有任何运气。 最佳答案 实际上可以使用
我们正在使用 脚本管道 我们 Jenkinsfile 的语法它定义了很多阶段来构建和部署我们的代码。我们有一个用例,如果我在做 ,我想运行我的所有阶段。完整版 但如果我需要执行一些 AWS 路由,则只
我有一些代码需要在不同的操作系统上运行(实际上是构建、测试和包,但例如只运行 tox )。目前我的 Jenkinsfile看起来像这样: pipeline { // Where to run
我有以下我认为设置正确的 Jenkinsfile。我用过 https://jenkins.io/doc/book/pipeline/syntax/#sequential-stages作为一个例子,但出
我正在尝试将 Jenkins 文件用于我们在 Jenkins 中的所有构建,但我遇到了以下问题。 我们基本上有 3 种构建: pull-request 构建 - 代码审查后将合并到 master,如果
我是 Jenkins 管道的新手;我正在定义一个声明性语法管道,但我不知道是否可以解决我的问题,因为我没有找到解决方案。 在这个例子中,我需要将一个变量传递给ansible插件(在旧版本中我使用ENV
我有什么 我正在尝试使用两种不同的代理来运行我的 Jenkins 管道。我想在同一个代理上执行某些流程,但到目前为止我无法执行此操作,因为代理定义只有 2 个选项:我可以在管道顶部执行,或者我可以将代
所以我有一个jenkinsfile,其中有我的管道。我希望能够区分发送到主服务器的拉取请求和发送到其他地方的拉取请求。我找到了用于检测拉取请求的示例代码 - 像这样: env.BRANCH_NAME.
所以我的团队正在尝试为我们的 Web 开发项目创建一个 Jenkinsfile。我们以 React 作为前端,以 ExpressJS 作为后端。目前的结构是 root |-- react folde
我会在 Jenkinsfile 的“when”语法中评估两个条件。特别是,我需要检查 params.x 和 params.y 何时为真。我可以使用“and”运算符将两者插入同一个表达式吗? 最佳答案
我想为新工作使用新的 Jenkinsfile。 我在个人存储库中有 jenkinsfile: 我在 bash 中通过 git ls-remote 从另一个 gitlab 存储库获取分支。我将它们存储在
我是一名优秀的程序员,十分优秀!