Jenkinsfile cd命令不生效的问题

问题

今天晚上给前端项目配置Jenkins流水线的时候遇到一个问题:cd 命令不生效,sh 'cd ask_front' 这个语句执行前后 pwd 的输出是一样的。

+ pwd
/home/jingh527/.jenkins/workspace/try-ask_master

去Jenkins机器上看了上面这个目录结构:

try-ask_master
-- ask
-- ask_front

Jenkinsfile的定义:

pipeline {
    agent {
        docker {
            image 'node:10'
            args '-itd -p 9001:8080'
        }
    }
    stages {
        stage ("编译") {
            steps {
                echo "======== 开始编译项目 ========"
                sh "pwd"
                sh "cd ask_front"
                sh "npm uninstall *"
                sh "rm -rf node_modules"
                sh "rm -rf package-lock.json"
                sh "npm cache clean --force"
                sh "npm install"
                echo "======== 项目编译结束 ========"
            }
        }
        stage ("部署") {
            steps {
                echo "======== 开始部署项目 ========"
                sh "pwd"
                sh "npm run dev"
                echo "======== 项目成功部署 ========"
            }
        }
    }
}

在执行到 npm 命令相关的地方就开始报错:

+ npm run dev
npm ERR! code ENOENT
npm ERR! syscall open
npm ERR! path /home/jingh527/.jenkins/workspace/try-ask_master/package.json
npm ERR! errno -2
npm ERR! enoent ENOENT: no such file or directory, open '/home/jingh527/.jenkins/workspace/try-ask_master/package.json'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent 

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/node/.npm/_logs/2021-06-04T17_20_39_229Z-debug.log
script returned exit code 254

解决方案

在网上找了一会儿资料,看到一个帖子:Jenkins基础:Jenkinsfile注意事项:条件跳转与当前路径

cd demo、npm install、npm run build这本是三条命令,强硬地使用&&写在了一起,为什么不能分开使用三个sh ‘’的原因是因为,在具体的实现的时候,显然执行完返回当前目录会恢复为原始状态。这是一个非常容易被忘记的问题。

stage('Build Angular Project') { // build angular demo app
    sh 'cd demo && npm install && npm run build'
}

才反应过来脚本写得有问题,于是改了一下,将多个操作用 && 连接起来,就部署成功了。

pipeline {
    agent {
        docker {
            image 'node:10'
            args '-itd -p 9001:8080'
        }
    }
    stages {
        stage ("编译") {
            steps {
                echo "======== 开始编译项目 ========"
                sh "pwd"
                sh "cd ask_front && npm uninstall * && rm -rf node_modules && rm -rf package-lock.json && npm cache clean --force && npm install"
                echo "======== 项目编译结束 ========"
            }
        }
        stage ("部署") {
            steps {
                echo "======== 开始部署项目 ========"
                sh "cd ask_front && npm run dev"
                echo "======== 项目成功部署 ========"
            }
        }
    }
}