2

我有一个看起来像这样的 Jenkins 管道

stage 'build app'
build 'app-build'
stash 'app-stash'

stage 'build container'
unstash 'app-stash'
build 'container-build'

从我们的 Kubernetes 系统构建app-build和获取新节点。container-build

使用stash我想将工件从 转移app-buildcontainer-build.

但是,在运行此管道时,会发生以下错误:

[Pipeline] stash
Required context class hudson.FilePath is missing
Perhaps you forgot to surround the code with a step that provides this, such as: node
[Pipeline] End of Pipeline
org.jenkinsci.plugins.workflow.steps.MissingContextVariableException: Required context class hudson.FilePath is missing
    at org.jenkinsci.plugins.workflow.steps.StepDescriptor.checkContextAvailability(StepDescriptor.java:254)
    at org.jenkinsci.plugins.workflow.cps.DSL.invokeStep(DSL.java:179)

我不想node在我的管道中使用,因为我的节点上只有一个执行程序。是否可以在stash没有node指令的情况下使用?

4

2 回答 2

2

您可以使用 stash/unstash 在单个管道中的多个作业之间共享文件/数据。

node {
    stage ('HostJob')
     {
        build 'HostJob'
        dir('/var/lib/jenkins/jobs/Hostjob/workspace/') {
        sh 'pwd'
        stash includes: '**/build/fiblib-test', name: 'app' 
        }
     }

        stage ('TargetJob') {
            dir("/var/lib/jenkins/jobs/TargetJob/workspace/") {
            unstash 'app'
            build 'Targetjob'
        }
}

通过这种方式,您始终可以将文件/exe/数据从一个作业复制到另一个作业。管道插件中的此功能比 Artifact 更好,因为它仅在本地保存数据。构建后删除工件(有助于数据管理)。

没有节点就无法使用存储。:(

于 2017-05-09T12:06:31.600 回答
1

使用 build 您正在构建一个外部工作。但是,您不能使用“stash”将内容从一项工作复制到另一项工作。

您需要在“app-build”中存档工件并使用 aritfact 复制插件复制它们,或者您必须将内容从“app-build”移动到管道本身。这样做时,您将拥有存储所需的节点上下文。

顺便说一句:Unstash 需要一个节点上下文以及它想要将文件复制到某处。

于 2017-01-17T17:28:11.000 回答