如何在Jenkins构建推广步骤中推送Git标签?

4
我有一个类似于this的讨论模型的构建推广流程(使用promoted builds插件)。总体而言,它运行良好。不过在某些"风味"的推广流程(并非全部),我想推送一个git标签。我使用"执行shell"步骤作为其中一个推广操作来实现这一点。这一直很有效,但今天出现了下面的错误。我怀疑我落在一个构建从未初始化git的工作空间的构建机上,在过去我一直很幸运(使用Cloudbees,构建机是动态分配的)。我尝试过"git publisher",但它似乎期望你处于一个git源插件已经完成其工作的设置中。有人能够可靠地从一个构建推广步骤推送一个标签吗?
+ git checkout develop
fatal: Not a git repository (or any of the parent directories): .git

我会建议将晋升与作业的同一主/从绑定...但是您提到您的从属是动态分配的。 - Slav
2个回答

2

这对我目前为止起作用了:

git tag MYTAG ${PROMOTED_GIT_COMMIT}
git push --tags

我不确定是否简化了这个问题,在我的环境中,推广似乎是在主分支上执行的,归档的工件也在那里。


你也需要检出 git 存储库吧? - Andy Smith
在我的情况下,克隆被存档,标签命令将标签设置为正确的版本。但在其他情况下可能需要这样做。 - diidu
啊,好的,我们有多个 Jenkins 从节点,这意味着我们不能保证 git checkout 在运行命令的地方。 - Andy Smith
我们也有多个从属节点。据我所知,与构建相关的晋升可以在几天后执行,但它始终在主节点上执行,其中包括归档的工件和相应的克隆。至少这样是有效的 :) - diidu
1
我对此有更深入的了解。我之前错误地认为推广总是在主分支上执行。实际上,它似乎是在构建机器上执行的。如果你想推广的不是最新版本,这当然会使事情变得更加复杂。不过只要确保在构建另一个版本之前不删除工作区,最新版本应该没问题。 - diidu

0

免责声明:我对Git一无所知。

在执行推广时,您永远不应该依赖于${WORKSPACE}下的文件。最好的情况是,它们可能比您正在执行的作业运行推广更新,而在最坏的情况下,当进行新的检出(或在您的情况下不存在)时,工作区可能为空。这就是为什么在您链接的讨论中,我使用了复制构件步骤。请注意,该步骤从存档构件中复制,而不是从作业工作区中复制,后者应始终被视为临时和短暂的。

如果您需要依赖于SCM检出来进行推广过程,则必须执行以下操作之一:

  • 执行命令行检出(它将不会被Jenkins跟踪),或者
  • 运行另一个带有SCM检出的作业(所有Jenkins跟踪的好处)。
在这两种情况下,我会假设您想要将SCM修订号传递给推广过程(用于命令行检出,或作为调用另一个作业的参数)。 "触发/调用构建"步骤有一个选项可以传递父SVN修订版本,但我不知道它是否具有相同的选项用于Git。在最坏的情况下,在您的“构建”作业执行中,将Git修订版存储到文件中,并将该文件与其余工件一起存档。在您的推广过程中,使用“复制工件”步骤检索保存的文件,然后从该文件中提取Git修订版。您可以使用EnvInject插件来帮助完成所有这些,并将提取的Git修订版作为环境变量提供给推广过程。
我的建议是在您的推广过程中添加第二个“触发/调用构建”步骤,以触发专门针对您所需内容的作业,并传递Git修订版参数。

1
谢谢回复。我确实在推广过程中使用了“复制工件”,并且已经通过$PROMOTED_GIT_COMMIT(和$PROMOTED_GIT_BRANCH)访问了git提交。所以我已经拥有了我需要的大部分内容,只是没有一个已经正确初始化的工作区 - 正如你所指出的那样,这是我的工作。我将尝试触发另一个(参数化)构建,以便我可以获得git scm插件执行其标准工作的好处,尽管它似乎对于这个任务来说有些繁重。谢谢! - scolestock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接