Shell 如何让Jenkins 2.0在与签出相同的目录中执行sh命令?

Shell 如何让Jenkins 2.0在与签出相同的目录中执行sh命令?,shell,jenkins,groovy,jenkins-pipeline,Shell,Jenkins,Groovy,Jenkins Pipeline,这是我的Jenkins 2.x管道: node ('master'){ stage 'Checkout' checkout scm stage "Build Pex" sh('build.sh') } 当我运行此管道时,签出会按预期将代码放入工作区,但是它不会期望在工作区中找到脚本/(它确实在那里!),而是在一个不相关的目录中查找:workspace@tmp/耐用-d812f509 Entering stage Build Pex Proceeding [Pip

这是我的Jenkins 2.x管道:

node ('master'){
    stage 'Checkout'
    checkout scm
    stage "Build Pex"
    sh('build.sh')
}
当我运行此管道时,签出会按预期将代码放入工作区,但是它不会期望在工作区中找到脚本/(它确实在那里!),而是在一个不相关的目录中查找:workspace@tmp/耐用-d812f509

Entering stage Build Pex
Proceeding
[Pipeline] sh
[workspace] Running shell script
+ build.sh
/home/conmonsysdev/deployments/jenkins_ci_2016_interns/jenkins_home/jobs/pex/branches/master/workspace@tmp/durable-d812f509/script.sh: line 2: build.sh: command not found

如何修改此Jenkins文件,使build.sh在与我签出项目源代码的目录完全相同的目录中执行?

您可以将您的操作包含在
dir
块中

checkout scm
stage "Build Pex"
dir ('<your new directory>') { 
    sh('./build.sh')
}
... or ..
checkout scm
stage "Build Pex"
sh(""" <path to your new directory>/build.sh""")

...
检查scm
阶段“构建Pex”
目录(“”){
sh(“./build.sh”)
}
... 或
校验scm
阶段“构建Pex”
sh(“/build.sh”)
...

是实际目录的占位符。默认情况下,它是工作区的相对路径。如果您确定代理上存在绝对路径,则可以定义绝对路径。

我遇到了同样的问题,而dir没有帮助,这可能是因为我在tmp dir本身的子目录中工作(此处的原因并不密切)。我的代码如下所示

dir(srcDir){
  sh 'pwd; la -l; jenkins.sh "build.sh"'
}
(添加
pwd
la-l
语句只是为了调试。没有它们就存在问题。)通过它们,我得到如下输出:

+ pwd
/jenkins/workspace/aws-perf-test@tmp/repos/2
+ ls -l
total 72
-rw-r--r-- 1 jenkins jenkins   394 May 19 12:20 README.md
drwxr-xr-x 3 jenkins jenkins  4096 May 19 12:20 api-automation
-rwxr-xr-x 1 jenkins jenkins   174 May 19 12:20 build-it.sh
-rwxr-xr-x 1 jenkins jenkins   433 May 19 12:20 build-release.sh
-rwxr-xr-x 1 jenkins jenkins   322 May 19 12:20 build.sh
drwxr-xr-x 3 jenkins jenkins  4096 May 19 12:20 ix-core
drwxr-xr-x 3 jenkins jenkins  4096 May 19 12:20 ix-java-client
drwxr-xr-x 3 jenkins jenkins  4096 May 19 12:20 ix-rest-models
drwxr-xr-x 4 jenkins jenkins  4096 May 19 12:20 ix-service
drwxr-xr-x 7 jenkins jenkins  4096 May 19 12:20 ixternal
drwxr-xr-x 5 jenkins jenkins  4096 May 19 12:20 ixtraneous-stuff
-rwxr-xr-x 1 jenkins jenkins   472 May 19 12:20 jenkins.sh
-rw-r--r-- 1 jenkins jenkins 16847 May 19 12:20 pom.xml
+ jenkins.sh build.sh
/home/jenkins/workspace/aws-perf-test@tmp/repos/2@tmp/durable-a3ec0501/script.sh: line 2: jenkins.sh: command not found
我最终做到了:

dir(srcDir){
  sh 'cdr=$(pwd); $cdr/jenkins.sh "build.sh"'
}

脚本无法工作的原因是
build.sh
不在您的路径中

Jenkinsfile
正在运行一个“sh”脚本,其全部内容是字符串
build.sh
。父脚本位于“@tmp”目录中,并且将始终在那里-“@tmp”目录是Jenkins在运行期间保存Jenkins文件的地方


要解决此问题,请将行更改为
sh./build.sh“
sh”bash build.sh“
,以便Jenkins文件中的
sh
块可以正确定位要执行的
build.sh
脚本。

// Permission to execute
sh "chmod +x -R ${env.WORKSPACE}/../${env.JOB_NAME}@script"

// Call SH
sh "${env.WORKSPACE}/../${env.JOB_NAME}@script/script.sh"
stage('Run Script'){
    steps {
        script {
            sh('cd relativePathToFolder && chmod +x superscript.sh && ./superscript.sh parameter1 paraeter2')
        }
    }
}
/var/lib/jenkins/workspace/作业名称@script

如果您在linux环境中,则必须将该文件设置为可执行文件,然后调用shell脚本

大概是这样的:

// Permission to execute
sh "chmod +x -R ${env.WORKSPACE}/../${env.JOB_NAME}@script"

// Call SH
sh "${env.WORKSPACE}/../${env.JOB_NAME}@script/script.sh"
stage('Run Script'){
    steps {
        script {
            sh('cd relativePathToFolder && chmod +x superscript.sh && ./superscript.sh parameter1 paraeter2')
        }
    }
}

我汇编了上面所有的答案,对我来说是这样的:

// Permission to execute
sh "chmod +x -R ${env.WORKSPACE}/../${env.JOB_NAME}@script"

// Call SH
sh "${env.WORKSPACE}/../${env.JOB_NAME}@script/script.sh"
stage('Run Script'){
    steps {
        script {
            sh('cd relativePathToFolder && chmod +x superscript.sh && ./superscript.sh parameter1 paraeter2')
        }
    }
}

多亏了@Rafael Manzoni@Keith Mitchell和@Jayan

,我才能够用Rafael Manzoni反应的简化衍生物来执行脚本。我对整个“工作”感到好奇_NAME@script发现这是不必要的,至少对于使用我们版本的Jenkins的声明式。只需在工作区上设置访问权限。没必要再深入了

stage('My Stage') {
    steps {
        sh "chmod +x -R ${env.WORKSPACE}"
        sh "./my-script.sh"
    }
}

那真的是你的全部管道?或者你有多个
节点
块吗?现在,这就是一切。这是演示这个错误的最小管道。“你的新目录”代表什么?它是一个占位符吗?对我不起作用:-(我必须把shellscript放在哪里?现在它在我的git repo的根目录中。我试图将它移动到一个子目录“buildscripts”,然后使用
dir('buildscripts'){}
,但没有运气我遇到的问题与操作发现的目录不总是起作用一样,sh“cd path&&${cmd}”应该可以工作。这个答案不能回答这个问题,除非您创建一个新的子目录,否则它不会工作。问题是如何从项目(根目录)的workdir运行脚本。对我来说,当您有子目录时它可以工作,但当我试图从项目根目录运行脚本时它不工作。