将地图传递到Jenkins管道作业

时间:2018-06-08 11:01:05

标签: jenkins groovy jenkins-pipeline jenkins-job-dsl

我有一个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')
         }
    }
}

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

我想将几张常见的地图传递给这些工作。这些包含可能因环境而异的内容,例如目标服务器,凭证名称。

类似的东西:

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

我可以在种子作业中定义一个地图,然后我可以在管道作业中作为地图传递和访问吗?

1 个答案:

答案 0 :(得分:1)

我使用pipeline-utility-steps插件提出了 hacky 解决方法。

基本上我将数据映射作为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}", "")
         }
    }
}

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

def serversMap = readJSON text: SERVERS_MAP
def targetServers = serversMap["${ENV}"]
targetServers.each { server ->
   echo server
}

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

虽然它有效但在某种程度上感觉不对。