You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins声明式流水线多阶段目录及跨阶段文件访问咨询

让我来帮你理清这两个Jenkins声明式流水线的问题,都是实际使用中很常见的场景:

问题1:Jenkins声明式流水线的各个阶段是否使用不同文件夹?

答案是不一定,这完全取决于你的agent配置:

  • 如果整个流水线在顶层配置了同一个agent(比如agent any或者指定具体节点标签),且没有在阶段层级覆盖agent设置,那么所有阶段都会共享同一个工作目录(通常是任务对应的myjob文件夹)。
  • 但如果你的流水线为每个阶段单独配置了agent(比如每个stage块里都写agent { ... }),或者使用了reuseNode: false参数,Jenkins会为每个阶段创建独立的工作空间,这时候就会出现myjob@2、myjob@3这类带后缀的文件夹,甚至临时目录@tmp。这么做是为了隔离不同阶段的文件操作,避免互相干扰。
问题2:如何在同一条流水线的不同阶段间访问或复制生成的jar文件?

针对你遇到的工作目录不一致的问题,这里有几个实用的解决方案,按推荐程度排序:

1. 复用同一个节点的工作空间(最简单高效)

如果你的流水线不需要在不同节点上运行各个阶段,最直接的方法是让所有阶段复用同一个工作空间。你可以在流水线顶层的agent配置中加上reuseNode: true,或者在阶段级agent配置里指定复用:

pipeline {
    agent {
        node {
            label 'your-node-label' // 替换成你的Jenkins节点标签
            reuseNode true
        }
    }
    stages {
        stage('Build Jar') {
            steps {
                sh 'mvn clean package' // 你的构建生成jar的命令
            }
        }
        stage('Package with Jar') {
            steps {
                // 直接访问同一工作目录下的jar文件
                sh 'cp target/your-app.jar ./package-directory/'
            }
        }
    }
}

这样所有阶段都会在myjob目录下运行,生成的jar文件可以直接被后续阶段读取。

2. 使用stash和unstash跨阶段/跨节点共享文件(跨节点场景首选)

如果你的流水线需要在不同节点上执行不同阶段(比如构建在编译节点,打包在部署节点),Jenkins内置的stash和unstash步骤是跨阶段传递文件的标准方式:

pipeline {
    agent none // 顶层不指定agent,每个阶段自行配置
    stages {
        stage('Build Jar') {
            agent { label 'build-node' }
            steps {
                sh 'mvn clean package'
                // 将生成的jar文件保存到Jenkins服务器,指定一个唯一标识名
                stash name: 'built-jar', includes: 'target/your-app.jar'
            }
        }
        stage('Package with Jar') {
            agent { label 'package-node' }
            steps {
                // 取出之前保存的jar文件,会自动放到当前工作目录对应路径下
                unstash 'built-jar'
                // 现在就可以正常使用这个jar文件了
                sh 'cp target/your-app.jar ./package-directory/'
            }
        }
    }
}

注意:stash会将文件压缩存储,适合小到中等大小的文件;如果你的jar文件特别大,建议用下面的工件归档方式。

3. 使用工件归档(适合长期保存+跨流水线访问)

如果不仅需要同流水线内访问,还希望后续能下载产物或被其他流水线复用,可以用archiveArtifacts归档,再配合copyArtifacts插件(需要先在Jenkins插件市场安装)来复制:

pipeline {
    agent none
    stages {
        stage('Build Jar') {
            agent { label 'build-node' }
            steps {
                sh 'mvn clean package'
                // 归档jar文件,开启指纹功能以便追踪
                archiveArtifacts artifacts: 'target/your-app.jar', fingerprint: true
            }
        }
        stage('Package with Jar') {
            agent { label 'package-node' }
            steps {
                // 从当前流水线的最新成功构建中复制jar文件
                copyArtifacts projectName: env.JOB_NAME, selector: lastSuccessful(), filter: 'target/your-app.jar'
                sh 'cp target/your-app.jar ./package-directory/'
            }
        }
    }
}

这种方式适合大文件或需要长期保留的产物,但配置稍复杂,需要依赖插件。

4. 直接使用绝对路径(不推荐)

如果所有阶段都在同一个节点上运行,你也可以直接写jar文件的绝对路径来访问,但这种方式非常不灵活——一旦节点的工作目录路径变化,流水线就会失效,所以不建议使用:

stage('Package with Jar') {
    steps {
        sh 'cp /var/lib/jenkins/workspace/myjob/target/your-app.jar ./package-directory/'
    }
}

内容的提问来源于stack exchange,提问作者Ebeid ElSayed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:16:38