Jenkins jobs.scripts.WorkflowScript中有哪些方法

时间:2017-12-08 16:20:12

标签: jenkins groovy jenkins-pipeline

我在詹金斯有一个多分支管道项目。 我使用我的Jenkinsfile作为种子作业,创建要执行的作业和脚本。

其中一个作业需要在从站上运行,我需要在从站上执行此作业的文件操作。 File操作是使用FilePath类实现的。我现在需要的只是构建我的FilePath的渠道。

如何从WorkflowScript中获取频道?我在哪里可以找到WorkflowScript的API参考。

我已经发现的是我通过此代码获取所有实例频道

 println Jenkins.instance.slaves
 for(def slave : Jenkins.instance.slaves){
     println slave.channel        
 }

但是如何找出我的脚本在哪个实例中运行?

有什么建议吗?指向API的指针或我的问题的一些解决方法。

谢谢

1 个答案:

答案 0 :(得分:0)

这是我提出的(糟糕的)解决方案。

我自己写了一个Util类来获取我用于工作的标签的频道。

import jenkins.model.Jenkins
import hudson.FilePath
import hudson.remoting.Channel    
/**
 * returns the channel of the given label, might be null 
 * 
 * realy bad solution why: when multiple JenkinsSlaves have the same label, this will probably not work anymore, 
 * because the channel of the first node is returned
 * For empty labels it does not work either
 * @param jenkins the jenkins instance
 * @param label the associated label for the running node, not empty, not null
 * @return a channel of a Node associated with given label, might be null 
 */
@com.cloudbees.groovy.cps.NonCPS
public static Channel getChannel(Jenkins jenkins, String label) {
    assert jenkins !=null : 'JenkinsUtil.getChannel() does not work for null Jenkins'
    assert label!=null : 'JenkinsUtil.getChannel() does not work for null Labels'
    assert !label.isEmpty() : 'JenkinsUtil.getChannel() does not work for empty Labels' 
    Set<Node> nodes = jenkins.getLabel(label).getNodes()
    assert nodes.size() < 2 : 'JenkinsUtil.getChannel() might not work correctly for Label which are associated with multiple nodes. Fix Me!'
    assert nodes.size() > 0 : "JenkinsUtil.getChannel(): No node found for Label ${label}"
    return nodes[0].getChannel()
}

通过此频道,我现在可以在远程计算机上创建文件。

FilePath remoteWorkspace = new FilePath(JenkinsUtil.getChannel(Jenkins.instance,LABEL_STRING), env.WORKSPACE)
FilePath webserverConfiguration = new FilePath( remoteWorkspace, 'webserver.conf')
webserverConfiguration.write('someText', null)

为什么我这样做:'build'变量在WorkkflowScript中不可用。