当前位置: 首页 > 知识库问答 >
问题:

将地图传递给詹金斯管道作业

魏襦宗
2023-03-14

我有一个 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',
      ],
]

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

共有2个答案

杜成和
2023-03-14

您可以使用字符串参数传递 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)
        }
    }
}

}

申屠昌胤
2023-03-14

我想出了一个使用管道实用程序步骤插件的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 文件中并从那里读取它们。

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

 类似资料:
  • 问题内容: 当前,我有一个具有不同参数的管道作业,其中此参数之一是Choice参数。这是该作业参数的config.xml输出: 现在,我可以通过传递字符串参数从管道调用此作业: 但是我无法为选择参数定义参数: 我尝试了以下方法: 但这失败并显示以下错误: 因此问题是:如何在调用其他管道作业时定义选择参数: 有人有这样的例子吗? 问题答案: 我看过一个使用以下语法的工作示例: 基本上,不要以特殊的方

  • 我试图从流水线步骤中运行一个job-dsl脚本。一般来说,这应该是可能的,正如这里所描述的,在管道步骤中添加了以下代码片段: null 我如何知道脚本的真实位置,以及如何指定一个jobDsl作为目标,它本身位于不同的repo中?还是我完全走错了方向? 编辑 经过进一步的研究,共享库存储库被签出到“真实”工作区旁边的一个目录中,后缀为@libs,这似乎是事实。所以我认为使用以下方法是个好主意: 与此

  • 问题内容: 我有一个运行Jenkins的节点,该节点使用Maven构建代码。Jenkins作业是声明性管道脚本。Maven需要从需要证书才能访问的私有存储库中下载依赖项。凭证存储在Jenkins凭证管理器中。 我如何将这些凭据传递给Maven,以便Maven可以使用这些凭据从私有存储库正确下载依赖项。 问题答案: 通过将Jenkins凭证注入您的环境,然后将这些凭证传递给Maven,您可以使用Je

  • 问题内容: 已解决 :感谢S.Richmond的以下答复我需要取消所有类型的存储映射,这意味着将变量和使用后作废。 附加 :搜索此错误的人员可能有兴趣使用Jenkins管道步骤- 在此处查找更多信息。 我正在尝试使用Jenkins Pipeline从用户那里获取输入,该输入作为json字符串传递给作业。管道然后使用隔离器对此进行解析,然后选择重要信息。然后,它将使用该信息与不同的作业参数并行运行1

  • 下面是我简单的jenkins pipeline groovy脚本,它将用这两个阶段和我们想要构建的作业创建一个管道,我希望在job configuration下的脚本中每次都更新用于构建和代码分析的作业名,方法是从用户界面中获取数据,用户将使用Eclipse提供构建作业名和代码分析作业名- jenkinsfile脚本:-

  • 问题内容: 运行带有包含多个节点的阶段的Jenkins管道(基于Groovy),我需要将列表从stageA上NodeA上的某个文件传递到StageB上的nodeB。 在stageA NodeA中,我运行 在stageB,我跑步 到目前为止,我已经在控制台中获得了输出。 现在如何将其输出传递到文件? 不能解决问题:-( 我敢肯定这没什么大不了的,但是我已经花了几个小时来搅动互联网,但无济于事。 问题