gpt4 book ai didi

node.js - Jenkins : "sh npm i ..."不能在 docker 代理中工作

转载 作者:行者123 更新时间:2023-12-02 18:50:30 26 4
gpt4 key购买 nike

意图

我正在尝试构建一个非常简单的声明式 Jenkinsfile这是基于最新的node docker 形象。我想安装 Node.js 的依赖项应用程序通过调用 sh 'npm install ...'Jenkinsfile .使用 npm 安装来自没有 Jenkins 的 Docker 容器就像一个魅力,但在使用 Jenkins Pipeline 时却不是。

Jenkins 文件

pipeline {
agent {
docker {
image 'node:latest'
}
}
stages {
stage('Install Dependencies') {
steps {
sh 'npm -v' // sanity check
sh 'ls -lart' // debugging filesystem
sh 'npm i axios' // this leads to the error
}
}
}
}

控制台登录 Jenkins
+ npm install axios
npm ERR! code EACCES
npm ERR! syscall mkdir
npm ERR! path /.npm
npm ERR! errno -13
npm ERR!
npm ERR! Your cache folder contains root-owned files, due to a bug in
npm ERR! previous versions of npm which has since been addressed.
npm ERR!
npm ERR! To permanently fix this problem, please run:
npm ERR! sudo chown -R 1962192188:58041779 "/.npm"

我认为它必须对来自 Jenkins 和/或启动 Docker 容器的用户的已安装卷中的权限做一些事情:

我试过的
  • args '-u root'在 Jenkinsfile 的 Docker 代码块中。这可行,但我怀疑这应该如何解决。
    docker {
    image 'node:latest'
    args '-u root'
    }
  • sudo chown -R 1962192188:58041779 "/.npm"如错误消息中所建议的那样。但这会导致:
    + sudo chown -R 1962192188:58041779 /.npm
    /Users/<user>/.jenkins/workspace/pipe@tmp/durable-664f481d/script.sh: 1:
    /Users/<user>/.jenkins/workspace/pipe@tmp/durable-664f481d/script.sh: sudo: not found
  • 定义层RUN npm install axiosDockerfile .这可行,但出于好奇,我想知道为什么我不能直接在 Jenkinsfile 中调用它。
    FROM node:latest

    RUN npm i axios
  • 最佳答案

    解决此问题的最佳方法是使用以下方法之一(受 npm install fails in jenkins pipeline in docker 启发)。这三个最终都将更改 .npm 的默认目录。 (即 npm 的缓存)到当前工作目录(这是映射到 Docker 容器的 Jenkins Job 的工作空间)。
    将 ENV 变量 HOME 设置为当前工作目录
    声明性管道

    pipeline {
    agent { docker { image 'node:latest'' } }
    environment {
    HOME = '.'
    }
    ...
    脚本流水线
    docker.image('node:latest').inside {
    withEnv([
    'HOME=.',
    ])
    ...
    使用附加参数 --cache更改 .npm 的位置调用时的文件夹 npm install
    npm install --cache npm_cache <optional:packagename>
    设置环境变量 npm_config_cache npm 在调用 npm install 之前使用
    声明性管道
    pipeline {
    agent { docker { image 'node:latest'' } }
    environment {
    npm_config_cache = 'npm-cache'
    }
    ...
    脚本流水线
    docker.image('node:latest').inside {
    withEnv([
    'npm_config_cache=npm-cache',
    ])
    ...

    关于node.js - Jenkins : "sh npm i ..."不能在 docker 代理中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62282418/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com