12

我有一个时间触发的作业,它需要检索存储在该作业的先前运行中的某些值。

有没有办法在 Jenkins 环境中的作业运行之间存储值?

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

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

但是有没有更可靠的方法呢?

4

3 回答 3

20

几个选项:

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

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

于 2012-12-13T15:22:15.033 回答
3

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

于 2012-03-24T01:07:57.510 回答
3

如果您使用的是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)
            ])
          ])
        }
      }
    }
  }
于 2021-01-21T15:21:24.653 回答