Jenkins 如何跨阶段重用先前创建的工作区

Jenkins 如何跨阶段重用先前创建的工作区,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,我面临一个问题,在我的管道中定义了两个阶段,它们都在同一个节点上运行,需要在同一个工作区中运行 这些阶段中的第一个阶段最初在我的主节点上运行,但在定义的步骤即将结束时,必须将一些文件解压缩到另一个节点上 然后,第二阶段只需要在我的主程序上继续,并且依赖于从第一阶段安装的一些模块 以下是我要更好地解释的管道: #!棒极了 管道{ 代理{label'master'} 舞台{ stage('Build'){//1.在/var/lib/jenkins/workspace/_Pipelines\u IAC

我面临一个问题,在我的管道中定义了两个阶段,它们都在同一个节点上运行,需要在同一个工作区中运行

这些阶段中的第一个阶段最初在我的主节点上运行,但在定义的步骤即将结束时,必须将一些文件解压缩到另一个节点上

然后,第二阶段只需要在我的主程序上继续,并且依赖于从第一阶段安装的一些模块

以下是我要更好地解释的管道:

#!棒极了
管道{
代理{label'master'}
舞台{
stage('Build'){//1.在/var/lib/jenkins/workspace/_Pipelines\u IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ中运行
台阶{
“嘘”
npm安装
凉亭安装
吞咽集暂存节点环境
吞咽准备暂存文件
狼吞虎咽的网页包
'''
隐藏内容包括:“dist/**”,名称:“builtSources”
隐藏内容包括:'config/***',名称:'appConfig'
节点(“量角器”){//2.在/var/jenkins/workspace/_Pipelines\u IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ中的vncentos7上运行
目录(“/opt/foo/deploy/”){
取消“建筑资源”
取消设置“appConfig”
}
}        
}
}
阶段(“单元测试”){
代理{label'master'}//3.在/var/lib/jenkins/workspace/\u Pipelines\u IACT-Jenkinsfile中的master上运行-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ@2
台阶{
平行的(
“茉莉花”:{
sh“吞咽业力测试ci”
},
“摩卡”:{
sh“大口摩卡测试”
}
)
}
}
}
}
如您所见,我在每个stage\node的开始处添加了注释,用于显示我看到的分配工作空间的jenkins输出

我面临的问题是,单元测试阶段失败了,因为它试图使用一些找不到的节点模块。这些都存在于创建的第一个工作区中,这是我希望此阶段继续使用的工作区,因此不要使用新的“@2”后缀工作区

有没有办法告诉Jenkins在管道中保留以前创建的工作区

编辑

我猜,因为我在下一个阶段再次指定了代理
{label:'master'}
,这就是要创建新工作区的情况?我应该改用
节点
方法吗?这会允许使用相同的工作区吗

实际上,我已经尝试在单元测试阶段的每个并行步骤周围使用
node('master'){…}
,但是这些仍然使用@2后缀工作区,而不是原始工作区

我看到其他线程讨论了如何避免重复使用同一个工作区,因为您可能会遇到文件锁问题。他们建议在步骤之间归档\n取消归档工作区

我还看到过一些方法,可以将工作区路径存储在变量中,稍后再使用,这对我的情况来说很好,但我没有找到任何声明性语法示例,只有groovy示例

编辑2

我现在尝试了几种方法,包括将分配的工作区从第一阶段保存到变量中,并在后面的阶段在
ws(…)
指令中使用:

管道{
代理{label'master'}
舞台{
阶段(‘构建’){
台阶{
剧本{
def workspace=pwd()
}
“嘘”
npm安装
凉亭安装
吞咽集暂存节点环境
吞咽准备暂存文件
狼吞虎咽的网页包
'''
隐藏内容包括:“dist/**”,名称:“builtSources”
隐藏内容包括:'config/***',名称:'appConfig'
节点(‘量角器’){
目录(“/opt/foo/deploy/”){
取消“建筑资源”
取消设置“appConfig”
}
}        
}
}
阶段(“单元测试”){
台阶{
平行的(
“茉莉花”:{
节点(“主节点”){
ws(“${workspace}”){
sh“吞咽业力测试ci”
}
}
},
“摩卡”:{
节点(“主节点”){
ws(“${workspace}”){
sh“大口摩卡测试”
}
}
}
)
}
职位{
成功{
sh“吞咽联合收割机覆盖报告”
sh“大口喝干净的lcov”
publishHTML(目标:[
allowMissing:false,
alwaysLinkToLastBuild:false,
基帕尔:错,
reportDir:'测试/覆盖',
报告文件:“index.html”,
reportName:“测试覆盖率报告”
])
}
}
}
}
}
我确实尝试过从单元测试阶段删除第二个代理声明,但该阶段仍然保留在我的量角器节点上,这是我不希望它做的。按照这里的答案\注释,我在每个并行步骤周围使用了节点块,并使用了ws块,如您所见

该阶段失败了,我从日志中可以看出,它没有使用从第一阶段分配的工作区(没有@后缀):


它甚至可以用@2作为双后缀,所以我不确定它现在在做什么。

使用节点语法可以解决这个问题


为了确定,我将使用dir作用域自行设置工作区

指定自定义工作区。 从管道语法:“ws:Allocate workspace”


。这是否有效?

不确定它是否适合您的用例,但此示例脚本显示了如何在不同的阶段和容器之间共享相同的节点/工作区:

此外,如果您正在为特定阶段运行Docker代理,同时在顶层指定代理{label'whatever'},则可以确保此阶段将使用与其余阶段相同的节点和工作区
[Jasmine] Running on master in /var/lib/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ@2
[Pipeline] [Jasmine] {
[Pipeline] [Jasmine] ws
[Jasmine] Running in /var/lib/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ@2@2
[Pipeline] [Jasmine] {
[Pipeline] [Jasmine] sh
[Jasmine] [_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ@2@2] Running shell script
[Jasmine] + gulp karma-tests-ci
[Jasmine] [08:27:01] No gulpfile found
ws("/usr/local/jenkins/jobs/custom_workspace") {
    stage . . . 
    stage . . . 
}
pipeline {
  agent {
    label 'whatever'
  }
  stages {
    stage('build') {
      steps {
        sh "./build-artifact.sh"
      }
    }
    stage('test in docker') {
      agent {
        docker {
          image 'ubuntu:16.04'
          reuseNode true
        }
      }
      steps {
        sh "./run-tests-in-docker.sh"
      }
    }
  }
}
// Basic usage:

def extWorkspace = exwsAllocate diskPoolId: 'diskpool1'
node ('linux') {
    exws (extWorkspace) {
        scm checkout
        sh 'mvn clean install -DskipTests'
    }
}
node ('test') {
    exws (extWorkspace) {
        sh 'mvn test'
    }
}
pipeline {
    agent none
    environment {
        WIN_WORKSPACE = ""
        MAC_WORKSPACE = ""
    }
    stages {
        stage("Build") {
            parallel {
                stage("Build on Windows") {
                    agent {
                        label "windows"
                    }
                    steps {
                        script {
                            WIN_WORKSPACE = WORKSPACE
                        }
                        // steps...
                    }
                }
                stage("Build on macOS") {
                    agent {
                        label "macos"
                    }
                    steps {
                        script {
                            MAC_WORKSPACE = WORKSPACE
                        }
                        // steps...
                    }
                }
            }
        }
        stage("Deploy") {
            parallel {
                stage("Deploy on Windows") {
                    agent {
                        label "windows"
                    }
                    steps {
                        dir(WIN_WORKSPACE) {
                            // steps...
                        }
                    }
                }
                stage("Deploy on macOS") {
                    agent {
                        label "macos"
                    }
                    steps {
                        dir(MAC_WORKSPACE) {
                            // steps...
                        }
                    }
                }
            }
        }
    }
}
#!groovy
pipeline {
  agent { label 'master' }
  stages {
    stage('Build') { // 1. Running on master in /var/lib/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ
      steps {
        sh '''
          npm install
          bower install
          gulp set-staging-node-env
          gulp prepare-staging-files
          gulp webpack
        '''
        stash includes: 'dist/**/*', name: 'builtSources'
        stash includes: 'config/**/*', name: 'appConfig'
        node('Protractor') { // 2. Running on vnccentos7 in /var/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ
          dir('/opt/foo/deploy/') {
            unstash 'builtSources'
            unstash 'appConfig'
          }
        }        
      }
    }
    stage('Unit Tests') { // 3. Running on master in /var/lib/jenkins/workspace/_Pipelines_IACT-Jenkinsfile-UL3RGRZZQD3LOPY2FUEKN5XCY4ZZ6AGJVM24PLTO3OPL54KTJCEQ@2
        parallel {
            stage("Unit Tests@") {
                agent {label 'master'}
                stages {
                    stage("Jasmine") {
                        steps {
                            sh 'gulp karma-tests-ci'
                        }
                    }
                    stage(Mocha") {
                        steps {
                            sh 'gulp mocha-tests'
                        }
                    }
                }
            }
        }
    }
  }
}
pipeline {
    agent none // <- the difference is here
    stages {
        stage('prep') {
            agent { docker { image 'yourdockerimage' }}
            steps {
                sh 'pwd' // same workspace, without @2
            }
        }
        stage('build') {
            agent { label 'master' }
            steps {
                sh 'pwd' // same workspace, without @2
            }
        }
    }
}
pipeline {
    agent { label 'master' } // <- specify the global agent
    stages {
        stage('prep') {
            agent { docker { image 'yourdockerimage' }} // <- do not ask to reuse the node/workspace
            steps {
                sh 'pwd' // different workspace, with @2 appended
            }
        }
        stage('build') {
            // no agent specified, use global agent
            steps {
                sh 'pwd' // same workspace, without @2
            }
        }
        stage('publish') {
            agent { docker { image 'yourdockerimage' reuseNode true }}
            steps {
                sh 'echo "published"' // same workspace, without @2
            }
        }
    }
}