在 Jenkins SCM 管道中确定 运行 p4.run("sync") 之后的 perforce 更改列表编号

Determine perforce changelist number after running p4.run("sync") in Jenkins SCM pipeline

在 Jenkins 服务器上,安装了 Perforce 插件 (P4)。
在我的 Jenkins 服务器作业管道中(在 groovy-lang 中实现为 shared library),有一个管道阶段可以从 perforce 同步到 jenkins 工作区,如下所示:

p4.run("sync")

我想确定此操作的更改列表编号。我需要在管道的后期使用这个变更列表编号。

我想做如下:

p4.run("sync")
changelist_number = p4.run("changes -m1 #have")

这行得通吗?或者给我一个更好的解决方案。我对这个话题也很陌生。如果你能解释一下这一切是什么意思就太好了。

如果您 运行 处于标记模式,则更改列表编号(即与任何同步修订关联的最大更改列表编号)作为 p4 sync 输出的一部分返回:

C:\Perforce\test\merge>p4 changes ...
Change 226 on 2020/11/12 by Samwise@Samwise-dvcs-1509687817 'foo'
Change 202 on 2020/10/28 by Samwise@Samwise-dvcs-1509687817 'Populate //stream/test.'

C:\Perforce\test\merge>p4 -Ztag sync ...
... depotFile //stream/test/merge/foo.txt
... clientFile c:\Perforce\test\merge\foo.txt
... rev 2
... action updated
... fileSize 20
... totalFileSize 20
... totalFileCount 1
... change 226

标记的输出被转换为由 run 方法返回的字典,因此您应该可以这样做:

changelist_number = p4.run("sync")[0]["change"]

同步并获取更改列表编号作为单个操作。

这里有一些极端情况 -- 删除的文件不会同步,因此删除的修订不会计入该更改列表编号。

一个更稳妥的方法是本末倒置——获取当前的更改列表编号(从软件仓库中获取,不限于您客户端中的内容),然后同步到该确切编号。这样就保证了一致性;如果在这两个命令之间提交了新的更改列表,您存储的更改列表编号仍然与您同步到的编号相匹配。

changelist_number = p4.run("changes", "-m1", "-ssubmitted")[0]["change"]
p4.run("sync", "@{changelist_number}")

同步到该变更列表编号的任何其他客户端保证获得相同的修订集(受其 View 约束)。