7

背景:

我们Production每天晚上都有一个 Jenkins 工作 ( ) 来构建可交付成果。我们还有另一项工作(ProductionPush)通过专有协议将可交付成果在第二天推送到生产机器。这是因为一些生产机器只在白天的特定时间可用(这也让我们有机会修复任何最后一分钟的构建中断)。 ProductionPush需要访问由Production作业构建的可交付成果(因此它需要访问相同的工作空间)。我们有多个节点和并发构建(因此是不可预测的工作空间),并且不希望将作业绑定到固定的节点/工作空间,因为资源有些有限。

问题:

  1. 如何确保两个作业共享相同的工作空间并确保ProductionPush仅在成功的情况下在第二天的固定时间运行Production- 而不修复两个作业以耗尽相同的节点/工作空间?我知道参数化触发器插件可能会对此有所帮助,但它似乎没有时间延迟功能,而且 12 小时对于安静的时期来说似乎太长了。

  2. 共享工作空间是个坏主意吗?

4

2 回答 2

25

答案 2:是的,共享工作空间是个坏主意。有文件锁定的可能性。存在工作空间被清除的问题。只是不要这样做...

答案 1:您需要的是归档构建的工件。这样,特定构建的工件(按构建号)将始终可用,无论另一个构建是否正在运行,或者工作空间处于什么状态

归档工件

  • 在您的构建作业中,在Post-build Actions下,选择Archive the artifacts
  • 指定要存档的工件(您可以使用以下组合)
    a)您可以存档所有:*.*
    b)您可以使用通配符存档特定文件:/path/to/file_version*.zip
    c)您可以忽略中间目录,例如:**/file_version*.zip
  • 为了避免许多工件的存储问题,在配置顶部,您可以选择Discard Old Builds,单击Advanced按钮,然后使用Days to keep artifactsMax # of builds to keep with artifacts。请注意,这两个设置不控制实际构建的保留时间(其他设置控制)

从 Jenkins 访问工件

  • 在构建历史记录中,选择您想要的任何以前的构建。
  • 除了 SCM 更改和修订数据之外,您现在还有一个Build Artifacts链接,您可以在该链接下找到该特定构建的所有工件。
  • 您还可以使用 Jenkins 的永久链接访问它们,例如
    http://JENKINS_URL/job/JOB_NAME/lastSuccessfulBuild/artifact/,然后使用工件的名称。

从另一个作业访问工件

我在这里广泛解释了如何从另一个部署作业(在您的示例中ProductionPush)访问以前的工件:
如何从 Jenkins 的另一个作业中提升特定的内部版本号?

如果您的要求是始终将最新版本部署到生产环境,您可以跳过上述链接中的升级配置。只需按照部署作业的配置步骤即可。完成部署作业后,如果它始终同时运行,只需定期配置其构建参数即可。或者,您可以拥有另一个作业,该作业将根据您想要的任何条件触发部署作业。

在上述任何一种情况下,如果您的默认选择器设置为最新的成功构建(如上面的链接中所述),最新的构建将被推送到生产

于 2013-03-04T18:46:23.873 回答
0

不确定归档工件是否真的是一个好主意。临时存储库可能会更好,因为它允许跨职能团队在需要时通过调整 Maven settings.xml 文件在不同构建之间共享工件。

你真的想要一个可部署的(ear/war)作为构建、测试、然后一旦对构建的信心很高就升级到生产的东西。

在您的可部署文件上使用内部版本号 (major.minor.buildnumber)。这是您将其推广到生产环境的东西,前提是您的测试可以依赖。不要使用连字符将次要版本号与内部版本号分开,因为这会强制 Maven 执行词法比较……小数点将强制进行数字比较,这将使您的头痛大大减少。

此外,您没有提及您的目标平台,但使用 Maven APT/RPM 插件将 APT/RPM 推送到生产盒可用的 APT/YUM 存储库(成功测试后!)将是一个不错的选择,因为符合行业标准?

于 2014-03-30T00:09:37.130 回答