Groovy 通过Masters';在所有Jenkins从机上运行远程命令;脚本控制台

Groovy 通过Masters';在所有Jenkins从机上运行远程命令;脚本控制台,groovy,jenkins,Groovy,Jenkins,我希望在所有UNIX从机上运行相同的shell命令(非常简单的shell命令,如ls) 它们通过使用主机的脚本控制台连接到主机 如何使用groovy实现这一点 想做这样的事情: 但是我不想显示信息,我还想在每个从机上运行一些简单的UNIX命令并打印结果。非常旧的线程 import hudson.util.RemotingDiagnostics; print_ip = 'println InetAddress.localHost.hostAddress'; print_hostname = 'p

我希望在所有UNIX从机上运行相同的shell命令(非常简单的shell命令,如
ls
) 它们通过使用主机的脚本控制台连接到主机

如何使用groovy实现这一点

想做这样的事情: 但是我不想显示信息,我还想在每个从机上运行一些简单的UNIX命令并打印结果。

非常旧的线程

import hudson.util.RemotingDiagnostics;

print_ip = 'println InetAddress.localHost.hostAddress';
print_hostname = 'println InetAddress.localHost.canonicalHostName';

// here it is - the shell command, uname as example 
uname = 'def proc = "uname -a".execute(); proc.waitFor(); println proc.in.text';

for (slave in hudson.model.Hudson.instance.slaves) {
    println slave.name;
    println RemotingDiagnostics.executeGroovy(print_ip, slave.getChannel());
    println RemotingDiagnostics.executeGroovy(print_hostname, slave.getChannel());
    println RemotingDiagnostics.executeGroovy(uname, slave.getChannel());
}
我用另一种方法处理了同样的情况。我有一个正在进行下一阶段的管道作业: -首先,它检查在线代理(因为它们是物理机器,所以它可能恰好处于关闭状态),使用类似以下内容:for“(hudson.model.hudson.instance.slaves中的slave) -下一步是使用DSL插件为每个找到的代理创建作业,并列出每个代理的列表。
除了为每个在线代理创建作业外,它还创建了一个将并行运行所有这些作业的作业。当然,新创建的作业包含我希望在代理上运行的命令。当我运行管道时,在所有代理上运行相同的脚本/命令,并将输出返回到主管道作业。

直到最后,我不使用*搜索代理,而是读取和解析它们的名称。例如,如果我想在每个名为LINUX的代理上运行作业,我将执行以下操作:

for (aSlave in hudson.model.Hudson.instance.slaves)
{
   /* take into account just agents with LINUX in name*/
   AGENT_NAME = aSlave.name
   if ( AGENT_NAME.contains('LINUX') )
   {
      /* you can check also if the agent is online or other attributes */

      /* Add agent name as label of the agent */ 
      AGENT_LABELS = aSlave.getLabelString() + " " + AGENT_NAME
      aSlave.setLabelString(AGENT_LABELS)


      /* For each found agent, create a job that will run on it */
      job('My_job_name_' + AGENT_NAME)
      {
          label(AGENT_NAME)
          steps {
               /* Do whatever you want here. 
                  This job will run just on this specific agent (due to label set) */
           }
      } 
   } /* end if */
} /* end for */  

/* If you want to run all jobs in parallel (every job on a specific agent), you can save all found agents in a list and then create one more pipeline job that will contain next line :

   ' parallel {
      b0: {build 'My_job_name_' + AGENT_NAME_LIST[0]},
      b1: {build 'My_job_name_' + AGENT_NAME_LIST[1]},
      ....
    }
    fastfail: false '



管道看起来像这样:

stages  {
      stage('Checkout repo') {
         steps  {
            //checkout what I need
         }
      }
      stage('Generate Jobs')  {
         steps  {
            jobDsl targets:'generate_projects.groovy',
         }
      }
      stage('Build Projects')  {
         steps  {
            build job: "build-all",
            propagate: true,
            wait: true
         }
      }
   }
然后是文件generate_projects.groovy,其中实际的DSL生成是:

for (agent in hudson.model.Hudson.instance.slaves) {
   if (!agent.getComputer().isOffline())  { // check that agent is not offline
      node = jenkins.model.Jenkins.instance.getNode(agent.name)  // get agent name
      agentIPs = node.computer.getChannel().call(new ListPossibleNames())
      agentIP = agentIPs[0]  // get agent IP
      
      //Create a job that will run on that specific agent
      jobName = FOLDER + '/<Job_name>' + agent.name     // need to create different names
      job(jobName)
      {
         label(agent.name)
         steps
         {
             shell(<shell script or commands that you want to run>)
         }
      }
   }
}
for(hudson.model.hudson.instance.slaves中的代理){
如果(!agent.getComputer().isOffline()){//请检查代理是否处于脱机状态
node=jenkins.model.jenkins.instance.getNode(agent.name)//获取代理名称
agentIPs=node.computer.getChannel().call(新的ListPossibleNames())
agentIP=agentIPs[0]//获取代理IP
//创建将在该特定代理上运行的作业
jobName=文件夹+'/'+agent.name//需要创建不同的名称
作业(作业名称)
{
标签(代理名称)
台阶
{
shell()
}
}
}
}
除了上面生成的作业之外,您还需要保留已生成作业的列表,并将其所有元素添加到“build all”管道作业中,该作业看起来类似于:

parallel(
   b0: {build '<Job_name>' + agent.name'},
   b1: {build '<Job_name>' + agent.name'},
   b2: {build '<Job_name>' + agent.name'},
   .....
)
failFast: false
并行(
b0:{build'+agent.name'},
b1:{build'+agent.name'},
b2:{build'+agent.name'},
.....
)
failFast:错误

因此,当您运行管道时,将为每个代理创建一个作业,并且所有新创建的作业将并行运行。我使用它来更新安装方案。

为什么需要它?它看起来更像是一个配器角色,就像木偶和盐一样。是的,我正在寻找木偶在詹金斯身上所做的事情。把詹金斯和rundeck甚至木偶一起使用怎么样?你想解决什么问题?以这种方式使用jenkins对我来说似乎不实际,似乎是误用,你认为呢?实际上,我的主要原因是想看看通过groovy系统脚本是否可以做到这一点。我几乎可以肯定这是可以这样做的(虽然可能是一个误用)。也许我应该考虑使用木偶实验室或厨师软件插件。我尝试了这个,它对一些命令有效,但是任何带有*的命令似乎都无法执行。有什么想法吗?我试着逃避它,但那只是得到了一个错误。@Timmynline我结合了本博客中的许多内容,使它真正起作用。这里再举几个例子,添加用于实现这一点的任何代码都会很有用。