| Hi, Maybe this is intended behaviour (or maybe I'm doing something wrong) but if i have this test pipeline:
pipeline {
agent none
stages {
stage("nvm") {
agent {label 'npm'}
steps {
withEnv(["PATH+foo=/tmp"]) {
nvm('8.10.0') {
sh 'env'
}
}
}
}
}
}
/tmp is not on PATH: PATH=/var/opt/jenkins-slave/.nvm/versions/node/v8.10.0/bin:/var/opt/jenkins-slave/.nvm/versions/node/v8.10.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/rh/git19/root/bin However if I just switch wtihEnv and nvm around:
steps {
nvm('8.10.0') {
withEnv(["PATH+foo=/tmp"]) {
sh 'env'
}
}
}
/tmp is now on the PATH: PATH=/tmp:/var/opt/jenkins-slave/.nvm/versions/node/v8.10.0/bin:/var/opt/jenkins-slave/.nvm/versions/node/v8.10.0/bin:/goss:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/rh/git19/root/bin Why does this matter to me? Because our Shared Library currently has...
withJava() {
withMaven() {
withNode() {
//build node with maven (don't ask) but mvn not on PATH in this case
}
}
}
... all over the place and while refactoring it by moving the order of theses statements around isn't a biggie it's not very nice to have code that only works if the statements are in a certain order. So tl;dr: please change the behaviour of the code not to overwrite PATH set by withEnv or advise on some other way to work around this. Content of withNode:
def call(String nodeVersion, Closure body) {
nvm(nodeVersion) {
configFileProvider([configFile(fileId: Constants.NODEJS_SETTINGS_ID, targetLocation: '/var/opt/jenkins-slave/.npmrc')]) {
body()
}
}
}
withMaven() uses withEnv internally:
def call(String mavenVersion, Closure body) {
def maven_home = tool name: "Maven ${mavenVersion}", type: 'maven'
buildlog.info("MAVEN_HOME: ${maven_home}")
withEnv(["PATH+MAVEN=${maven_home}/bin", "MAVEN_VERSION=${mavenVersion}"]) {
configFileProvider([configFile(fileId: Constants.MAVEN_SETTINGS_ID, targetLocation: 'settings.xml', variable: 'MAVEN_SETTINGS')]) {
body()
}
}
}
|