在 Jenkins Pipelines 中列出就地排序

List in place sorting in Jenkins Pipelines

我正在尝试对 Jenkins 管道中的对象列表进行排序。我在以下本地或 Jenkins 中运行代码得到了不同的结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
pipeline {
    agent any
    stages {
        stage('default'){
            steps {
                script {
                   @NonCPS
                   def nonCpsTest = {
                        def list = [
                            ['CreationDate': '200'],
                            ['CreationDate': '300'],
                            ['CreationDate': '100'],
                       ]

                       def rval = list.sort { it['CreationDate'] }

                       echo"Rval=$rval"
                       echo"List=$list"  
                   }
                   nonCpsTest()
                }
            }
        }
    }
}

当我使用 groovy shell (groovysh) 在本地执行这个脚本时,结果是

1
2
3
4
5
6
7
8
groovy:000> list = [[ 'CreationDate':200 ], [ 'CreationDate':300 ], [ 'CreationDate':100 ]]
===> [[CreationDate:200], [CreationDate:300], [CreationDate:100]]
groovy:000>  rval = list.sort { it['CreationDate'] }
===> [[CreationDate:100], [CreationDate:200], [CreationDate:300]]
groovy:000> list
===> [[CreationDate:100], [CreationDate:200], [CreationDate:300]]
groovy:000> list == rval
===> true

在 Jenkins 服务器上我正在关注

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Pipeline] {
[Pipeline] stage
[Pipeline] { (default)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
Rval=300
[Pipeline] echo
List=[[CreationDate:200], [CreationDate:300], [CreationDate:100]]
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline

Jenkins 工作流是否使列表不可变,或者覆盖 sort 方法,如果是,如何在 Jenkins 管道代码中进行就地列表排序?


您将 nonCpsTest 声明为变量并且它引用闭包的问题,??因此 @NonCPS 在这种情况下不起作用

以下变体可以正常工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@NonCPS
def nonCpsTest() {
    def list = [
        ['CreationDate': '200'],
        ['CreationDate': '300'],
        ['CreationDate': '100'],
    ]
    def rval = list.sort{ it['CreationDate'] }
    echo"Rval=$rval"
    echo"List=$list"  
}

node{
   nonCpsTest()
}