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

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

在 jenkins 声明式管道中,如何根据自定义 groovy/powershell 方法设置环境变量的值?例如,如果我有如下所示的说明性管道,我可以使用共享库方法来设置该值吗? 本质上,我试图使用具有部署阶段的多分支声明式管道 jenkins 作业,但我需要确保开发分支部署到 DEV,发布分支部署到 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 管道环境变量对于每个作业/分支执行都具有相同的值时,管道如何使用多分支部署到多个环境?

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

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

最佳答案

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

关于jenkins - 在 Jenkins 声明式管道中,如何根据方法设置环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45258294/

相关文章:

grails - 如何设置 grails 环境变量

gradle - 将iOS/Android Groovy Gradle文件转换为Kotlin-getBinary,getProperty(+文字属性)?

Visual Studio Team Services 中的 Git,Visual Studio 2012 项目 - 无法从构建部署

mercurial - 您使用哪种持续集成软件?

git - 如果没有用户通过控制台登录,ubuntu 上的 Jenkins 无法访问 SSH 文件夹?

java - 方法太大 : While upgrading from grails 2. 3.7 到 grails 2.4.4

java - 将 stderr 重定向到 stdout 时,gradle 的输出出现乱码。 Jenkins gradle 插件受到影响

windows - 完全阻止进程显示任何对话框?

java - 从 Jenkins 作业中,获取 java.io.FileNotFoundException : Am able to run through same project in eclipse

java - ClassLoader 是否应该能够从不同的包中解析和加载类?