如何在 Perforce 和 Jenkins 中使用带有自定义视图映射的流

How to use streams with custom view mapping in with Perforce and Jenkins

我在 Jenkins 管道中使用 Perforce 运行ning。我用这个从 Perforce 结帐:

          checkout scm: [
                $class: 'PerforceScm', 
                credential: 'me', 
                populate: [
                    $class: 'AutoCleanImpl', 
                    delete: true, 
                    modtime: false, 
                    pin: '', 
                    quiet: true, 
                    replace: true
                ], 
                workspace: [
                    $class: 'ManualWorkspaceImpl', 
                    charset: 'utf8', 
                    name: 'jenkins-${NODE_NAME}-${JOB_NAME}', 
                    pinHost: false, 
                    spec: [
                      allwrite: true, 
                      clobber: false, 
                      compress: false, 
                      line: 'LOCAL', 
                      locked: false, 
                      modtime: false, 
                      rmdir: false, 
                      streamName: '',
                      view: '''//depot/main/... //jenkins-${NODE_NAME}-${JOB_NAME}/assets/...
                               -//depot/main/pre_ar_archive/... //jenkins-${NODE_NAME}-${JOB_NAME}/assets/pre_ar_archive/...
                               -//depot/main/tools/... //jenkins-${NODE_NAME}-${JOB_NAME}/assets/tools/...'''
                    ]
                ]
            ]

我使用自定义映射在特定文件夹中定位我需要的文件并排除我不需要的文件夹。

签出后,我的构建阶段将 运行 一个 python 脚本来处理资产。该脚本使用 p4python。完成后,它将提交。但是,当我提交时,出现此错误:

"No files to submit.\n Submit failed -- fix problems above then use 'p4 submit -c 1234'"

问题是这样的:

Perforce error - cannot submit from non-stream client

如果我 运行 p4 client,我可以看到我没有定义 Stream。如果我修改结帐以定义 'streamName',然后我发现它将使用本质上是

的默认视图

//depot/main/... //jenkins-${NODE_NAME}-${JOB_NAME}/...

因此我失去了映射。

有什么解决办法吗?

我能做的一件事就是使用 p4v 创建我需要的客户端,但这似乎迫使我只调用插件以其他方式执行的所有 perforce 命令。

我曾尝试使用 p4 客户端来映射它,但是当我这样做时,它也改变了视图。 p4 文档表明它将执行此操作(使用默认视图)。

我将假设 //depot/main 是一个流(尽管关于这个问题的很多东西如果它是一个流就没有意义,比如为什么你曾试图创建一个手动客户端如果您的主仓库是流仓库,请首先查看)。如果不是,那么这里会出现一些完全其他的问题,这与您的 Jenkins 客户端的线路有关,这些文件已检出在一些不相关的流中并且在您的客户端视图之外(这将指向 Jenkins 方面的一些错误配置,或者你脚本中的一个非常严重的错误,或者服务器上的一个错误触发器,等等)。


使用流,您可以构建一个流规范形式的视图,然后可以在多个客户端之间共享该视图。所以你的看法:

//depot/main/... //client/assets/...
-//depot/main/pre_ar_archive/... //client/assets/pre_ar_archive/...
-//depot/main/tools/... //client/assets/tools/...

应表示为如下所示的流:

Stream: //depot/main-jenkins
Parent: //depot/main
Type: virtual
Paths:
    share ...
    exclude pre_ar_archive/...
    exclude tools/...
Remapped:
    ... assets/...

然后你将像这样配置你的 Jenkins 客户端(我想;我对 Jenkins 配置一无所知):

            workspace: [
                $class: 'StreamWorkspaceImpl', 
                charset: 'utf8', 
                name: 'jenkins-${NODE_NAME}-${JOB_NAME}', 
                pinHost: false, 
                spec: [
                  allwrite: true, 
                  clobber: false, 
                  compress: false, 
                  line: 'LOCAL', 
                  locked: false, 
                  modtime: false, 
                  rmdir: false, 
                  streamName: '//depot/main-jenkins'
                ]
            ]

指定 //depot/main-jenkins 流会为您自动生成该流的视图。

好的,补充一下。这确实有效。工作区 class 需要 StreamWorkspaceImpl

           checkout scm: [
                $class: 'PerforceScm', 
                credential: 'me', 
                populate: [
                    $class: 'AutoCleanImpl', 
                    delete: true, 
                    modtime: false, 
                    pin: '', 
                    quiet: true, 
                    replace: true
                ], 
                workspace: [
                    $class: 'StreamWorkspaceImpl', 
                    charset: 'utf8', 
                    format: 'jenkins-${NODE_NAME}-${JOB_NAME}', 
                    pinHost: false, 
                    streamName: '//depot/main-jenkins-test'
                ]
            ]

Sam Stafford 上面列出的流规范有效。