我为基于node.js的应用程序构建Docker镜像,其中一些依赖项需要私有NPM注册表的NPM令牌,但在构建映像时,包含令牌的变量为null,例如< / p>
docker build -t 3273e0bfe8dd329a96070382c1c554454ca91f96 --build-args NPM_TOKEN=null -f Dockerfile
简化的管道是:
pipeline {
environment {
NPM_TOKEN = credentials('npm-token')
}
agent {
dockerfile {
additionalBuildArgs "--build-args NPM_TOKEN=${env.NPM_TOKEN}"
}
}
stages {
stage('Lint') {
steps {
sh 'npm run lint'
}
}
}
}
有没有办法在该部分使用env变量,或者目前不支持?
顺便说一句,我已经按照Docker and private modules中有关如何使用NPM令牌构建泊坞窗图像的建议
答案 0 :(得分:7)
这绝对是声明性管道的错误。您可以在此处跟踪与此相关的问题:https://issues.jenkins-ci.org/browse/JENKINS-42369
如果您不再使用声明性管道并使用脚本化管道,则不会发生这种情况,尽管您的Jenkins文件将是“更多的”
答案 1 :(得分:0)
为此找到了解决方案。使用凭据管理器添加NPM_TOKEN。然后,您可以
pipeline {
agent {
docker {
image 'node:latest'
args '-e NPM_TOKEN=$NPM_TOKEN'
}
}
stages {
stage('npm install') {
steps {
sh 'npm install'
}
}
stage('static code analysis') {
steps {
sh 'npx eslint .'
}
}
}
}
答案 2 :(得分:0)
我想出了一个解决方法,它仍然使用声明性管道。 我正在使用这种技术通过pip下载私有的github仓库。
// Workarounds for https://issues.jenkins-ci.org/browse/JENKINS-42369
// Warning: The secret will show up in your build log, and possibly be in your docker image history as well.
// Don't use this if you have a super-confidential codebase
def get_credential(name) {
def v;
withCredentials([[$class: 'StringBinding', credentialsId: name, variable: 'foo']]) {
v = env.foo;
}
return v
}
def get_additional_build_args() {
return "--build-arg GITHUB_ACCESS_TOKEN=" + get_credential("mysecretid")
}
pipeline {
agent {
dockerfile {
filename 'Dockerfile.test'
additionalBuildArgs get_additional_build_args()
}
}