Jenkins 流水线中使用 cd 切换目录无效问题

3,044 阅读1分钟
stages {
    stage ("Deploy") {
        sh "pwd" // 显示 Jenkins 工作目录
        sh "cd /home/centos/" // 本意是切换到指定目录
        sh "pwd" // 但是再次输出还是 Jenkins 工作目录
        sh "./test.sh" // 执行命令也还是在 Jenkins 工作目录
    }
}

查了一下,大多数答案都是说一些权限问题,或者确保路径是否正确、语法是否正确问题,但是还存在一个问题对新手可能会有些误导(我就是)

在 Jenkins 中执行 shell 脚本(使用 sh 命令)时,每个 shell 命令都是在一个单独的 shell 进程中运行的。因此,如果你在一个 sh 命令中使用 cd 命令来切换工作目录,这只会在该 shell 进程中生效,而不会影响 Jenkins 构建执行的目录。

解决这个问题的方法是将多个 shell 命令放入一个单独的 shell 脚本文件中,并在该脚本中使用 cd 命令来切换目录。然后,使用 sh 命令来执行该脚本。这将确保所有 shell 命令都在同一个 shell 进程中执行,并且 cd 命令将影响整个脚本的工作目录

所以 Jenkins 脚本可以改为

stages {
    stage ("Deploy") {
        sh "cd /home/centos/ && pwd && comand1 && command2" // 用 && 把所有命令连续执行
        sh "cd /home/centos && ./test.sh" // 或者切换目录后其他命令放在一个单独脚本进行执行
    }
}