当前位置: 首页 > 知识库问答 >
问题:

在jenkins声明式管道中,如何基于方法设置环境变量?

越欣怡
2023-03-14

在jenkins声明式管道中,如何基于自定义groovy/powershell方法设置环境变量的值?例如,如果我有一个如下所示的delcarative管道,我可以使用一个共享库方法来设置这个值吗?本质上,我试图使用一个多分支声明管道jenkins作业,它有一个部署阶段,但我需要确保开发分支部署到DEV,发布分支部署到STG,但使用相同的管道。我的想法是创建一个基于自定义方法设置的环境变量(可能在共享库中的Groovy中),该方法将简单地查看env的当前值。分支,只需要一点逻辑来设置目标部署环境的值。这是我设想的一个例子

pipeline {
environment {
    DEPLOY_ENV = mapBranchToDeployEnvironment(${BRANCH})
}

然后在我的部署阶段,我会在两个powershell调用中使用此值

bat "powershell .\\Deploy-Service -Environment ${DEPLOY_ENV}"

bat "powershell .\\Deploy-ServiceProxy -Environment ${DEPLOY_ENV}"

否则,当前人们如何解决使用同一管道部署到不同环境,同时跨许多其他函数调用使用变量的问题?Jenkins推荐的将触发构建的分支名称映射到应该部署到的环境(如果有的话)的方法是什么?根据我的理解,声明性管道允许管道为“多分支”,如果作业也部署,则需要映射到部署环境。当所有全局jenkins管道环境变量对于每个作业/分支执行都是相同的值时,管道如何使用多分支部署到多个环境?

在上述场景中,管道变量“DEPLOY_ENV”是从作业设置的其他环境变量派生的,通常在阶段级别可用,但在这里,我们希望全局设置值,以便我们可以跨阶段使用它

更新:我的问题是,我没有意识到它有多简单,相反,我认为我必须将一个阶段或脚本对象传递到groovy共享库函数中,而事实上,这就像创建共享库一样简单,然后直接引用方法中的环境变量。容易的非常感谢。

共有3个答案

雍志新
2023-03-14
stage('Prepare env variables') {
    steps {
        script {
            if (env.BRANCH_NAME == 'master') {
                echo 'Copying project-stg.env file...';
                sh 'cp /opt/project-stg.env .env';
            } else {
                echo 'Copying project-dev.env file...';
                sh 'cp /opt/project-dev.env .env';
            }
        }
    }
}

夏意蕴
2023-03-14

你可以完全按照你的建议去做。你应该使用var(一个新的DSL方法)创建一个jenkins共享库。可以调用这些来分配给管道范围的环境变量。你基本上是正确的。这是一个要分配给环境变量的Jenkinsfile片段:

environment {
  DEPLOY_ENV = mapBranchToDeployEnvironment()
}

您不需要将分支传递给 mapBranchToDeployEnvironment DSL 方法,因为您可以使用该方法访问分支。共享库中 vars/mapBranchToDeployEnvironment.groovy 的示例内容如下所示:

def call() {
  echo "branch is: ${env.BRANCH_NAME}"
  if (env.BRANCH_NAME == 'master') {
    return 'prod'
  } else {
    return 'staging'
  }
}

你可能不应该期望这是一个五分钟的任务,但你会得到它。祝你好运!

闾丘谦
2023-03-14

我遇到了完全相同的问题,实际上可以使用共享库方法。但是还有另一种解决方案,如果您还没有共享库设置,则更简单,它包括在Pipeline语句之前定义一个groovy方法,然后在管道中使用它,如下所示:

def getEnvFromBranch(branch) {
  if (branch == 'master') {
    return 'production'
  } else {
    return 'staging'
 }
}

pipeline {
  agent any
  environment {
    targetedEnv = getEnvFromBranch(env.BRANCH_NAME)
  }
  stages {
    stage('Build') {
        steps {
            echo "Building in ${env.targetedEnv}"
        }
    }
 }
}
 类似资料:
  • 问题内容: 我正在尝试这样做 结果: null / build / 如何使用全局环境创建环境? 问题答案: 我认为您应该使用: 就像在“环境”步骤中一样,您正在定义环境变量,以后可以通过 env.your-variable-name访问

  • 问题内容: 我正在尝试获得一个如下所示的声明性管道: 问题是,我希望能够基于任意条件覆盖ENV1或ENV2的值。我目前的需求只是将其作为分支机构的基础,但我可以想象更复杂的情况。 有没有理智的方法来实现这一目标?我在网上看到了一些类似的示例: 但是我相信这并没有设置实际的环境变量,而是设置了一个局部变量,该局部变量将覆盖以后对ENV1的调用。问题是,我需要由nodejs脚本读取这些环境变量,而这些

  • 在Jenkins脚本管道中,您可以像这样设置PATH env变量: 注意这里解释的路径MAVENhttps://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-withenv代码集环境变量: 要设置的环境变量列表,每个变量的形式为VARIABLE=value或VARIABLE=以取消设置其他定义的变量。您还可以使用语法PATH wh

  • 问题内容: 是否有任何环境变量可用于获取Jenkins管道标题? 我知道我们可以使用它来获得自由职业的头衔,但是有什么可以用来获取管道名称的东西吗? 问题答案: 您可以使用相同的名称(例如或)从groovy访问相同的环境变量。 从文档中: 可以从Groovy代码中以env.VARNAME或仅以VARNAME的形式访问环境变量。您也可以写入这些属性(仅使用env。前缀): 这些定义也将在构建期间或构

  • 问题内容: 在Jenkins作业的预构建步骤中,我有两个脚本,第一个是perl脚本,第二个是使用groovy插件的系统groovy脚本。我需要第二个Groovy脚本中的第一个Perl脚本中的信息。我认为最好的方法是设置一些环境变量,并且想知道如何实现。 或其他更好的方法。 谢谢你的时间。 问题答案: 在构建步骤之间传播环境变量的方法是通过EnvInject插件。 但是,就您而言,仅在一个构建步骤中

  • 问题内容: 如何在Jenkins声明式管道中循环参数化并行阶段?(或脚本管道,如果声明式不能) 这是我简单的伪示例。如何循环(“部署serverN”)阶段? 数组可能具有1..n变量。 我不想重复代码。詹金斯管道中一定有办法吗?还是我应该使用矩阵。我已经尝试了一些,但是没有成功。 我也尝试过这种方法,但是由于前一阶段不依赖于下一阶段,因此它并不是完美的。 在Blue Ocean中应该看起来像这样(