Jenkins 詹金斯:在两次作业运行之间存储变量的好方法是什么?

Jenkins 詹金斯:在两次作业运行之间存储变量的好方法是什么?,jenkins,jenkins-pipeline,jenkins-plugins,hudson,jenkins-groovy,Jenkins,Jenkins Pipeline,Jenkins Plugins,Hudson,Jenkins Groovy,我有一个时间触发的作业,需要检索此作业上次运行时存储的某些值 在Jenkins环境中,是否有方法在作业运行之间存储值 例如,我可以在shell脚本动作中编写类似于next的内容: XXX=`cat /hardcoded/path/xxx` #job itself echo NEW_XXX > /hardcoded/path/xxx 但是有更可靠的方法吗?我会将变量作为参数从第一个作业传递到第二个作业。有关如何从另一个生成触发参数化生成的更多信息,请参阅 有几个选项: 将数据存储在工作区

我有一个时间触发的作业,需要检索此作业上次运行时存储的某些值

在Jenkins环境中,是否有方法在作业运行之间存储值

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

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

但是有更可靠的方法吗?

我会将变量作为参数从第一个作业传递到第二个作业。有关如何从另一个生成触发参数化生成的更多信息,请参阅

有几个选项:

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

如果您使用的变量类型简单,则可以使用参数在同一作业的两次运行之间存储该变量

使用
properties
步骤,可以从管道中配置参数及其默认值。配置后,您可以在每次运行开始时读取它们,并在结束时保存它们(作为默认值)。在声明性管道中,它可能如下所示:

管道{
一号特工
选择权{
skipDefaultCheckout true
}
舞台{
阶段('读取变量'){
台阶{
剧本{
试一试{
variable=params.YOUR_变量
}
捕获(例外e){
echo(“无法从参数中读取变量,假设这是管道的第一次运行。异常:${e}”)
variable=“”
}
}
}
}
阶段('Save Variable for next run'){
台阶{
剧本{
性质([
参数([
字符串(默认值:“${variable}”,描述:'variable description',名称:'YOUR_variable',trim:true)
])
])
}
}
}
}

谢谢,但不幸的是只有一个作业,只是它会不时被触发,需要“记住”上次运行中的一些信息。使用FS有什么不可靠之处?使用FX会引入不可跟踪的依赖项。因此,一旦迁移Hudson,它将停止工作,它可能会丢失备份或版本控制,等等。您可以将文件存储在工作区中(即作为jenkins的一部分),以减少通过备份分离文件的风险。