首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jenkins管道--如何使用“tool”选项来指定自定义工具?

Jenkins管道--如何使用“tool”选项来指定自定义工具?
EN

Stack Overflow用户
提问于 2017-07-27 10:55:11
回答 3查看 30K关注 0票数 12

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

但是,我无法通过管道文件找到同样的方法。我使用了管道语法片段生成器来获得:

代码语言:javascript
复制
tool name: 'sfdx', type: 'com.cloudbees.jenkins.plugins.customtools.CustomTool'

我已经把它写进了我的舞台定义:

代码语言:javascript
复制
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

还有别的方法我应该用这个片段吗?

完整的Jenkinsfile获取信息:

代码语言:javascript
复制
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)
        }
}

更新我已经在使用这个示例Jenkinsfile方面取得了一些进展,我的阶段现在看起来如下所示:

代码语言:javascript
复制
        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工具,但我得到了一个新的错误:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-06 14:40:47

我也遇到了同样的问题。我找到了解决办法:

代码语言:javascript
复制
 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.6Jenkins服务器安装时所遵循的那样)。在执行bat命令时添加${groovy_home}为我修复了这个问题。这种调用工具的方式基本上是从脚本化的管道语法中借出的。我将此用于我的所有自定义工具(不仅仅是groovy)。

工具部分:

代码语言:javascript
复制
tool name: 'Groovy-2.4.9', type: 'hudson.plugins.groovy.GroovyInstallation'

像你一样由代码段生成器生成。

根据Jenkins用户邮件列表的说法,最终解决方案的工作仍在进行中,所以我的解决方案确实是一项工作。

票数 11
EN

Stack Overflow用户

发布于 2019-01-11 15:03:12

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

代码语言:javascript
复制
        withEnv(["PATH+MVN=${tool 'NameOfMavenTool'}/bin"]){
            sh '''
                echo "PATH = ${PATH}"
            '''
        }

这应该能满足你的需要。请忽略sh行上的三重单引号,实际上加载了几个环境变量,并将它们从代码片段中删除。

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

票数 8
EN

Stack Overflow用户

发布于 2017-10-06 05:30:01

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

代码语言:javascript
复制
${sfdxLoc}/sfdx

应该是

代码语言:javascript
复制
\"${sfdxLoc}/sfdx\"

以便命令行正确处理任何空格。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45348761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档