如何在Jenkins声明性管道的代理部分中使用环境变量?

时间:2017-05-18 15:44:06

标签: jenkins npm jenkins-pipeline

我为基于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令牌构建泊坞窗图像的建议

3 个答案:

答案 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()
        }
    }