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

joe*_*oey 6 groovy continuous-integration continuous-deployment jenkins jenkins-pipeline

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

pipeline {
environment {
    DEPLOY_ENV = mapBranchToDeployEnvironment(${BRANCH})
}
Run Code Online (Sandbox Code Playgroud)

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

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

bat "powershell .\\Deploy-ServiceProxy -Environment ${DEPLOY_ENV}"
Run Code Online (Sandbox Code Playgroud)

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

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

更新:我的问题是我没有意识到它有多简单,而是认为我必须将一个舞台或脚本对象传递给一个 groovy 共享库函数,而实际上它就像创建一个共享库一样简单,然后直接引用方法中的环境变量。简单。谢谢你。

ode*_*fou 11

我遇到了完全相同的问题,确实可以使用共享库方法。但是还有另一种解决方案,如果您还没有设置共享库,则更简单,即在 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}"
        }
    }
 }
}
Run Code Online (Sandbox Code Playgroud)


bur*_*ttk 8

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

environment {
  DEPLOY_ENV = mapBranchToDeployEnvironment()
}
Run Code Online (Sandbox Code Playgroud)

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

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

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