Hudson:在两个作业运行之间存储变量的好方法是什么?

时间:2011-12-07 17:05:47

标签: jenkins hudson

我的工作需要知道上次作业计算的值。

有没有办法将它存储在Hudson / Jenkins环境中?

例如,我可以在shell脚本操作中写下类似的内容:

XXX=`cat /hardcoded/path/xxx`
#job itself
echo NEW_XXX > /hardcoded/path/xxx

但是有更可靠的方法吗?

3 个答案:

答案 0 :(得分:9)

一些选择:

  • 将数据存储在工作区中。如果数据不重要(即,当工作空间被破坏时可以将其核对)应该没问题。我只使用它来缓存昂贵的计算数据,例如预建的库依赖。
  • 将数据存储在文件系统中的某个固定位置。您将使jenkins不再自包含,从而使迁移+备份更加复杂 - 但可能不会太多;特别是如果您将数据存储在jenkins的某个自定义用户子目录中。并行构建也很棘手,分布式构建可能是不可能的。 Jenkins有一个userContent子目录,你可以使用它 - 这样文件至少是jenkins安装的一部分,因此更容易迁移或备份。我为我的构建的(相当大的)代码覆盖率趋势文件执行此操作。
  • 将数据存储在不同的计算机上(例如数据库)。设置起来比较复杂,但您对本地计算机的详细信息的依赖程度较低,而且分发可能更容易并行构建工作。我这样做是为了维护一个实时更改日志。
  • 将数据存储为构建工件。这意味着查看以前构建的工件。它是安全且可重复的,并且因为Uri用于访问此类工件,所以也适用于分布式构建。但是,你需要处理失败的构建(你应该回顾几个版本吗?从头开始?)你将存储许多副本,如果它是1KB则很好但如果它是1GB则不太好。另一个缺点是,您可能需要打开jenkin的安全设置,以允许匿名访问工件(因为您只是从uri下载)。

适当的解决方案取决于您的情况。

答案 1 :(得分:2)

如果您使用 Pipelines 并且您的变量是简单类型,您可以使用参数在同一作业的运行之间存储它。

使用 properties 步骤,您可以从管道内配置参数及其默认值。配置完成后,您可以在每次运行开始时读取它们并在最后保存它们(作为默认值)。在声明式管道中,它可能看起来像这样:

pipeline {
  agent none
  options {
    skipDefaultCheckout true
  }
  stages {
    stage('Read Variable'){
      steps {
        script {
          try {
            variable = params.YOUR_VARIABLE
          }
          catch (Exception e) {
            echo("Could not read variable from parameters, assuming this is the first run of the pipeline. Exception: ${e}")
            variable = ""
          }
        }
      }

    }
    stage('Save Variable for next run'){
      steps {
        script {
          properties([
            parameters([
              string(defaultValue: "${variable}", description: 'Variable description', name: 'YOUR_VARIABLE', trim: true)
            ])
          ])
        }
      }
    }
  }

答案 2 :(得分:1)

我会将变量从第一个作业传递到第二个作为parameterized build中的参数。有关如何从另一个构建触发参数化构建的更多信息,请参阅this question