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

时间:2018-04-24 23:24:26

标签: jenkins jenkins-plugins perforce

我使用Perforce在Jenkins管道中运行。我从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。完成后,它将提交。但是,当我提交时,我收到此错误:

"没有要提交的文件。\ n提交失败 - 修复上述问题然后使用' 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文档表明它将执行此操作(使用默认视图)。

2 个答案:

答案 0 :(得分:1)

我将假设//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流可为您提供该流的自动生成视图。

答案 1 :(得分:0)

好的补充一点。这确实有效。工作区类必须为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上面列出的流规范有效。