Jenkins管道-从另一个作业生成具有默认输入值的作业

Jenkins管道-从另一个作业生成具有默认输入值的作业,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,我有一个名为pipeline1的Jenkins管道,由以下Jenkins文件描述: node() { def server def action stage("Configuration") { def userInput = input( id: 'userInput', message: 'Let\'s configure this run !', parameters: [ choic

我有一个名为pipeline1的Jenkins管道,由以下Jenkins文件描述:

node()
{
    def server
    def action

    stage("Configuration")
    {
        def userInput = input(
            id: 'userInput', message: 'Let\'s configure this run !', parameters: [
                choice(choices: "server1\nserver2", name: "server", description: "Which server do you want to use ?"),
                choice(choices: "stop\nstart\nrestart", name: "action", description: "What do you want to do ?")
        ]);

        server = userInput.server;
        action = userInput.action;
    }

    stage("Run")
    {
        echo(server)
        echo(action)
    }
}
它要求用户在配置阶段选择一些输入,并在运行阶段响应它们。 我想从另一个作业触发此作业,并自动填充输入以避免人为操作。 我尝试使用与构建参数化作业相同的语法,得出如下结论:

node()
{
    stage("Run")
    {
        build job: 'pipeline1', wait: true, parameters: [
            [$class: 'StringParameterValue', name: 'userInput.server', value: "server1"],
            [$class: 'StringParameterValue', name: 'userInput.action', value: "stop"]
        ]       
    }
}
但它不起作用。它确实会触发pipeline1作业,但会等待用户填写输入

编辑:我希望将输入功能保留在pipeline1中,而不是使用标准参数化作业

你有什么办法来达到这个目的吗


非常感谢。

好的,我有一个完整的答案给你。在pipeline1中使用
属性
,并
if/else
块:

属性([
参数([
选项(名称:“手动”,
描述:“您是否希望使用用户输入?”,
选项:“否\nYes”)
])
])
节点()
{
def服务器
def动作
阶段(“配置”){
如果(params.useIn='Yes'| | params.manually=='Yes'){
def userInput=input(
id:'userInput',消息:'Let's configure this run!',参数:[
选项(选项:“server1\nserver2”,名称:“server”,说明:“您想使用哪台服务器?”),
选项(选项:“停止\n开始\n重新开始”,名称:“操作”,描述:“您想做什么?”)]
);
server=userInput.server;
action=userInput.action;
}否则{
server=params.server
动作=参数动作
}
}
阶段(“运行”)
{
echo(服务器)
回声(行动)
}
}
作业2,变化不大:

node()
{
阶段(“运行”)
{
生成作业:“pipeline1”,等待:true,参数:[
[$class:'StringParameterValue',名称:'useIn',值:“No”],
[$class:'StringParameterValue',名称:'server',值:“server1”],
[$class:'StringParameterValue',名称:'action',值:“start”]
]       
}
}
如果您想运行job2,然后使用
用户输入
,只需将
useIn
更改为
Yes
。因此,此时您可以使用用户输入直接运行pipeline1作业:

[管道]{
[管道]阶段
[管道]{(配置)
[管道]输入
请求的输入
3sky批准
[管道]}
[管道]//阶段
[管道]阶段
[管道]{(运行)
[管道]回声
服务器2
[管道]回声
重新启动
[管道]}
[管道]//阶段
[管道]}
[管道]//节点
[管道]管道末端
完成:成功
或通过job2触发,无需用户输入:

[管道]{
[管道]阶段
[管道]{(配置)
[管道]}
[管道]//阶段
[管道]阶段
[管道]{(运行)
[管道]回声
服务器1
[管道]回声
开始
[管道]}
[管道]//阶段
[管道]}
[管道]//节点
[管道]管道末端
完成:成功

只需删除stage(“配置”),然后使用
params.server
params.action
@3sky我没有明确表示我希望能够手动运行作业并保留动态输入,而不是使用标准的参数化作业。我认为这是一个很好的解决方案,对我来说更好的是,你不需要在第一个管道中“手动”使用参数,然后你也不需要要求你的用户手动触发作业或一个额外的参数来填充。我在这里学到的是,您可以将参数(useIn)传递给未参数化的作业,这非常棒!我只想涵盖所有案例:)