Groovy 通过Masters';在所有Jenkins从机上运行远程命令;脚本控制台
我希望在所有UNIX从机上运行相同的shell命令(非常简单的shell命令,如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
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我结合了本博客中的许多内容,使它真正起作用。这里再举几个例子,添加用于实现这一点的任何代码都会很有用。