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

时间:2017-07-22 19:18:29

标签: jenkins groovy continuous-integration jenkins-pipeline continuous-deployment

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

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

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:4)

您可以完全按照自己的建议行事。您应该使用var(新的DSL方法)创建jenkins shared library。可以调用这些来分配给管道范围的环境变量。你有它基本上是正确的。这是一个分配给环境变量的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'
  }
}

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

答案 1 :(得分:3)

我有完全相同的问题,实际上可以使用共享库方法。但是还有另一个解决方案,如果你还没有共享库设置那么更简单,它包括在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}"
        }
    }
 }
}

答案 2 :(得分:0)

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';
            }
        }
    }
}