我有一个看起来像这样的Jenkins管道
stage 'build app'
build 'app-build'
stash 'app-stash'
stage 'build container'
unstash 'app-stash'
build 'container-build'
构建app-build
和container-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
?
答案 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,因为它仅在本地保存数据。构建后删除工件(有助于数据管理)。
无法使用没有节点的存储。 :(