在没有节点的Jenkins管道中使用存储

时间:2016-11-15 10:26:34

标签: jenkins jenkins-pipeline jenkins-slave

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

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

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

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

使用stash我想将工件从app-build转移到container-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

2 个答案:

答案 0 :(得分:1)

使用构建您正在构建外部作业。 但是,您无法使用“存储”将事物从一个作业复制到另一个作业。

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

Btw。:Unstash需要一个节点上下文,并且想要在某处复制文件。

答案 1 :(得分:1)

您可以使用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 / data从一个作业复制到另一个作业。管道插件中的此功能优于Artifact,因为它仅在本地保存数据。构建后删除工件(有助于数据管理)。

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