【问题标题】:Passing maps into Jenkins pipeline jobs将地图传递到 Jenkins 管道作业中
【发布时间】:2018-06-08 11:01:05
【问题描述】:

我有一个 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.groovyjob2.groovy 是标准的 Jenkinsfile 样式管道。

我想将一些常见的地图传递给这些工作。这些包含可能因环境而异的东西,例如目标服务器、凭据名称。

类似:

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

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

【问题讨论】:

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


    【解决方案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 文件中并从那里读取它们。

    虽然有效,但不知何故感觉不对。

    【讨论】:

      【解决方案2】:

      您可以使用字符串参数传递 Map val,下游读取为 json 格式。

      上游管道

      timestamps{
      node("sse_lab_CI_076"){ //${execNode}
          currentBuild.description="${env.NODE_NAME};"
      
          stage("-- regression execute --"){
              def test_map = 
              """
                  {
                      "gerrit_patchset_commit": "aad5fce",
                      "build_cpu_x86_ubuntu":     [
                          "centos_compatible_build_test",
                          "gdb_compatible_build_test",
                          "visual_profiler_compatible_build_test"
                      ],
                  }
              """
              build(job: 'tops_regression_down',
                  parameters: [string(name: 'UPSTREAM_JOB_NAME',
                                      value: "${env.JOB_BASE_NAME}"),
                              string(name: 'UPSTREAM_BUILD_NUM',
                                      value: "${env.BUILD_NUMBER}"),
                              string(name: 'MAP_PARAM',
                                      value: "${test_map}"),
                              ],
                  propagate: true,
                  wait: true)
          }
      }
      

      }

      下游管道

      timestamps{
      node("sse_lab_inspur_076"){ //${execNode}
          currentBuild.description="${env.NODE_NAME};"
          stage('--in precondition--'){
              dir('./'){
                  cleanWs()
                  println("hello world")
                  println("${env.MAP_PARAM}")
                  Map result_json = readJSON(text: "${env.MAP_PARAM}")
                  println(result_json)
              }
          }
      }
      

      }

      【讨论】:

        猜你喜欢
        • 2020-12-05
        • 1970-01-01
        • 1970-01-01
        • 2019-12-19
        • 1970-01-01
        • 1970-01-01
        • 2020-12-22
        • 1970-01-01
        • 2018-01-07
        相关资源
        最近更新 更多