Jenkins Pipeline - 如何使用“工具”选项指定自定义工具?

时间:2017-07-27 10:55:11

标签: jenkins salesforce jenkins-pipeline

我通过自定义工具插件在Jenkins中定义了自定义工具。如果我创建了一个自由式项目,Install custom tools选项会在执行期间正确找到并使用该工具(Salesforce DX)。

但是,我找不到通过管道文件执行相同操作的方法。我使用了管道语法片段生成器来获取:

tool name: 'sfdx', type: 'com.cloudbees.jenkins.plugins.customtools.CustomTool'

我把它放到我的舞台定义中:

stage('FetchMetadata') { print 'Collect Prod metadata via SFDX' tool name: 'sfdx', type: 'com.cloudbees.jenkins.plugins.customtools.CustomTool' sh('sfdx force:mdapi:retrieve -r metadata/ -u DevHub -k ./metadata/package.xml') }

但是我收到一条错误消息,指出line 2: sfdx: command not found

还有其他方法我应该使用此代码段吗?

完整的Jenkins文件信息:

node { currentBuild.result = 'SUCCESS'

    try {
        stage('CheckoutRepo') {
            print 'Get the latest code from the MASTER branch'
            checkout scm
        }

        stage('FetchMetadata') {
            print 'Collect Prod metadata via SFDX'
            tool name: 'sfdx', type: 'com.cloudbees.jenkins.plugins.customtools.CustomTool'
            sh('sfdx force:mdapi:retrieve -r metadata/ -u DevHub -k ./metadata/package.xml')
        }

        stage('ConvertMetadata') {
            print 'Unzip retrieved metadata file'
            sh('unzip unpackaged.zip .')
            print 'Convert metadata to SFDX format'
            sh('/usr/local/bin/sfdx force:mdapi:convert -r metadata/unpackaged/ -d force-app/')
        }

        stage('CommitChanges') {
            sh('git add --all')
            print 'Check if any changes need committing'
            sh('if ! git diff-index --quiet HEAD --; then echo "changes found - pushing to repo"; git commit -m "Autocommit from Prod @ $(date +%H:%M:%S\' \'%d/%m/%Y)"; else echo "no changes found"; fi')
            sshagent(['xxx-xxx-xxx-xxx']) {
                sh('git push -u origin master')
            }
        }
    }
    catch (err) {
        currentBuild.result = 'FAILURE'
        print 'Build failed'
        error(err)
    }

}

更新 我使用this example Jenkinsfile取得了一些进展 我的舞台现在看起来像这样: stage('FetchMetadata') { print 'Collect Prod metadata via SFDX' def sfdxLoc = tool 'sfdx' sh script: "cd topLevel; ${sfdxLoc}/sfdx force:mdapi:retrieve -r metadata/ -u DevHub -k ./metadata/package.xml" }

不幸的是,尽管Jenkins现在发现并运行了sfdx工具,但我收到了一个新错误:

TypeError: Cannot read property 'run' of undefined at Object.<anonymous> (/var/lib/jenkins/.cache/sfdx/tmp/heroku-script-509584048:20:4) at Module._compile (module.js:570:32) at Object.Module._extensions..js (module.js:579:10) at Module.load (module.js:487:32) at tryModuleLoad (module.js:446:12) at Function.Module._load (module.js:438:3) at Module.runMain (module.js:604:10) at run (bootstrap_node.js:394:7) at startup (bootstrap_node.js:149:9) at bootstrap_node.js:509:3

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。我得到了解决方法:

 environment {
    GROOVY_HOME = tool name: 'Groovy-2.4.9', type: 'hudson.plugins.groovy.GroovyInstallation'
}
stages {
    stage('Run Groovy') {
        steps {
            bat "${groovy_home}/bin/groovy <script.name>"
        }
    }
}

默认情况下,工具路径不会添加到PATH(按照我的1.6 Jenkins服务器安装上的惯例)。执行bat命令时添加${groovy_home}可以解决这个问题。 这种调用工具的方式基本上来自脚本化管道语法。 我将这个用于所有自定义工具(不仅仅是groovy)。

工具部分:

tool name: 'Groovy-2.4.9', type: 'hudson.plugins.groovy.GroovyInstallation'

是由代码片段生成器生成的。

根据Jenkins users mailing list,最终解决方案的工作仍在进行中,所以我的解决方案确实是一种解决方法。

答案 1 :(得分:1)

这是我第一次对堆栈溢出进行评论,但是几天以来我一直在寻找这个答案,我认为我有一个潜在的解决方案。查看Fholst答案,我想在此基础上进行扩展。我认为该环境节可能适用于声明性语法,但是在脚本化管道上,您必须使用withEnv()等效项,并通过gString传递工具:即$ {tool'nameOfToolDefinedInGlobalTools'}。对于我的特定用例,出于无法控制的原因,我们没有在jenkins主机上安装maven,但是在全局工具配置中定义了一个。这意味着我需要在步骤中执行sh命令之前将mvn添加到路径。我能够做到的是这样:

log4j.logger.org.elasticsearch.client = debug

这应该给您您所需要的。请忽略sh行上的三重单引号,实际上我已加载了几个环境变量,只是将其从代码段中删除了。

希望这对几天来一直在寻找该解决方案的人有所帮助。我感到你很痛苦。通过查看声明性管道脚本的控制台输出(如果您使用工具{}节,将其汇总),将向您展示如何构建这些环境变量并包装后续声明性步骤)和以下链接:https://go.cloudbees.com/docs/cloudbees-documentation/use/automating-projects/jenkinsfile/ < / p>

答案 2 :(得分:0)

如果您使用的是Windows,则可能是因为sfdx安装文件夹的路径而出现问题。 Dreamhouse Jenkinsfile是为linux shell或Mac终端编写的,因此需要进行一些更改才能使其在Windows上运行。

${sfdxLoc}/sfdx

应该是

\"${sfdxLoc}/sfdx\"

这样命令行就可以正确处理任何空格。

https://wipdeveloper.com/2017/06/22/salesforce-dx-jenkins-jenkinsfile/