如何获取jenkins管道插件作业的工作空间(WorkflowRun对象java API)

时间:2017-01-29 15:38:14

标签: java jenkins jenkins-plugins jenkins-pipeline jenkins-workflow

在java API中,我可以从Run.java对象访问工作空间路径: (直到今天,所有对象都是hudson.model.AbstractBuild的实例)

  1. hudson.model.AbstractBuild#getWorkspace()
  2. hudson.model.Run#getExecutor()。getCurrentWorkspace()
  3. 在Pipeline插件中,我没有访问工作区的权限,run对象是org.jenkinsci.plugins.workflow.job.WorkflowRun的实例,此对象不链接到任何工作区。

    此调用返回null:hudson.model.Run #getExecutor()。getCurrentWorkspace()

    我怎么能得到它?

    谢谢

2 个答案:

答案 0 :(得分:2)

花了一些时间来弄明白。 您可以通过以下方式从WorkflowRun访问工作区(工作流运行可以有多个工作区):

import org.jenkinsci.plugins.workflow.job.WorkflowRun
import org.jenkinsci.plugins.workflow.flow.FlowExecution;
import org.jenkinsci.plugins.workflow.graph.FlowGraphWalker;
import org.jenkinsci.plugins.workflow.graph.FlowNode;
import org.jenkinsci.plugins.workflow.graph.StepStartNode;
import org.jenkinsci.plugins.workflow.cps.nodes.StepStartNode;
import org.jenkinsci.plugins.workflow.actions.WorkspaceAction
...
...
b = item.getLastBuild()

if(b instanceof WorkflowRun) {
   exec = b.getExecution();
   if(exec == null)
      continue;
   FlowGraphWalker w = new FlowGraphWalker(exec);
   for (FlowNode n : w) {
      if (n instanceof StepStartNode) {
         action = n.getAction(WorkspaceAction);
         if(action) {
             String node = action.getNode().toString();
             String workspace = action.getPath().toString();
         }
      }
   }

}

您现在拥有节点和工作区。这将捕获由节点步骤获取的工作空间以及由ws步骤获取的工作空间。 您可能希望存储节点/工作区,因为您最常见的是在复杂的管道上获取其中的几个。

答案 1 :(得分:1)

你可以这样做:

node {
  withEnv(["WORKSPACE=${pwd()}"]) {
    echo WORKSPACE
  }
}

有关详细信息,请参阅this参考。