如何让Jenkins 2.0在结帐的同一目录中执行sh命令?

时间:2016-07-01 10:48:26

标签: shell jenkins groovy jenkins-pipeline

这是我的Jenkins 2.x管道:

node ('master'){
    stage 'Checkout'
    checkout scm
    stage "Build Pex"
    sh('build.sh')
}

当我运行这个管道时,checkout会按预期将代码放入工作区,但不是期望在workspace /(它确实存在!)中找到脚本,而是查找一个不相关的目录:workspace @ tmp / durable -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?

6 个答案:

答案 0 :(得分:32)

您可以将您的操作括在dir区块中。

checkout scm
stage "Build Pex"
dir ('your new directory') { 
    sh('build.sh')
}
...

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

答案 1 :(得分:13)

您的脚本不起作用的原因是因为“build.sh”不在您的PATH中。

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

要解决此问题,请将您的行更改为sh "./build.sh"sh "bash build.sh",以便Jenkins文件中的sh块可以正确找到您想要的build.sh脚本执行。

答案 2 :(得分:2)

我遇到了同样的问题,而且dir没有帮助,可能是因为我在tmp dir本身的子目录中工作(因为这里没有密切关系)。我的代码看起来像这样

dir(srcDir){
  sh 'pwd; la -l; jenkins.sh "build.sh"'
}

pwdla -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"'
}

答案 3 :(得分:0)

Jenkins在从项目中克隆时会创建一个文件夹,如下所示:

的/ var / lib中/詹金斯/工作区/的作业名称 @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"

答案 4 :(得分:0)

我整理了以上所有答案,对我来说,它的工作方式如下:

stage('Run Script'){
        steps {
                script {
                        sh('cd relativePathToFolder && chmod +x superscript.sh && ./superscript.sh parameter1 paraeter2')
                    }
                }
}

感谢@Rafael Manzoni @Keith Mitchell和@Jayan

答案 5 :(得分:0)

我能够使用Rafael Manzoni的响应的简化派生来执行脚本。我对整个“ JOB_NAME @ script”一事感到疑惑,并发现这是不必要的,至少对于使用我们的Jenkins版本进行声明式的而言。只需在工作区上设置访问权限。无需再深入研究了。

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