【问题标题】:jenkins declarative pipeline set variables derived from parametersjenkins 声明式管道集从参数派生的变量
【发布时间】:2019-05-07 18:10:26
【问题描述】:

我在 Jenkinsfile 中使用声明式管道,但我想从参数中派生一些变量。 例如给出:

parameters {
   choice(name: 'Platform',choices: ['Debian9', 'CentOS7'], description: 'Target OS platform', )
}

我想添加一个类似的块:

script {
  switch(param.Platform) {
     case "Centos7":
         def DockerFile = 'src/main/docker/Jenkins-Centos.Dockerfile'
         def PackageType = 'RPM'
         def PackageSuffix = '.rpm'
         break
     case "Debian9":
     default:
         def DockerFile = 'src/main/docker/Jenkins-Debian.Dockerfile'
         def PackageType = 'DEB'
         def PackageSuffix = '.deb'
         break
  }
}

这样我就可以在管道的其他地方使用变量。例如:

agent { 
   dockerfile {
       filename "$DockerFile"
   }
}

等等。

但脚本在参数、环境和代理部分是非法的。 只能分步使用。

我需要在代理块中使用参数,并且我想避免在不同步骤中使用变量的地方重复自己。

有没有一种健全的方法来实现这一目标?我的偏好依次是:

  • 声明性管道
  • 脚本化的管道(不太好)
  • 通过 Jenkins UI 的插件(最差)

不管它是否实际共享,共享库在这里可能是合适的。

其目的是通过创建参数化构建并为不同的参数集调用它来支持多配置项目,每个配置都有一个红色/蓝色状态灯。 可能是我假设了一个“老式”的设计。在这种情况下,可接受的答案将解释创建多配置多分支管道的现代最佳实践。类似:https://support.cloudbees.com/hc/en-us/articles/115000088431-Create-a-Matrix-like-flow-with-PipelineJenkins Pipeline Multiconfiguration Project

另请参阅Multiconfiguration / matrix build pipeline in Jenkins,了解关于最佳实践的不太具体的讨论。

【问题讨论】:

    标签: jenkins jenkins-pipeline jenkins-groovy


    【解决方案1】:

    以前从未真正使用过 Jenkins 声明式管道,但我认为您引用 params 的方式不正确?

    我认为可能是:${params.Platform}params.Platform 而不是 param

    所以可能像下面这样?

    pipeline {
        agent any
        stages {
            stage('example') {
                steps {
                    script {
                        switch(${params.Platform}) {
                            ...
                        }
                    }
                }
            }
        }
    }
    

    正如我所说,以前从未真正使用过它,所以不是 100%。我只是在查看文档中用于参数的语法:https://jenkins.io/doc/book/pipeline/syntax/#parameters

    【讨论】:

    • 问题不在于开关的语法(这取决于我是 groovy 的新手),而是我可以把它放在哪里。我需要代理块的参数。那里的脚本块合法吗?
    • 我明白了。我没有意识到那是你的问题。您的参数是否需要在其中包含数字?例如,这样的事情可能会起作用:filename "src/main/docker/Jenkins-$Platform.Dockerfile" 如果您将参数更改为仅允许“Debian”和“Centos”选项。
    【解决方案2】:

    我认为解决你的问题的关键是你的变量的声明。如果您希望您的变量可以从其他阶段访问,请不要使用def

    以下是您的问题的解决方案示例:

    pipeline{
        agent none
        parameters {
            choice(name: 'Platform',choices: ['Debian9', 'CentOS7'], description: 'Target OS platform', )
        }
        stages{
            stage('Setting stage'){
                agent any
                steps {
                    script {
                        switch(params.Platform){
                            case 'CentOS7' :
                                DockerFile = 'src/main/docker/Jenkins-Centos.Dockerfile'
                                PackageType = 'RPM'
                                PackageSuffix = '.rpm'
                                break
                            case 'Debian9' :
                                DockerFile = 'src/main/docker/Jenkins-Debian.Dockerfile'
                                PackageType = 'DEB'
                                PackageSuffix = '.deb'
                                break
                        }
                    }
                }
            }
            stage('Echo stage'){
                agent { 
                    dockerfile {
                        filename "$DockerFile"
                    }
                }
                steps{
                    echo PackageType
                    echo PackageSuffix
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      在 Windows 上绝对有可能:

      stage('var from groovy') {
          steps {
              script {
                   anvar = "foo"
              }
      
              bat "${anyvar}"
          }
      }
      

      【讨论】:

        【解决方案4】:

        这是我在生产中的一个例子

        def dest_app_instance = "${params.Destination}"
        
        switch(dest_app_instance) {
          case "CASE1":
            dest_server = "server1"
            break
          case "CASE2":
            dest_server = "server2"
            break 
        }
        

        【讨论】:

        • 但是您可以在声明性管道中的哪个位置放置它以便可以使用参数来设置代理?
        • @Bruce Adams,我错过了关于它是声明性管道的部分,我正在使用脚本化管道。
        猜你喜欢
        • 1970-01-01
        • 2021-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多