如何将不同节点上的Jenkins阶段同步到单个变更集?

如何将不同节点上的Jenkins阶段同步到单个变更集?,jenkins,perforce,Jenkins,Perforce,我有一个Jenkins管道,它在不同的奴隶身上运行两个作业,如下所示 node('node-1') { stage ('Checkout') { checkout scm } stage ('Build First Part') { < do some building > } } node('node-2') { stage ('Checkout') { checkout scm }

我有一个Jenkins管道,它在不同的奴隶身上运行两个作业,如下所示

node('node-1') {
    stage ('Checkout') {
        checkout scm
    }
    stage ('Build First Part') {
        < do some building >
    }
}
node('node-2') {
    stage ('Checkout') {
        checkout scm
    }     
    stage ('Build Second Part') {
        < do some more building >
    }
}
node('node-1'){
阶段(“签出”){
校验scm
}
阶段(“构建第一部分”){

}
}
节点('node-2'){
阶段(“签出”){
校验scm
}     
阶段(“构建第二部分”){
<多做些建筑>
}
}
节点2上的任务要求首先完成节点1上的任务

我注意到,如果在节点1上的任务运行时发生提交,则节点2上的签出将包含新的提交

我正在使用Perforce进行源代码管理


如何确保两个节点上的签出位于同一变更集中?

您可以在主节点(或其他任何位置)上进行签出并将其隐藏。
然后在每个节点上取消搁置它。它实际上比你想象的要快。

例如:

node() {
  stage ('Checkout') {
    checkout scm
    stash name: 'checkout'
  }
}

builders['builder1'] = {
  node('node-1'){
    stage('Build First Part') {
      cleanWs()
      unstash 'checkout'
      < do some building >
    }
  }
}
builders['builder2'] = {
  node('node-2'){
    stage('Build Second Part') {
      cleanWs()
      unstash 'checkout'
      < do some more building >
    }
  }
}
parallel builders
node(){
阶段(“签出”){
校验scm
隐藏名称:“签出”
}
}
建筑商['builder1']={
节点('node-1'){
阶段(“构建第一部分”){
cleanWs()
取消“结帐”

}
}
}
建筑商['builder2']={
节点('node-2'){
阶段(“构建第二部分”){
cleanWs()
取消“结帐”
<多做些建筑>
}
}
}
并行构建器

扩展@pitseekers answer您可以通过

在第一个生成节点上:

  • 将变更集保存到文件(p4_changelist.txt)
  • 保存保存的文件
然后在第二个生成节点上:

  • 打开文件
  • 从文件中将变更列表值读取到变量
  • 使用变更列表值签出存储库。这是perforce populate列表中的pin参数
管道步骤:

node('node-1') {
    stage ('Checkout') {
        checkout scm
    }
    stage ('Save changelist number') {
        writeFile file: 'p4_changelist.txt', text: "${env.P4_CHANGELIST}"
        stash includes: 'p4_changelist.txt', name: 'p4_changelist'
    }
    stage ('Build First Part') {
        < do some building >
    }
} 
node('node-2') {
    stage ('Checkout') {
        unstash 'p4_changelist'
        def changelist = readFile 'p4_changelist.txt'
        checkout perforce(
            credential: 'credential',
            populate: autoClean(
                delete: true,
                modtime: false,
                parallel: [
                    enable: false,
                    minbytes: '1024',
                    minfiles: '1',
                    threads: '4'
                ],
                // ****** Use the read changelist value here ******
                pin: changelist,
                quiet: true,
                replace: true,
                tidy: false
            ),
            workspace: manualSpec(
                charset: 'none',
                name: 'jenkins-${NODE_NAME}-${JOB_NAME}-${EXECUTOR_NUMBER}',
                pinHost: false,
                spec: clientSpec(
                    allwrite: false,
                    backup: false,
                    clobber: true,
                    compress: false,
                    line: 'LOCAL',
                    locked: false,
                    modtime: false,
                    rmdir: false,
                    serverID: '',
                    streamName: '',
                    type: 'WRITABLE',
                    view: ''
                )
            )
        )
    }      
    stage ('Build Second Part') {
        < do some more building >
    }
}
node('node-1'){
阶段(“签出”){
校验scm
}
阶段('保存变更列表编号'){
writeFile文件:“p4_changelist.txt”,文本:“${env.p4_changelist}”
隐藏内容包括:“p4\u changelist.txt”,名称:“p4\u changelist”
}
阶段(“构建第一部分”){

}
} 
节点('node-2'){
阶段(“签出”){
取消设置“p4\U变更列表”
def changelist=读取文件“p4_changelist.txt”
检验性能(
凭证:“凭证”,
填充:自动清洁(
删除:对,
莫德泰姆:错,
平行:[
启用:false,
minbytes:'1024',
minfiles:'1',
线程:“4”
],
//******在此处使用读取更改列表值******
pin:changelist,
安静:是的,
替换:正确,
蒂迪:错
),
工作空间:manualSpec(
字符集:“无”,
名称:'jenkins-${NODE\u name}-${JOB\u name}-${EXECUTOR\u NUMBER}',
主持人:错,
规格:clientSpec(
allwrite:错,
备份:false,
是的,
压缩:错,
行:'本地',
锁定:错误,
莫德泰姆:错,
rmdir:错,
服务器ID:“”,
流名称:“”,
类型:“可写”,
视图:“”
)
)
)
}      
阶段(“构建第二部分”){
<多做些建筑>
}
}

使用标签。阅读
p4 tag
@BryanPendleton如何指定要签出的标记?是否在两个节点上签出相同的源(相同的clientview)?@pitSeek是。