Jenkins参数表/全局变量

时间:2018-07-25 09:00:27

标签: arrays powershell jenkins

我有一个Jenkins实例,该实例的工作严重受服务器偏见。我正在运行诸如停止和启动服务之类的任务,检查消息队列是否处于活动状态,将文件复制到特定位置等。我有一个表,该表由与每个服务器关联的各种值组成,例如名称,RSA密钥,家庭位置,进程控制等等。

作为一个示例,一个管道首先检查五个服务器是否处于活动状态,然后重新启动进程,然后运行性能测试。看起来像这样;

node {
   stage('check_servers'){
      build job: "Check Server", parameters: [string(name: 'Server', value: 'server1@example.com'), string(name: 'home_location', value: '/opt/bob/carolgees/bin'), string(name: 'process', value: 'big_process')]
      build job: "Check Server", parameters: [string(name: 'Server', value: 'server2@example.com'), string(name: 'home_location', value: '/opt/bob/carolgees/bin'), string(name: 'process', value: 'bigger_process')]
      build job: "Check Server", parameters: [string(name: 'Server', value: 'server3@example.com'), string(name: 'home_location', value: '/opt/bob/holness/bin'), string(name: 'process', value: 'small_process')]
      build job: "Check Server", parameters: [string(name: 'Server', value: 'server4@example.com'), string(name: 'home_location', value: '/opt/bob/hope/bin'), string(name: 'process', value: 'smaller_process')]
      build job: "Check Server", parameters: [string(name: 'Server', value: 'server5@example.com'), string(name: 'home_location', value: '/opt/no/bob/bin'), string(name: 'process', value: 'what_process')]
   }
}

但是,这变得非常困难,尤其是当我们努力工作并确定使工作更加灵活的额外价值时。我想做的就是将管道更改为;

node {
   stage('check_servers'){
      build job: "Check Server", parameters: [string(name: 'Server', value: 'server1@example.com')]
      build job: "Check Server", parameters: [string(name: 'Server', value: 'server2@example.com')]
      build job: "Check Server", parameters: [string(name: 'Server', value: 'server3@example.com')]
      build job: "Check Server", parameters: [string(name: 'Server', value: 'server4@example.com')]
      build job: "Check Server", parameters: [string(name: 'Server', value: 'server5@example.com')]
   }
}

然后使每个作业都能够访问查找表,并使用服务器名称来访问作业所需的其他值。

理想情况下,我希望能够使用脚本中的名称,例如;

echo $Server('server5@example.com').home_location

但是我不知道那是否是一回事。这些作业都是Powershell脚本,因此它必须是基于Powershell的解决方案。

我可以看到传入单个字符串参数的解决方案,其中包含定界的值列表,但这又不是很灵活(添加列时我需要更改每个作业)。

有人可以建议一种方法吗?

1 个答案:

答案 0 :(得分:0)

谢谢Vitalii,您的建议足以使我想起我在其他地方使用过的东西。我已经将一个名为ServerXmlContent的XML文件设置为配置文件,可以将其带入每个作业。在Powershell工作开始时,我有

[xml]$content = Get-Content - Path $env:ServerXmlContent

这将显示XML对象$ content中的所有详细信息。现在,我需要做的只是Select-Xml,以从通过管道传入的服务器中获取相关的服务器详细信息;

[string]$home_location = Select-Xml -Xml $content -XPath "//server[hostname='$env:server']/home_location/text()" 
[string]$process = Select-Xml -Xml $content -XPath "//server[hostname='$env:server']/process/text()"