我试图获得一个如下所示的声明性管道:
pipeline {
environment {
ENV1 = 'default'
ENV2 = 'default also'
}
}
问题是,我希望能够根据任意条件覆盖ENV1或ENV2的值。我目前的需求只是基于分支,但我可以想象更复杂的条件。
有没有理智的方法来实现这个?我在网上看到过一些类似的例子:
stages {
stage('Set environment') {
steps {
script {
ENV1 = 'new1'
}
}
}
}
但我相信这并不是设置实际的环境变量,而是设置一个局部变量来覆盖以后对ENV1的调用。问题是,我需要这些环境变量由nodejs脚本读取,而那些需要是真正的机器环境变量。
有没有办法在jenkinsfile中将环境变量设置为动态?
答案 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)