項目一直穩定運行,部署也沒有啥毛病。有一天,構建就出現了以下的錯誤提醒:
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 版本導致無法安裝。下次記錄