Currying groovy CPS encerramento para execução paralela
Fazemos alguma criação dinâmica de etapas paralelas em alguns de nossos trabalhos. Graças aesta discussão Eu descobri como criar dinamicamente o mapa com parâmetros para uso na etapa paralela.
No entanto, agora eu queria reutilizar partes do código que é usado para criar essas etapas paralelas. Por isso, sinto que precisaria curry os fechamentos.
No entanto, o curry parece não funcionar corretamente. Fazer referência à variável de loop (valueCopy) dentro do fechamento faz a coisa certa (como mencionado aqui), mas o curry não faz o que eu esperava.
Estou fazendo algo errado, isso ainda não é suportado? Existem soluções alternativas? Provavelmente isso é um bug no pipeline de Jenkins?
Espero que alguém tenha uma idéia de por que isso não funciona e / ou como fazê-lo funcionar.
Jenkins: LTS (2.32.1) e atualizações mais recentes de plug-ins a partir de 19/01/2017.
Solução:Após a atualização para o Pipeline: Groovy plugin versão 2.40, tudo está funcionando conforme o esperado agora.
Script de pipeline executado:
def echoSome(val) {
echo val
}
def buildClosures() {
def someList = ["1", "2", "3"]
def closures = [:]
for (value in someList) {
final valueCopy = value
closures[value] = {val ->
echo valueCopy.toString()
echo val.toString()
}.curry(value)
}
closures
}
parallel buildClosures()
Resultado:
[Pipeline] parallel
[Pipeline] [1] { (Branch: 1)
[Pipeline] [2] { (Branch: 2)
[Pipeline] [3] { (Branch: 3)
[Pipeline] [1] echo
[1] 1
[Pipeline] [1] echo
[1] 3
[Pipeline] [1] }
[Pipeline] [2] echo
[2] 2
[Pipeline] [2] echo
[2] 3
[Pipeline] [2] }
[Pipeline] [3] echo
[3] 3
[Pipeline] [3] echo
[3] 3
[Pipeline] [3] }
[Pipeline] // parallel
[Pipeline] End of Pipeline
Finished: SUCCESS
Saída esperada:
[Pipeline] parallel
[Pipeline] [1] { (Branch: 1)
[Pipeline] [2] { (Branch: 2)
[Pipeline] [3] { (Branch: 3)
[Pipeline] [1] echo
[1] 1
[Pipeline] [1] echo
[1] 1
[Pipeline] [1] }
[Pipeline] [2] echo
[2] 2
[Pipeline] [2] echo
[2] 2
[Pipeline] [2] }
[Pipeline] [3] echo
[3] 3
[Pipeline] [3] echo
[3] 3
[Pipeline] [3] }
[Pipeline] // parallel
[Pipeline] End of Pipeline
Finished: SUCCESS