Jenkins 如何存储构建信息

Posted

技术标签:

【中文标题】Jenkins 如何存储构建信息【英文标题】:How Jenkins stores build information 【发布时间】:2015-11-10 22:33:13 【问题描述】:

我要解决什么问题

我在 Jenkins 上有一份工作来触发一个 shell 脚本,该脚本会生成一个工件并上传到 NFS。我想为 QA 添加一个流程,以便在验证构建后访问 Jenkins 以将构建推广为发布构建。目前,测试不是自动化的,所以升级的触发是手动的。提升所做的是将 NFS 上的工件移动到不同的位置。我正在考虑使用 Ansible 或 shell 脚本来存档。

有什么问题

问题是当促销被触发时,我需要知道这个 Jenkins 作业中每个特定构建#在 NFS、SVN# 等上的构建位置。我想知道是否有现有的插件或解决方案。

我的想法

    作为构建步骤的一部分,收集这些信息并将其写入平面文件/关系数据库,以便将构建#、构建路径、修订#和 svn diff 存储在数据库中。当促销被触发时,脚本将从 DB 中读取并执行促销。

我认为读写数据库是可行的,但对我来说似乎有点矫枉过正。我只是想知道我是否在这里遗漏了什么。我很好奇 Jenkins 是否有类似用例的内置插件。

谢谢!

【问题讨论】:

【参考方案1】:

你在正确的道路上。阅读这个答案: How to promote a specific build number from another job in Jenkins?

在您的构建作业中,将您需要的所有信息保存到属性文件中:

var1=blah  
var2=lalala

在构建过程结束时存档此文件(存档是标准的构建后步骤)

当您的促销活动运行时,您需要使用PROMOTED_NUMBER 参数来指定哪个构建要采取行动。然后使用 Copy Artifacts 插件,将之前保存的属性文件拉到促销的工作区(阅读链接的答案)。复制后,您可以使用 EnvInject 插件将属性文件作为环境变量加载,或按原样在 shell/ansible 中使用。

编辑: 如链接答案中所述,您不需要 2 个工作。但请记住,升级进程作为单独的进程运行,但使用与主作业相同的工作空间,因此为避免工作空间内的冲突,请为升级过程创建一个单独的文件夹并在那里完成所有升级工作。

【讨论】:

谢谢斯拉夫。我能够根据您的解决方案解决我的问题。我完全同意在单独的文件夹中进行促销。现在,我正在考虑多个用户尝试推广不同构建的场景。我假设我会以某种方式使文件夹独一无二,这样就不会引入竞争条件。 我不认为你可以同时运行同一个作业的多个提升过程,但如果是这样,你总是可以使用$PROMOTED_NUMBER附加到工作空间名称以使其唯一。只要确保你有某种清理,否则你会被这些永远不会被删除的独特文件夹弄得一团糟 是的,我使用了工作名称和PROMOTED _NUMBER 来使其独一无二。现在文件夹中的每个工件只有 100B,所以我可能会保留它们以供参考。仍然不确定我以后是否需要这些信息。

以上是关于Jenkins 如何存储构建信息的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止 Jenkins 中的 CI 构建意外发布到发布存储库?

如何在不克隆它所连接的存储库的情况下触发 Jenkins 构建?

如何将 Jenkins 构建信息与 JIRA 问题联系起来

在构建时访问存储库(Jenkins)

Jenkins 升级步骤如何管理工作空间

jenkins 打标签实现实现回滚