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

Add support for Grape (@Grab) in workflow scripts

      The workflow plugin and its groovy DSL should support the use of Grape and the @Grab attribute to allow the creation of workflows that depend on external libraries such as HTTP Builder or jYaml.

      This issue seems closely related to JENKINS-18349 and other issues referenced in the comments of that issue.

          [JENKINS-26192] Add support for Grape (@Grab) in workflow scripts

          Built and installed the 2.3-SNAPSHOT version from the branch on jglick's fork of the repo.

          When the global lib is loaded, before the build begins stepping, I get:

          Started by user G. Richard Bellamy
          Replayed #48
          Connecting to https://api.github.com using terradatum-automation/****** (Terradatum Automation GitHub credentials)
          [BFA] Scanning build for known causes...
          [BFA] No failure causes found
          [BFA] Done. 0s
          
          GitHub has been notified of this commit’s build result
          
          java.lang.NoClassDefFoundError: org/apache/ivy/core/settings/IvySettings
          	at java.lang.Class.getDeclaredMethods0(Native Method)
          	at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
          	at java.lang.Class.privateGetPublicMethods(Class.java:2902)
          	at java.lang.Class.getMethods(Class.java:1615)
          	at java.beans.Introspector.getPublicDeclaredMethods(Introspector.java:1336)
          	at java.beans.Introspector.getTargetMethodInfo(Introspector.java:1197)
          	at java.beans.Introspector.getBeanInfo(Introspector.java:426)
          	at java.beans.Introspector.getBeanInfo(Introspector.java:173)
          	at groovy.lang.MetaClassImpl$15.run(MetaClassImpl.java:3290)
          	at java.security.AccessController.doPrivileged(Native Method)
          	at groovy.lang.MetaClassImpl.addProperties(MetaClassImpl.java:3288)
          	at groovy.lang.MetaClassImpl.initialize(MetaClassImpl.java:3265)
          	at org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:254)
          	at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:285)
          	at groovy.grape.GrapeIvy.$getStaticMetaClass(GrapeIvy.groovy)
          	at groovy.grape.GrapeIvy.<init>(GrapeIvy.groovy:81)
          	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
          	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
          	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
          	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
          	at java.lang.Class.newInstance(Class.java:442)
          	at groovy.grape.Grape.getInstance(Grape.java:121)
          	at groovy.grape.Grape.grab(Grape.java:159)
          	at groovy.grape.GrabAnnotationTransformation.visit(GrabAnnotationTransformation.java:378)
          	at org.codehaus.groovy.transform.ASTTransformationVisitor$3.call(ASTTransformationVisitor.java:321)
          	at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:931)
          	at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:593)
          	at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:569)
          	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:546)
          	at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
          	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
          	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:254)
          	at groovy.lang.GroovyClassLoader.recompile(GroovyClassLoader.java:761)
          	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:718)
          	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:787)
          	at java.lang.ClassLoader.loadClass(ClassLoader.java:411)
          	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:677)
          	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:545)
          	at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:185)
          	at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:170)
          	at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:126)
          	at org.codehaus.groovy.control.ResolveVisitor.resolveToOuter(ResolveVisitor.java:676)
          	at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:308)
          	at org.codehaus.groovy.control.ResolveVisitor.resolveFromModule(ResolveVisitor.java:638)
          	at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:308)
          	at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:276)
          	at org.codehaus.groovy.control.ResolveVisitor.resolveOrFail(ResolveVisitor.java:260)
          	at org.codehaus.groovy.control.ResolveVisitor.resolveOrFail(ResolveVisitor.java:272)
          	at org.codehaus.groovy.control.ResolveVisitor.transformConstructorCallExpression(ResolveVisitor.java:1047)
          	at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:706)
          	at org.codehaus.groovy.control.ResolveVisitor.transformDeclarationExpression(ResolveVisitor.java:1088)
          	at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:698)
          	at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitExpressionStatement(ClassCodeExpressionTransformer.java:142)
          	at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:42)
          	at org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatement(CodeVisitorSupport.java:37)
          	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatement(ClassCodeVisitorSupport.java:166)
          	at org.codehaus.groovy.control.ResolveVisitor.visitBlockStatement(ResolveVisitor.java:1318)
          	at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:71)
          	at org.codehaus.groovy.control.ResolveVisitor.transformClosureExpression(ResolveVisitor.java:1040)
          	at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:704)
          	at org.codehaus.groovy.ast.expr.Expression.transformExpressions(Expression.java:51)
          	at org.codehaus.groovy.ast.expr.ArgumentListExpression.transformExpression(ArgumentListExpression.java:69)
          	at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:711)
          	at org.codehaus.groovy.control.ResolveVisitor.transformMethodCallExpression(ResolveVisitor.java:1061)
          	at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:702)
          	at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitExpressionStatement(ClassCodeExpressionTransformer.java:142)
          	at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:42)
          	at org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatement(CodeVisitorSupport.java:37)
          	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatement(ClassCodeVisitorSupport.java:166)
          	at org.codehaus.groovy.control.ResolveVisitor.visitBlockStatement(ResolveVisitor.java:1318)
          	at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:71)
          	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:104)
          	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:115)
          	at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitConstructorOrMethod(ClassCodeExpressionTransformer.java:53)
          	at org.codehaus.groovy.control.ResolveVisitor.visitConstructorOrMethod(ResolveVisitor.java:201)
          	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:126)
          	at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1078)
          	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:53)
          	at org.codehaus.groovy.control.ResolveVisitor.visitClass(ResolveVisitor.java:1261)
          	at org.codehaus.groovy.control.ResolveVisitor.startResolving(ResolveVisitor.java:176)
          	at org.codehaus.groovy.control.CompilationUnit$11.call(CompilationUnit.java:651)
          	at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:931)
          	at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:593)
          	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:542)
          	at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
          	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
          	at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
          	at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
          	at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:67)
          	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:410)
          	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:373)
          	at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:213)
          	at hudson.model.ResourceController.execute(ResourceController.java:98)
          	at hudson.model.Executor.run(Executor.java:404)
          Caused by: java.lang.ClassNotFoundException: org.apache.ivy.core.settings.IvySettings
          	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
          	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
          	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
          	at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:450)
          	at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:403)
          	... 94 more
          Finished: FAILURE
          

          G. Richard Bellamy added a comment - Built and installed the 2.3-SNAPSHOT version from the branch on jglick 's fork of the repo. When the global lib is loaded, before the build begins stepping, I get: Started by user G. Richard Bellamy Replayed #48 Connecting to https: //api.github.com using terradatum-automation/****** (Terradatum Automation GitHub credentials) [BFA] Scanning build for known causes... [BFA] No failure causes found [BFA] Done. 0s GitHub has been notified of this commit’s build result java.lang.NoClassDefFoundError: org/apache/ivy/core/settings/IvySettings at java.lang. Class .getDeclaredMethods0(Native Method) at java.lang. Class .privateGetDeclaredMethods( Class .java:2701) at java.lang. Class .privateGetPublicMethods( Class .java:2902) at java.lang. Class .getMethods( Class .java:1615) at java.beans.Introspector.getPublicDeclaredMethods(Introspector.java:1336) at java.beans.Introspector.getTargetMethodInfo(Introspector.java:1197) at java.beans.Introspector.getBeanInfo(Introspector.java:426) at java.beans.Introspector.getBeanInfo(Introspector.java:173) at groovy.lang.MetaClassImpl$15.run(MetaClassImpl.java:3290) at java.security.AccessController.doPrivileged(Native Method) at groovy.lang.MetaClassImpl.addProperties(MetaClassImpl.java:3288) at groovy.lang.MetaClassImpl.initialize(MetaClassImpl.java:3265) at org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:254) at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:285) at groovy.grape.GrapeIvy.$getStaticMetaClass(GrapeIvy.groovy) at groovy.grape.GrapeIvy.<init>(GrapeIvy.groovy:81) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at java.lang. Class .newInstance( Class .java:442) at groovy.grape.Grape.getInstance(Grape.java:121) at groovy.grape.Grape.grab(Grape.java:159) at groovy.grape.GrabAnnotationTransformation.visit(GrabAnnotationTransformation.java:378) at org.codehaus.groovy.transform.ASTTransformationVisitor$3.call(ASTTransformationVisitor.java:321) at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:931) at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:593) at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:569) at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:546) at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298) at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268) at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:254) at groovy.lang.GroovyClassLoader.recompile(GroovyClassLoader.java:761) at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:718) at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:787) at java.lang. ClassLoader .loadClass( ClassLoader .java:411) at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:677) at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:545) at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:185) at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:170) at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:126) at org.codehaus.groovy.control.ResolveVisitor.resolveToOuter(ResolveVisitor.java:676) at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:308) at org.codehaus.groovy.control.ResolveVisitor.resolveFromModule(ResolveVisitor.java:638) at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:308) at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:276) at org.codehaus.groovy.control.ResolveVisitor.resolveOrFail(ResolveVisitor.java:260) at org.codehaus.groovy.control.ResolveVisitor.resolveOrFail(ResolveVisitor.java:272) at org.codehaus.groovy.control.ResolveVisitor.transformConstructorCallExpression(ResolveVisitor.java:1047) at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:706) at org.codehaus.groovy.control.ResolveVisitor.transformDeclarationExpression(ResolveVisitor.java:1088) at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:698) at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitExpressionStatement(ClassCodeExpressionTransformer.java:142) at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:42) at org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatement(CodeVisitorSupport.java:37) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatement(ClassCodeVisitorSupport.java:166) at org.codehaus.groovy.control.ResolveVisitor.visitBlockStatement(ResolveVisitor.java:1318) at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:71) at org.codehaus.groovy.control.ResolveVisitor.transformClosureExpression(ResolveVisitor.java:1040) at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:704) at org.codehaus.groovy.ast.expr.Expression.transformExpressions(Expression.java:51) at org.codehaus.groovy.ast.expr.ArgumentListExpression.transformExpression(ArgumentListExpression.java:69) at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:711) at org.codehaus.groovy.control.ResolveVisitor.transformMethodCallExpression(ResolveVisitor.java:1061) at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:702) at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitExpressionStatement(ClassCodeExpressionTransformer.java:142) at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:42) at org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatement(CodeVisitorSupport.java:37) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatement(ClassCodeVisitorSupport.java:166) at org.codehaus.groovy.control.ResolveVisitor.visitBlockStatement(ResolveVisitor.java:1318) at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:71) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:104) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:115) at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitConstructorOrMethod(ClassCodeExpressionTransformer.java:53) at org.codehaus.groovy.control.ResolveVisitor.visitConstructorOrMethod(ResolveVisitor.java:201) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:126) at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1078) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:53) at org.codehaus.groovy.control.ResolveVisitor.visitClass(ResolveVisitor.java:1261) at org.codehaus.groovy.control.ResolveVisitor.startResolving(ResolveVisitor.java:176) at org.codehaus.groovy.control.CompilationUnit$11.call(CompilationUnit.java:651) at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:931) at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:593) at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:542) at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298) at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268) at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688) at groovy.lang.GroovyShell.parse(GroovyShell.java:700) at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:67) at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:410) at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:373) at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:213) at hudson.model.ResourceController.execute(ResourceController.java:98) at hudson.model.Executor.run(Executor.java:404) Caused by: java.lang.ClassNotFoundException: org.apache.ivy.core.settings.IvySettings at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang. ClassLoader .loadClass( ClassLoader .java:424) at java.lang. ClassLoader .loadClass( ClassLoader .java:357) at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:450) at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:403) ... 94 more Finished: FAILURE

          Jenkins Core PR#2374 is related?

          G. Richard Bellamy added a comment - Jenkins Core PR#2374 is related?

          Jesse Glick added a comment -

          Yeah, it will not work until core is changed I am afraid.

          Jesse Glick added a comment - Yeah, it will not work until core is changed I am afraid.

          Jesse Glick added a comment -

          Since this code does not permit GrapeIvy to be loaded from an alternate class loader, it can only come from wherever Groovy is defined, which is currently in Jenkins core.

          Jesse Glick added a comment - Since this code does not permit GrapeIvy to be loaded from an alternate class loader, it can only come from wherever Groovy is defined, which is currently in Jenkins core.

          Jesse Glick added a comment -

          I think I found a workaround.

          Jesse Glick added a comment - I think I found a workaround.

          This is working as expected for me here.

          G. Richard Bellamy added a comment - This is working as expected for me here.

          Jesse Glick added a comment -

          Merged. Might wait for JENKINS-31155 to release it though.

          Jesse Glick added a comment - Merged. Might wait for JENKINS-31155 to release it though.

          Code changed in jenkins
          User: Jesse Glick
          Path:
          src/test/java/plugins/WorkflowPluginTest.java
          http://jenkins-ci.org/commit/acceptance-test-harness/5e60b00fd4750fb0dd6c0ec28516f6ee57b88d90
          Log:
          JENKINS-26192 Demonstrating @Grab support in a realistic class loader environment.

          SCM/JIRA link daemon added a comment - Code changed in jenkins User: Jesse Glick Path: src/test/java/plugins/WorkflowPluginTest.java http://jenkins-ci.org/commit/acceptance-test-harness/5e60b00fd4750fb0dd6c0ec28516f6ee57b88d90 Log: JENKINS-26192 Demonstrating @Grab support in a realistic class loader environment.

          Code changed in jenkins
          User: Oliver Gondža
          Path:
          src/test/java/plugins/WorkflowPluginTest.java
          http://jenkins-ci.org/commit/acceptance-test-harness/cf30b67dada2829f67da3a882f711640f018dbb7
          Log:
          Merge pull request #176 from jglick/Grape-JENKINS-26192

          JENKINS-26192 Demonstrating @Grab support in a realistic class loader environment

          Compare: https://github.com/jenkinsci/acceptance-test-harness/compare/6a9c8497af42...cf30b67dada2

          SCM/JIRA link daemon added a comment - Code changed in jenkins User: Oliver Gondža Path: src/test/java/plugins/WorkflowPluginTest.java http://jenkins-ci.org/commit/acceptance-test-harness/cf30b67dada2829f67da3a882f711640f018dbb7 Log: Merge pull request #176 from jglick/Grape- JENKINS-26192 JENKINS-26192 Demonstrating @Grab support in a realistic class loader environment Compare: https://github.com/jenkinsci/acceptance-test-harness/compare/6a9c8497af42...cf30b67dada2

          Code changed in jenkins
          User: Jesse Glick
          Path:
          src/test/java/plugins/WorkflowPluginTest.java
          http://jenkins-ci.org/commit/acceptance-test-harness/0a43987a7dfad296b0521a7e242bcb6e090dc0f1
          Log:
          JENKINS-26192 workflow-cps-global-lib 2.3 was released.
          Amends #176.

          SCM/JIRA link daemon added a comment - Code changed in jenkins User: Jesse Glick Path: src/test/java/plugins/WorkflowPluginTest.java http://jenkins-ci.org/commit/acceptance-test-harness/0a43987a7dfad296b0521a7e242bcb6e090dc0f1 Log: JENKINS-26192 workflow-cps-global-lib 2.3 was released. Amends #176.

            jglick Jesse Glick
            kbaltrinic Kenneth Baltrinic
            Votes:
            7 Vote for this issue
            Watchers:
            13 Start watching this issue

              Created:
              Updated:
              Resolved: