【问题标题】:Declarative Jenkins Pipeline; How to declare a variable and use it in script or mail notification?声明式 Jenkins 流水线;如何声明一个变量并在脚本或邮件通知中使用它?
【发布时间】:2018-10-31 04:52:15
【问题描述】:

(下方更新)

我有一个可以接受参数 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”
  • 致詹金斯邮件通知者。并让它在主题或正文中检索 ${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

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

我还需要想办法把这个$VERSION变量注入到环境变量中,这样我的构建脚本才能找到它。

【问题讨论】:

    标签: jenkins environment-variables jenkins-pipeline


    【解决方案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

    【讨论】:

    • 这段代码运行良好,但无论如何我可以在环境变量中“注入”我的 ${VERSION} 以便我的 bash 构建脚本可以找到它吗?它在一个单独的阶段内运行,例如 state('Build') { steps { sh "./build.sh" } }
    • 您可以使用 withEnv 步骤来包装您的脚本调用,或将版本作为脚本的参数。 withEnv 文档:jenkins.io/doc/pipeline/steps/workflow-basic-steps/…
    • 它有效。不理想,因为我需要在需要的地方明确指定 withEnv 但我会完成这项工作,谢谢:)
    • 目前可行,但后来我不得不将“dev version = env.VERSION”移动到环境部分。 (Jenkins 版本 2.190.1)
    【解决方案2】:

    假设你使用Parametrized pipelines,你应该调用变量为${params.parameterName}

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

    在你的情况下:

     ${params.VERSION}
    

    【讨论】:

    • 我不知道 params/env 的这个潜在问题,但我不确定它是否有助于解决我的问题(除非我更改了我的 IF 语句以检查 params 而不是 env),因为我想要注入一个新的环境变量(或简单的变量)并在以后使用它。
    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 2020-01-20
    • 2011-12-06
    • 2019-08-03
    • 2019-10-27
    • 2019-11-30
    • 1970-01-01
    • 2014-04-03
    相关资源
    最近更新 更多