Jenkins声明性管道-从工作区中运行的命令的输出动态填充输入步骤的选项

Jenkins声明性管道-从工作区中运行的命令的输出动态填充输入步骤的选项,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,我想创建一个输入步骤,提示用户选择git标记。为此,我想用git-tag返回的值填充一个下拉框 以下是我目前的管道: pipeline { agent any stages { stage('My Stage') { input { message "Select a git tag" parameters { choice(name:

我想创建一个输入步骤,提示用户选择git标记。为此,我想用
git-tag
返回的值填充一个下拉框

以下是我目前的管道:

pipeline {
    agent any
    stages {
        stage('My Stage') {
            input {
                message "Select a git tag"
                parameters {
                    choice(name: "git_tag", choices: TAGS_HERE, description: "Git tag")
                }
            }
            steps {
                echo "The selected tag is: ${git_tag}"
            }
        }
    }
}
我希望这里的TAGS_是一个变量或方法,它包含由
git TAGS
命令给出的输出

到目前为止,我已经尝试:

  • 在上一步中,将标记设置为环境变量不起作用,因为出于某些原因,这些变量在输入块中不可访问
  • 调用运行命令并返回输出的单独groovy方法不起作用,因为工作区丢失,并且命令都在
    /
    中运行

我已经广泛地搜索了一个解决方案,但我能找到的所有示例都可以通过专门使用脚本化管道步骤或使用不依赖于工作区的命令来避免这两个陷阱。

也许您不在节点中(以旧管道脚本的方式),您可以尝试这样做。可能不需要
脚本

pipeline {
    agent any
    stages {
        stage('My Stage') {
            steps {
                def inputResult = input {
                    message "Select a git tag"
                    parameters {
                        choice(name: "git_tag", choices: getTags(), description: "Git tag")
                    }
                }
                echo "The selected tag is: ${inputResult.git_tag}"
            }
        }
    }
}

getTags应该返回以新行分隔的选项。

也许您不在节点中(以旧的管道脚本方式),您可以尝试这样做。可能不需要
脚本

pipeline {
    agent any
    stages {
        stage('My Stage') {
            steps {
                def inputResult = input {
                    message "Select a git tag"
                    parameters {
                        choice(name: "git_tag", choices: getTags(), description: "Git tag")
                    }
                }
                echo "The selected tag is: ${inputResult.git_tag}"
            }
        }
    }
}

getTags应该返回以新行分隔的选项。

通过改进@hakamairi的答案,您可以执行以下操作:

pipeline {
    agent any
    stages {
        stage('My Stage') {
            steps {
                script {
                    def GIT_TAGS = sh (script: 'git tag -l', returnStdout:true).trim()
                    inputResult = input(
                        message: "Select a git tag",
                        parameters: [choice(name: "git_tag", choices: "${GIT_TAGS}", description: "Git tag")]
                    )
                }
            }
        }
        stage('My other Stage'){
            steps{
                echo "The selected tag is: ${inputResult}"
            }
        }
    }
}

通过改进@hakamairi的答案,您可以执行以下操作:

pipeline {
    agent any
    stages {
        stage('My Stage') {
            steps {
                script {
                    def GIT_TAGS = sh (script: 'git tag -l', returnStdout:true).trim()
                    inputResult = input(
                        message: "Select a git tag",
                        parameters: [choice(name: "git_tag", choices: "${GIT_TAGS}", description: "Git tag")]
                    )
                }
            }
        }
        stage('My other Stage'){
            steps{
                echo "The selected tag is: ${inputResult}"
            }
        }
    }
}

所有这些答案的可能重复似乎是使用脚本化管道(或者使用声明性管道,但将所有内容包装在脚本块中),我希望有一种方法可以实现这一点,同时保持输入步骤的声明性。你是对的,让我还原标志。另外,这都是关于管道参数,而不是输入步骤。所有这些答案的可能重复似乎都是使用脚本管道(或使用声明性管道,但将所有内容包装在脚本块中),我希望有一种方法可以在保持输入步骤声明性的同时实现这一点。您是对的,让我还原标志。另外,这都是关于管道参数,而不是输入步骤。谢谢你的回答,但看看我问题的第二个要点。您可以从parameters块内部调用函数,但是被调用的函数将在pipeline块之外,因此git命令不会在工作区内执行,而是在根目录中执行。我试图通过将工作区作为参数传递给函数来解决这个问题(这样我就可以将cd传递给它,然后运行git命令)但是,我在要点1中遇到了这个问题-参数块中没有可访问的环境变量,因此我甚至无法访问env.WORKSPACE来传递它。您是否尝试过我的代码,包括脚本部分和不包括脚本部分?我更新了我的答案,通常只需将其移动到步骤就可以了,而且它不会设置任何变量,您必须阅读返回值。谢谢您的回答,但请看一下我问题中的第二个要点。您可以从parameters块内部调用函数,但是被调用的函数将在pipeline块之外,因此git命令不会在工作区内执行,而是在根目录中执行。我试图通过将工作区作为参数传递给函数来解决这个问题(这样我就可以将cd传递给它,然后运行git命令)但是,我在要点1中遇到了这个问题-参数块中没有可访问的环境变量,因此我甚至无法访问env.WORKSPACE来传递它。您是否尝试过我的代码,包括脚本部分和不包括脚本部分?我更新了我的答案,通常只需将其移动到步骤就可以了,而且它不会设置任何变量,您必须读取返回值。谢谢,但这仍然要求所有内容都包含在脚本标记中,这不是我理想的要求,但是如果没有其他方法来实现这一点,可能就必须这样做。使用此解决方案,是否可以从其他声明性步骤/阶段访问$inputResult?我记得以前在从脚本步骤中传递变量时遇到过问题。我编辑了我的答案,以便可以从其他步骤和阶段访问
inputResult
。关于所有内容都包含在一个脚本标记中的事实,我认为这是您想要动态填充输入选项的唯一方法。完整声明性管道输入似乎只接受
'Choice1\nChoice2\nChoice3'
['Choice1','Choice2','Choice3']
。谢谢,
inputResult=input(…
是我在另一个阶段尝试访问变量时缺少的关键部分。在脚本块之外使用输入步骤时,选择名称(例如,
git_标记
)成为设置为输入值的变量,我不知道脚本化步骤与此不同。谢谢,但这仍然要求所有内容都包含在脚本标记中,这不是我理想的要求,但如果没有其他方法来实现这一点,则可能必须这样做。此解决方案是$inputResult ACCESS from其他声明性步骤/阶段?我记得以前在将变量从脚本步骤中传递出去时遇到问题。我编辑了我的答案,以便可以从其他步骤和阶段访问
inputResult
。考虑到所有内容都包含在脚本标记中,我认为这是动态填充cho的唯一方法输入的ICE。完整声明性管道输入似乎只接受
'Choice1\nChoice2\nChoice3'
['Choice1','Choice2','Choice3']
。谢谢,
inputResult=input(…
是我在另一个阶段尝试访问变量时缺少的关键部分。在脚本块之外使用输入步骤时,选择名称(例如,
git_标记<