首页 文章

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

提问于
浏览
31

这是我的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?

4 回答

  • 32

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

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

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

  • 1

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

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

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

  • 13

    我有同样的问题,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"'
    }
    
  • 0

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

    / var / lib / jenkins / workspace / job-name @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"
    

相关问题