【问题标题】:Determine perforce changelist number after running p4.run("sync") in Jenkins SCM pipeline在 Jenkins SCM 管道中运行 p4.run("sync") 后确定 perforce 更改列表编号
【发布时间】:2021-02-25 13:14:12
【问题描述】:

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

p4.run("sync")

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

我的想法如下:

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

这行得通吗?或者给我一个更好的解决方案。我对这个话题也很陌生。如果您能解释这一切的含义,那就太好了。

【问题讨论】:

    标签: jenkins jenkins-pipeline perforce


    【解决方案1】:

    如果您在标记模式下运行,则更改列表编号(即与任何同步修订相关联的最大更改列表编号)将作为 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)。

    【讨论】:

    • 我忘了提到这段代码在Jenkins pipeline shared library 中运行,并且为 Perforce (Jenkins SCM 提供程序的 Perforce 客户端插件)安装了插件。所以它实际上是一个 groovy 脚本而不是 python。在这种情况下我该怎么做。
    • 我从 perforce 手册中找到了一个示例,p4 changes -m 1 -s submitted 在您的回答中,p4.run("changes", "-m1", "-ssubmitted") -m1 -ssubmitted 是不同的。是不是笔误?
    • 大多数 p4 CLI 标志可以分隔为两个 args 或混合在一起。 -m 1-m1 相同。我通常在代码示例中将它们混为一谈,因为这样更容易看出什么是什么。
    • 您能否在 p4groovy 的上下文中回答。 p4.run("changes", "-m1", "-ssubmitted") 的返回类型为 Map<String, Object>[]。如何从中提取变更列表编号?
    • 我无法访问 Groovy 环境,但您是否尝试过在该 Map 对象上执行 .get("change")
    猜你喜欢
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 2023-03-26
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多