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

jup*_*r22 3 salesforce jenkins jenkins-pipeline

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

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

tool name: 'sfdx', type: 'com.cloudbees.jenkins.plugins.customtools.CustomTool'
Run Code Online (Sandbox Code Playgroud)

我已将其放入舞台定义中:

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')
}
Run Code Online (Sandbox Code Playgroud)

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

我应该使用其他片段吗?

有关信息的完整Jenkinsfile:

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)
        }
}
Run Code Online (Sandbox Code Playgroud)

UPDATE 我使用此示例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"
        }
Run Code Online (Sandbox Code Playgroud)

不幸的是,尽管看起来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
Run Code Online (Sandbox Code Playgroud)

gtg*_*69x 8

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

        withEnv(["PATH+MVN=${tool 'NameOfMavenTool'}/bin"]){
            sh '''
                echo "PATH = ${PATH}"
            '''
        }
Run Code Online (Sandbox Code Playgroud)

这应该给你你需要的东西。请忽略 sh 行上的三重单引号,我实际上加载了几个环境变量,只是从我的代码片段中删除了它们。

希望这可以帮助那些多年来一直在寻找此解决方案的人。我感觉到你的痛苦。通过查看声明性管道脚本的控制台输出(如果您使用 tools{} 节,它将向您展示它如何构建这些环境变量并包装您的后续声明性步骤)和以下链接,将这些拼凑在一起:https://go。 cloudbees.com/docs/cloudbees-documentation/use/automating-projects/jenkinsfile/


Fho*_*lst 5

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

 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>"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

某种程度上PATH,默认情况下不添加工具路径(这是我的1.6 Jenkins服务器安装中的习惯)。${groovy_home}在执行bat命令时添加可以解决该问题。这种调用工具的方法基本上是从脚本化管道语法中借用的。我将其用于所有自定义工具(不仅是Groovy)。

工具部分:

tool name: 'Groovy-2.4.9', type: 'hudson.plugins.groovy.GroovyInstallation'
Run Code Online (Sandbox Code Playgroud)

是由代码片段生成器生成的,就像您所做的一样。

根据Jenkins用户的邮件列表,最终解决方案的工作仍在进行中,因此我的解决方案确实可以解决。