-
Bug
-
Resolution: Unresolved
-
Minor
-
Jenkins 2.153, Pipeline 2.6
I'm trying to write a common library building Docker images from Dockerfile. I wrote a reusable global pipeline, where I'm iterating over Dockerfile lines. I tried to use Java 8 Streams, however I ended up with issue potentially related to JENKINS-26307 and JENKINS-42769, which is not related not to Groovy functional features, but Java 8 feature.
An example code used:
def getMissingLabels(Map<String, String> labels) { ['label1', 'label2', 'label3', 'label4'].stream() .filter({ label -> !isLabelDefined(label, labels) }) .collect(Collectors.toList()) }
Whole stream execution results in "false" boolean result, instead of a list. Even complex streams are passing through, but evaluates to "false". When using more complex stream like:
Arrays.stream(splitted) .filter { it.startsWith('LABEL') } .map { it.replaceAll('(LABEL)|"', '') } .map { it.trim() } .map { it.split('=', 2) } .collect(Collectors.toMap( { val -> val[0].toLowerCase() }, { val -> val[1] }))
it enters only first filter expression and does not evaluate the rest.
When replaced functional style code with typical imperative style (for loop) it works.
- relates to
-
JENKINS-26481 Mishandling of binary methods accepting Closure
-
- Resolved
-
I reproduced this with some quick testing. I think this is very similar to
JENKINS-26481, for which I am not familiar with the full fix, but I think it involved rewriting DefaultGroovyMethods directly in groovy-cps, which I guess we can't really do here as this involves Java Platform code rather than groovy code, but I'm not completely sure. CC abayer who worked on the fix forJENKINS-26481and might have a better idea.You might be able to replace this with something equivalent that uses Groovy language features instead of the Stream API as a workaround.