Jenkins声明性管道中的条件环境变量

时间:2017-05-16 16:36:49

标签: jenkins jenkins-pipeline

我试图获得一个如下所示的声明性管道:

pipeline {
    environment {
        ENV1 = 'default'
        ENV2 = 'default also'
    }
}

问题是,我希望能够根据任意条件覆盖ENV1或ENV2的值。我目前的需求只是基于分支,但我可以想象更复杂的条件。

有没有理智的方法来实现这个?我在网上看到过一些类似的例子:

stages {
    stage('Set environment') {
        steps {
            script {
                ENV1 = 'new1'
            }
        }
    }
}

但我相信这并不是设置实际的环境变量,而是设置一个局部变量来覆盖以后对ENV1的调用。问题是,我需要这些环境变量由nodejs脚本读取,而那些需要是真正的机器环境变量。

有没有办法在jenkinsfile中将环境变量设置为动态?

6 个答案:

答案 0 :(得分:7)

使用withEnv动态设置环境变量,以便在管道的某个部分使用(例如,在运行节点脚本时)。像这样(用你的节点脚本替换sh步骤的内容):

pipeline {
    agent { label 'docker' }
    environment {
        ENV1 = 'default'
    }
    stages {
        stage('Set environment') {
            steps {
                sh "echo $ENV1" // prints default
                // override with hardcoded value
                withEnv(['ENV1=newvalue']) {
                    sh "echo $ENV1" // prints newvalue
                }
                // override with variable
                script {
                    def newEnv1 = 'new1'
                    withEnv(['ENV1=' + newEnv1]) {
                        sh "echo $ENV1" // prints new1
                    }
                }
            }
        }
    }
}

答案 1 :(得分:7)

也许您可以尝试这样的事情:

pipeline {
    agent any
    environment {
        ENV_NAME = "${env.BRANCH_NAME == "develop" ? "staging" : "production"}"
    }
}

答案 2 :(得分:2)

这是在环境部分有条件地设置变量的正确语法。

environment {
    MASTER_DEPLOY_ENV = "TEST" // Likely set as a pipeline parameter
    RELEASE_DEPLOY_ENV = "PROD" // Likely set as a pipeline parameter
    DEPLOY_ENV = "${env.BRANCH_NAME == 'master' ? env.MASTER_DEPLOY_ENV : env.RELEASE_DEPLOY_ENV}"
    CONFIG_ENV = "${env.BRANCH_NAME == 'master' ? 'MASTER' : 'RELEASE'}"
}

答案 3 :(得分:0)

pipeline {
    agent none
    environment {
        ENV1 = 'default'
        ENV2 = 'default'
    }
    stages {
        stage('Preparation') {
            steps {
                script {
                    ENV1 = 'foo' // or variable
                    ENV2 = 'bar' // or variable
                }
                echo ENV1
                echo ENV2
            }
        }
        stage('Build') {
            steps {
                sh "echo ${ENV1} and ${ENV2}"
            }
        }
        // more stages...
    }
}

这种方法更简单,看起来更好。重写的环境变量也将应用于所有其他阶段。

答案 4 :(得分:0)

我设法通过在环境部分中显式调用shell来使其正常工作,如下所示:

UPDATE_SITE_REMOTE_SUFFIX = sh(returnStdout: true, script: "if [ \"$GIT_BRANCH\" == \"develop\" ]; then echo \"\"; else echo \"-$GIT_BRANCH\"; fi").trim()

但是我知道我的詹金斯(Jenkins)正在使用nix,所以它可能不那么便携

答案 5 :(得分:-2)

我尝试以不同的方式做到这一点,但遗憾的是它并不完全有效:

composer.json

奇怪的是,这适用于我的pull请求构建(changeRequest()返回true并且TARGET成为我的目标分支名称)但它不适用于我的CI构建(在这种情况下,分支名称是例如release / 201808但是结果TARGET评估为null)