Jenkins 2 NPM_TOKEN 凭据

7

我正在尝试运行Jenkins 2流水线(Jenkinsfile),使用npm publish将软件包发布到本地NPM存储库。


为了实现这一目的,我尝试在Jenkinsfile中使用以下阶段:

stage('TEST npm whoami') {
    withEnv(["PATH+NPM=${tool name: 'node-6', type: 'jenkins.plugins.nodejs.tools.NodeJSInstallation'}/bin"]) {
    withCredentials([[$class: 'StringBinding', credentialsId: 'npm-token', variable: 'NPM_TOKEN']]) {
        sh """
           npm whoami
           """
    }
    }
}

目前我只运行npm whoami,一旦它能正常工作,我将用npm publish替换它。

这是我得到的输出:

+ npm whoami
npm ERR! Linux 4.7.5-1.el7.elrepo.x86_64
npm ERR! argv "/var/lib/jenkins/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/node-6/bin/node" "/var/lib/jenkins/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/node-6/bin/npm" "whoami"
npm ERR! node v6.5.0
npm ERR! npm  v3.10.3
npm ERR! code ENEEDAUTH

npm ERR! need auth this command requires you to be logged in.
npm ERR! need auth You need to authorize this machine using `npm adduser`

只是为了验证,credentialsId通常是一个guid。你在这里放'npm-token'是出于什么想法?如果你只是echo $NPM_TOKEN会发生什么? - Rik
3个回答

7
根据这个GitHub问题,似乎NPM_TOKEN并不是npm本身识别的内容,而是heroku(以及其他平台)解释的自定义环境变量。
根据该问题中的一些讨论,我根据凭证中的令牌环境变量,在作业执行时创建了一个基于项目级别的.npmrc文件,然后在继续之前再将其删除。例如:
stage('TEST npm whoami') {
    withCredentials([string(
                credentialsId: 'npm-token',
                variable: 'NPM_TOKEN')]) {
        sh "echo //npm.skunkhenry.com/:_authToken=${env.NPM_TOKEN} > .npmrc"
        sh 'npm whoami'
        sh 'rm .npmrc'
    }
}

希望这可以帮助!

稍微调整一下 - 将 .npmrc 写入构建服务器的 $HOME 目录,并在 try-catch 块中包装,以确保每次运行时都会删除该文件: withCredentials([string(credentialsId: 'NPM_TOKEN', variable: 'NPM_TOKEN')]) { String text = "//registry.npmjs.org/:_authToken=${env.NPM_TOKEN}" String npmrc = '\$HOME/.npmrc' writeFile file: npmrc, text: text try { sh 'npm publish' } finally { sh "rm ${npmrc}" } } - Gaston

3
杰拉德·瑞恩和加斯顿的答案是正确的,我只想补充一个细节,一开始我没有注意到:
如果您想使用私有存储库,则.npmrc还应指定注册表:
withCredentials([string(credentialsId: 'registry', variable: 'token')]) {
            try {
                sh "echo registry=<your-registry-URL> >> .npmrc"
                sh "echo //<your-registry-URL>/:_authToken=${env.token} >> .npmrc"
                sh 'npm whoami'
            } finally {
                sh 'rm ~/.npmrc'
            }
}

显然,并非所有版本的Jenkins都能接受此形式中的try { ... } finally { ... }在第194行,第17列期望一个步骤。 try { - Jesse Chisholm
try...finally 块仅适用于 Scripted Pipeline。使用 Declarative Pipeline 会出现以下错误: WorkflowScript: 115: Expected a step @ line 115, column 13要解决这个问题,您应该将其包装在 script 中,例如:script { try {withCredentials(){...}} finally {}} - amost
请注意,在上面的响应中,.npmrc 是在当前目录中创建的,而删除命令尝试从用户的“home”文件夹中删除它。 - amost

1
我们可以使用 pipeline npm 插件 和配置管道。
withNPM(npmrcConfig: 'my-custom-nprc') {
    sh 'npm install'
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接