问题
今天晚上给前端项目配置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 "======== 项目成功部署 ========"
}
}
}
}