You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JHipster Jenkins流水线执行npm install遇EACCES权限错误求助

解决JHipster Jenkins流水线中的npm EACCES权限错误

你遇到的是npm缓存目录权限问题,错误日志明确显示容器内的运行用户没有权限写入根目录下的/.npm文件夹。这是因为在Docker容器中运行时,frontend-maven-plugin默认使用的npm缓存路径指向了根目录,而容器内的用户(比如jhipster镜像里的jhipster用户)没有该目录的写入权限。

这里有几个可行的解决方案,按推荐程度排序:

1. 指定npm缓存目录到Jenkins工作目录

在Docker容器启动时,通过环境变量npm_config_cache告诉npm将缓存存储到当前工作目录下的.npm文件夹(该目录属于Jenkins workspace,容器内用户有权限访问)。修改Jenkinsfile中的inside参数:

docker.image('jhipster/jhipster:v6.5.1').inside('-e MAVEN_OPTS="-Duser.home=./" -e npm_config_cache=$(pwd)/.npm') {
    // 后续stage保持不变
}

这样npm会把缓存文件写入到工作目录的.npm文件夹,彻底避开根目录的权限限制。

2. 通过Maven参数指定npm缓存目录

在执行frontend-maven-plugin:npm目标时,直接通过Maven参数指定npm的缓存目录:

stage('npm install') {
    sh "./mvnw -ntp com.github.eirslett:frontend-maven-plugin:npm -Dnpm.cachedir=$(pwd)/.npm"
}

这个方案直接针对Maven插件配置,不需要修改Docker启动参数,同样能让缓存落到有权限的目录下。

3. 确保容器运行用户拥有工作目录权限

如果你希望使用容器内的jhipster用户运行(更安全),可以在inside命令中添加-u jhipster参数,同时确保Jenkins工作目录的权限允许容器内的jhipster用户访问:

docker.image('jhipster/jhipster:v6.5.1').inside('-u jhipster -e MAVEN_OPTS="-Duser.home=./"') {
    // 后续stage保持不变
}

同时需要在Jenkins服务器上给工作目录设置合适的权限:

sudo chown -R jenkins:jenkins /var/lib/jenkins/workspace/jhipprojectmono

错误原因补充

错误日志里提到的Your cache folder contains root-owned files是因为旧版本npm存在bug,会错误地使用根目录作为缓存路径,而当前容器用户没有权限写入该路径。通过指定缓存到工作目录就能彻底解决这个问题。

内容的提问来源于stack exchange,提问作者ajoy sinha

火山引擎 最新活动