将地图传递到 Jenkins 管道作业

Mar*_*ren 4 groovy jenkins jenkins-job-dsl jenkins-pipeline

我有一个Jenkins Job DSL种子作业,它调用了几个管道作业,例如

pipelineJob("job1") {
    definition {
        cps {
            script(readFileFromWorkspace('job1.groovy'))
        }
        parameters {
            choiceParam('ENV', ['dev', 'prod'], 'Build Environment')
         }
    }
}
pipelineJob("job2") {
    definition {
        cps {
            script(readFileFromWorkspace('job2.groovy'))
        }
        parameters {
            choiceParam('ENV', ['dev', 'prod'], 'Build Environment')
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

job1.groovyjob2.groovy是标准Jenkinsfile样式管道。

我想将一些常见的地图传递给这些工作。这些包含在环境之间可能有所不同的内容,例如目标服务器、凭证名称。

就像是:

def SERVERS_MAP = [
'prod': [
        'prod-server1',
        'prod-server2',
      ],
'dev': [
        'dev-server1',
        'dev-server2',
      ],
]
Run Code Online (Sandbox Code Playgroud)

我可以在种子作业中定义一个映射,然后将其作为管道作业中的映射进行传递和访问吗?

Mar*_*ren 5

我使用pipeline-utility-steps插件想出了一个巧妙的解决方法。

本质上,我将数据映射作为 JSON 传递。

所以我的种子工作可能包含:

def SERVERS_MAP = ''' 
{
  "prod": [
    "prod-server1",
    "prod-server2"
  ],
  "dev": [
    "dev-server1",
    "dev-server2"
  ]
}
'''

pipelineJob("job1") {
    definition {
        cps {
            script(readFileFromWorkspace('job1.groovy'))
        }
        parameters {
            choiceParam('ENV', ['dev', 'prod'], 'Build Environment')
            stringParam('SERVERS_MAP', "${SERVERS_MAP}", "")
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的管道将包含类似的内容:

def serversMap = readJSON text: SERVERS_MAP
def targetServers = serversMap["${ENV}"]
targetServers.each { server ->
   echo server
}
Run Code Online (Sandbox Code Playgroud)

我还可以将这些变量提取到 JSON 文件中并从那里读取它们。

虽然有效,但总感觉有些不对劲。