声明性Jenkins管道;如何声明变量并在脚本或邮件通知中使用它?

时间:2018-05-21 13:51:27

标签: jenkins environment-variables jenkins-pipeline

(更新如下)

我有一个声明性管道作业,可以接受参数VERSION。

pipeline {
  parameters {
    string(name: VERSION, defaultValue: '')
  }

  // ...
}

如果没有给出VERSION,就像Gitlab向这个作业发送一个钩子一样,我想从git计算它,所以我做这样的事情

stages {
  stage('Prepare') {
    steps {
      // ...
      if (! env.VERSION) {
        VERSION = sh(script: "git describe", returnStdout: true).trim()
      }
    }
  }
}       

现在我想"注入"

这个变量
  • 我的构建脚本。它需要找到" VERSION"在环境变量
  • 给jenkins邮件通知员。并让它在主题或正文中检索$ {VERSION}

我尝试用

更改上面的代码
stages {
  stage('Prepare') {
    steps {
      // ...
      if (! env.VERSION) {
        env.VERSION = sh(script: "git describe", returnStdout: true).trim()
      }
    }
  }
}       

出现此错误groovy.lang.MissingPropertyException: No such property: VERSION for class: groovy.lang.Binding

然后我尝试添加一个"环境"下面的步骤

environment {
    VERSION = ${VERSION}
}

但它并没有解决我的问题。

我正在寻找任何帮助来解决它。

更新

我现在有一个看起来像

的工作流水线
pipeline {
    agent any
    parameters {
        string(name: 'VERSION', defaultValue: '')
    }   
    environment {          
        def VERSION = "${params.VERSION}"
    }
    stages {
        stage('Prepare & Checkout') {
            steps {
                script {
                    if (! env.VERSION) {
                       VERSION = sh(script: "date", returnStdout: true).trim()
                    }
                    echo "** version: ${VERSION} **"
                }
            }
        }  
        stage('Build') {
            steps {
                // sh "./build.sh"
                echo "** version2: ${VERSION} **"
            }
        }
    } // stages
    post {
        always {
            mail to: 'foo@example.com',
                 subject: "SUCCESS: ${VERSION}",
                 body: """<html><body><p>SUCCESS</p></body></html>""",
                 mimeType: 'text/html',
                 charset: 'UTF-8'
            deleteDir()
        }
    }
} // pipeline

我需要添加&#34;环境&#34;步骤,以便能够在所有阶段获得$ VERSION(不仅仅是在它被操纵的阶段)。

我仍然需要找到一种方法在环境变量中注入这个$ VERSION变量,这样我的构建脚本就可以找到它。

2 个答案:

答案 0 :(得分:1)

如果要在环境中注入变量以便以后可以使用它,可以定义另一个等于env.VERSION的变量或shell脚本的输出。然后在管道中使用该变量,例如:

pipeline {
  parameters {
    string(name: VERSION, defaultValue: '')
  }

  def version = env.VERSION
  stages {
  stage('Prepare') {
    steps {
      // ...
      if (!version) {
        version = sh(script: "git describe", returnStdout: true).trim()
      }
    }
  }

  mail subject: "$version build succeeded", ...
}

如果希望其他作业在构建运行后能够访问VERSION的值,则可以将其写入文件并将其存档。

编辑: 为了使您的脚本能够使用版本变量,您可以使脚本将版本作为参数,也可以使用withEnv step

答案 1 :(得分:0)

假设您使用的是Parametrized pipelines,则应将变量称为${params.parameterName}

  

尽管参数在env中可用,但它们当前是在第一次运行管道之前创建的,因此您应该通过params访问它们:

在你的情况下:

 ${params.VERSION}