Jenkins管道,如何从脚本执行sh

时间:2018-07-10 08:40:03

标签: git jenkins sh jenkins-pipeline

我需要运行sh来从Jenkins脚本中获取git标签。 sh是:

def tags = sh script: "git ls-remote --tags --refs ssh://git@bitbucket.xxx.git | cut -d'/' -f3", returnStdout: true

但似乎不起作用。不知道为什么Jenkins不会抱怨但branchNames是空的。 遵循我要运行的内容:

ProjectUtils.addProperties([
    [$class: 'ParametersDefinitionProperty', 
        parameterDefinitions: [
            [$class: 'ExtensibleChoiceParameterDefinition',
                name: 'INSTALLER_BRANCH', description: 'The set of installers to be deployed.',
                editable: false,
                choiceListProvider: [$class: 'SystemGroovyChoiceListProvider',
                    scriptText: '''
                        def branchNames = ['master']
                        def tags = sh script: "git ls-remote --tags --refs ssh://git@bitbucket.xxx.git | cut -d'/' -f3", returnStdout: true
                        for (tag in tags) {
                            branchNames.push(tag)
                        }
                        return branchNames
                    ''',
                    usePredefinedVariables: true
                ]
            ]
        ]
    ]
])

我可以提前致电sh,它可以正常工作:

stage ('installer') {
    println  "Checking Installer tags"
    def tags = sh(returnStdout: true, script: "git ls-remote --tags --refs ssh://git@bitbucket.xxx.git | cut -d'/' -f3")
    println  "Installer tags:"
    println  tags

但是我不知道如何将变量tags传递给脚本'''<>'''

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您首先需要将标签作为字符串获取到全局变量中。然后,在choices脚本中,您需要解析该字符串并创建一个数组def tags = '$tags'.split(/\r?\n/)。为了在脚本中引用该变量(管道脚本中的字符串本身),您需要使用双引号。

对于脚本化管道,类似这样的事情应该起作用:

def tags = ""

node {
    stage ('installer') {
        println  "Checking Installer tags"
        tags = sh(returnStdout: true, script: "git ls-remote --tags --refs ssh://git@bitbucket.gameforge.com:7999/gfclient/gfclient-installer.git | cut -d'/' -f3")
        println  "Installer tags:"
        println  tags
    }
}

ProjectUtils.addProperties([
    [$class: 'ParametersDefinitionProperty', 
        parameterDefinitions: [
            [$class: 'ExtensibleChoiceParameterDefinition',
                name: 'INSTALLER_BRANCH', description: 'The set of installers to be deployed.',
                editable: false,
                choiceListProvider: [$class: 'SystemGroovyChoiceListProvider',
                    scriptText: """
                        def branchNames = ['master']
                        def tags = '$tags'.split('\n')
                        for (tag in tags) {
                            branchNames.push(tag)
                        }
                        return branchNames
                    """,
                    usePredefinedVariables: true
                ]
            ]
        ]
    ]
])

或者如果您想在脚本中添加一些常规的糖:

                    scriptText: """
                        def branchNames = ['master']
                        def tags = '$tags'.split('\n')
                        tags.each {tag ->
                            branchNames.push(tag)
                        }
                        branchNames
                    """,

或者,进一步:

                    scriptText: """
                        def branchNames = ['master']
                        def tags = '$tags'.split(/\r?\n/)
                        branchNames.addAll(tags)
                    """,