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

Pau*_*chs 9 jenkins jenkins-pipeline

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

pipeline {
    environment {
        ENV1 = 'default'
        ENV2 = 'default also'
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

stages {
    stage('Set environment') {
        steps {
            script {
                ENV1 = 'new1'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

小智 20

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

pipeline {
    agent any
    environment {
        ENV_NAME = "${env.BRANCH_NAME == "develop" ? "staging" : "production"}"
    }
}
Run Code Online (Sandbox Code Playgroud)


str*_*icq 11

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

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'}"
}
Run Code Online (Sandbox Code Playgroud)


bur*_*ttk 9

用于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
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)