Jenkins P4 插件:p4sync 无法同步 Unicode 文件

Jenkins P4 Plugin: p4sync failing to sync Unicode files

我在 Jenkins 构建系统中使用 p4sync 时遇到问题。

具体来说,我们的 P4 服务器支持 unicode。这一切都很好,当我在我的 Jenkinsfile 中调用 p4sync 时,我确保指定该服务器实际上是一个 utf8(UTF-8 无 BOM)服务器。但是,当我实际同步时,在同步仓库中标记为类型 unicode 的文件时,同步似乎出现故障,导致同步(和构建)失败并显示极其无用的错误消息 ERROR: P4: Task Exception: com.perforce.p4java.exception.P4JavaException: com.perforce.p4java.exception.P4JavaException: hudson.AbortException: P4JAVA: Error(s): Unknown client error. This仅当通过 Jenkins p4plugin 同步时才会出现问题;通过 p4 CLI 或 P4V 同步时,我无法复制此行为。

我可以手动进入软件仓库并将文件类型从 unicode 更改为 utf8,这似乎可以解决问题,但我不想在每当它出现时,或者每当有人碰巧提交了一个编码错误的启用 unicode 的文件时,就进行软件仓库。

从这里尝试 运行 test.Sync 和 test.StreamingSync 测试: https://swarm.workshop.perforce.com/files/guest/joel_brown/p4java/JenkinsOps

有关说明,请参阅自述文件。 set/export P4CHARSET=utf8 之前。

希望能给出一个 better/meaningful 例外。

更新了一堆东西之后(Perforce Server [v2015=>v2021]、Jenkins [v?=> v2.303.3]、Jenkins P4 插件 [v?=>v1.11.6]、Java [JRE-8.?=> JDK-11.0.12]),我们遇到了完全相同的问题。似乎有一些 Unicode 文件同步成功,但很多没有(我们找到的工作示例是在服务器更新后提交的)。作业配置为使用 utf8 字符集。

我们 运行 在同步失败后在 Jenkins 工作区上进行 JenkinsOps 测试。如果我们将 P4CHARSET 环境变量设置为 utf8,则此操作没有错误。当我们没有设置变量或将其设置为 winansi 时,这不起作用,我们会收到包含“未知客户端错误”字符串的复杂错误消息。 P4 和 P4V 具有基本相同的行为。 P4/P4V 在 winansi 模式下 returns 错误消息“T运行 文件内容的转换在第 1 行文件 C:\workspace\SomeExample.txt 附近失败”。同样,如果 utf8 模式处于活动状态,JenkinsOps 和 p4/p4v 一切正常。 总而言之,在我看来 Jenkins 作业不应用 utf8 字符集,尽管它是在作业参数中设置的。

解决方法是

设置 P4CHARSET=utf8

在启动 Jenkins 进程之前。

我们最终解决这个问题的方法是手动将库中所有标记为 unicode 的文件转换为 utf8,然后设置一个 Perforce 提交触发器以禁止提交包含标记为 unicode。因此,软件仓库永远不会处于 p4sync 步骤失败的状态。