声明式詹金斯管道;如何声明变量并在脚本或邮件通知中使用它?

dak*_*aks 7 environment-variables jenkins jenkins-pipeline

(下面更新)

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

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

  // ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

现在我想“注入”这个变量

  • 我的构建脚本。它需要在环境变量中找到“ VERSION”
  • 给詹金斯邮件通知者。并获取主题或正文中的$ {VERSION}

我试图用更改上面的代码

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

得到这个错误 groovy.lang.MissingPropertyException: No such property: VERSION for class: groovy.lang.Binding

然后,我尝试在下面添加一个“环境”步骤

environment {
    VERSION = ${VERSION}
}
Run Code Online (Sandbox Code Playgroud)

但这并不能解决我的问题。

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

更新

我现在有一个工作管道,看起来像

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
Run Code Online (Sandbox Code Playgroud)

我需要添加“环境”步骤,以便能够在所有阶段中获得$ VERSION(不仅在被操纵的阶段中)。

我仍然需要找到一种方法将此$ VERSION变量注入环境变量中,以便我的构建脚本可以找到它。

Vas*_*kka 3

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

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", ...
}
Run Code Online (Sandbox Code Playgroud)

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

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