项目一直稳定运行,部署也没有啥毛病。有一天,构建就出现了以下的错误提醒:
internal/fs/utils.js:308 throw err; ^ Error: EACCES: permission denied, open '/data/jenkins/workspace/ifarm_cloudpc_front_testing/node_modules/vue-demi/lib/index.cjs.js' at Object.openSync (fs.js:476:3) at Object.writeFileSync (fs.js:1467:35) at copy (/data/jenkins/workspace/ifarm_cloudpc_front_testing/node_modules/vue-demi/scripts/utils.js:20:6) at switchVersion (/data/jenkins/workspace/ifarm_cloudpc_front_testing/node_modules/vue-demi/scripts/utils.js:48:3) at Object.<anonymous> (/data/jenkins/workspace/ifarm_cloudpc_front_testing/node_modules/vue-demi/scripts/postinstall.js:9:3) at Module._compile (internal/modules/cjs/loader.js:1063:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10) at Module.load (internal/modules/cjs/loader.js:928:32) at Function.Module._load (internal/modules/cjs/loader.js:769:14) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12) { errno: -13, syscall: 'open', code: 'EACCES', path: '/data/jenkins/workspace/ifarm_cloudpc_front_testing/node_modules/vue-demi/lib/index.cjs.js' }
很显然,部署失败了。
如何解决呢?
1. 看错误:
Error: EACCES: permission denied, open '/data/jenkins/workspace/ifarm_cloudpc_front_testing/node_modules/vue-demi/lib/index.cjs.js'
翻译成白话文是: 打开 xxx路径的文件 的时候发现,没有权限,被拒绝掉了。
知道这个就好解决了。
方法1: 当前jenkins登陆用户 直接作为 root 身份 来运行: 我是最高权限,不管权限不权限的,都管不住我。
虽然不优雅,但是可以解决问题的方法就是好方法。
npm install --unsafe-perm=true --allow-root
就是说 npm 出于安全考虑不支持以 root 用户运行,即使你用 root 用户身份运行了,npm 会自动转成一个叫 nobody 的用户来运行,而这个用户几乎没有任何权限。这样的话如果你脚本里有一些需要权限的操作,比如写文件(尤其是写 /root/.node-gyp),就会崩掉了。
为了避免这种情况,要么按照 npm 的规矩来,专门建一个用于运行 npm 的高权限用户;要么加 --unsafe-perm 参数,这样就不会切换到 nobody 上,运行时是哪个用户就是哪个用户,即使是 root。
参考: https://segmentfault.com/q/1010000019365121
方法2: 赋予权限
chown -R /data/jenkins // 赋予权限。本次是 / data/jekins 无权限,可根据情况赋予权限。 npm install npm run build:test // 测试环境的打包命令。根据项目来写。
这样,赋予权限后,install 就没问题了。
而且,一次执行,后期都不用再执行赋予权限的命令都没问题。这个比上个优雅点哈。。。。
2. 思考:
与运维沟通,他反馈: 正常情况下 install 的时候用的就是root,所以jenkins是有root权限的。那怎么会出现上面的权限问题呢?
经过了解: 如果 运维修改了文件的位置,或者改了权限,则需要给jenkins 的用户重新赋予权限。
最近jenkins部署的问题遇到好几个。还有一个是因为node 版本导致无法安装。下次记录